Я создаю кластер с моим php-fprm, скомпилированным из исходного изображения и официального изображения nginx, но когда я пытаюсь запустить файл phpinfo (), nginx возвращает ошибку ниже:
*5 connect() failed (111: Connection refused) while connecting to upstream, client: 172.18.0.1, server: localhost, request: "GET /phpinfo.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "127.0.0.1:8000"
Файл docker-compose.yml:
version: '2'
services:
php:
restart: always
build: data/php
image: php:7.1
ports:
- "9000:9000"expose:
- 9000
volumes:
- ./app:/usr/share/nginx/html
web:
restart: always
build: data/nginx
image: nginx:1.10.2
ports:
- "8000:80"links:
- php
volumes:
- ./data/nginx/vhost.conf:/etc/nginx/conf.d/default.conf
- ./data/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./app:/usr/share/nginx/html
- ./data/log/nginx:/var/log/nginx
Я проверил 9000 порт в моем хосте и netstat -an | grep :9000
Команда и порт живы:
tcp6 0 0 :::9000 :::* OUÇA
Для получения более подробной информации смотрите файлы в этом репозитории github (с Dockerfile для этих изображений):
Nginx и PHP работают в двух разных контейнерах, поэтому PHP не работает на localhost (с точки зрения Nginx).
Поскольку ваш контейнер PHP называется «php», вы не хотите подключаться к этому:
fastcgi://127.0.0.1:9000
Вы бы хотели, чтобы Nginx подключился к этому:
fastcgi://php:9000
Глядя на ваш репо на Github, я считаю, что вам нужно изменить fastcgi_pass
в data / nginx / vhost.conf к этому:
fastcgi_pass phpserver;
И добавьте вверх по течению, чтобы соответствовать. Апстрим в Nginx — это способ определения другого сервера, на который вы указываете. Вы бы положили это вне из server {}
блок, а не внутри.
upstream phpserver {
server php:9000
}
Что это делает, так это определяет вышестоящий сервер в Nginx с именем phpserver
, Это указывает на имя хоста php
на порт 9000. Потому что ваш контейнер PHP называется php
в Docker это имя хоста, которое вы можете использовать для связи с ним (в сети моста Docker).
Тогда мы говорим fastcgi_pass
он должен использовать вышестоящий сервер под названием phpserver
,
Если вам не нужно самостоятельно подключиться к fastcgi / PHP из вне Docker, вам не нужно ports
Конфиг на контейнере PHP. Вам нужно только expose
для того, чтобы nginx мог общаться с php внутри.
Недавно я заметил, что иногда людям нужно специально создавать сеть Docker, чтобы такой сценарий работал. Я не уверен, почему это так, но вот как вы это сделаете.
Сначала создайте сеть. Выберите любое имя, которое вы хотите, я буду использовать myapp
в приведенном ниже примере.
docker create network myapp
Теперь вы должны увидеть эту новую сеть в docker network ls
:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
c39b88eb8450 bridge bridge local
175efb89adef docker_default bridge local
b34434cc8b1c myapp bridge local
Далее скажите docker-compose использовать эту сеть. Добавьте этот блок в конец вашего файла docker-compose.yml. Он находится на верхнем уровне YAML, то есть должен начинаться с левого поля, а не с отступом.
networks:
default:
external:
name: myapp
После этого вы захотите остановить свои контейнеры и перезапустить, чтобы они приняли изменения. Вам не нужно делать пересборку, чтобы изменить конфигурацию сети.
Других решений пока нет …