Отказ в соединении Docker между контейнерами Nginx и PHP

Я создаю кластер с моим 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 для этих изображений):

https://github.com/mayconfsbrito/docker

2

Решение

Каждый контейнер имеет свой локальный хост

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,

«порты» нужны только для открытия порта за пределами Docker

Если вам не нужно самостоятельно подключиться к fastcgi / PHP из вне Docker, вам не нужно ports Конфиг на контейнере PHP. Вам нужно только expose для того, чтобы nginx мог общаться с php внутри.

Возможно, вам нужно определить сеть Docker

Недавно я заметил, что иногда людям нужно специально создавать сеть 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

После этого вы захотите остановить свои контейнеры и перезапустить, чтобы они приняли изменения. Вам не нужно делать пересборку, чтобы изменить конфигурацию сети.

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]