Недавно я начал переходить на сетевые функции Docker 1.9 и Docker-Compose 1.5, чтобы заменить использование ссылок.
Пока со ссылками не было проблем с подключением nginx к моему серверу php5-fpm fastcgi, расположенному на другом сервере в одной группе, через docker-compose. Однако недавно, когда я запускаю docker-compose --x-networking up
свои php-fpm, контейнеры mongo и nginx загружаются, однако nginx сразу закрывается с[emerg] 1#1: host not found in upstream "waapi_php_1" in /etc/nginx/conf.d/default.conf:16
Однако, если я снова запускаю команду docker-compose во время работы контейнеров php и mongo (nginx завершен), nginx запускается и с этого момента работает нормально.
Это мой docker-compose.yml
файл:
nginx:
image: nginx
ports:
- "42080:80"
volumes:
- ./config/docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
php:
build: config/docker/php
ports:
- "42022:22"
volumes:
- .:/var/www/html
env_file: config/docker/php/.env.development
mongo:
image: mongo
ports:
- "42017:27017"
volumes:
- /var/mongodata/wa-api:/data/db
command: --smallfiles
Это мой default.conf
вариант для nginx:
server {
listen 80;
root /var/www/test;
error_log /dev/stdout debug;
access_log /dev/stdout;
location / {
# try to serve file directly, fallback to app.php
try_files $uri /index.php$is_args$args;
}
location ~ ^/.+\.php(/|$) {
# Referencing the php service host (Docker)
fastcgi_pass waapi_php_1:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
# We must reference the document_root of the external server ourselves here.
fastcgi_param SCRIPT_FILENAME /var/www/html/public$fastcgi_script_name;
fastcgi_param HTTPS off;
}
}
Как заставить nginx работать только с одним вызовом docker-compose?
источник
Ответы:
Существует возможность использовать "volume_from" в качестве обходного пути, пока не будет введена функция depends_on (обсуждается ниже). Все, что вам нужно сделать, это изменить файл docker-compose, как показано ниже:
Одно большое предостережение в вышеупомянутом подходе заключается в том, что объемы php доступны для nginx, что нежелательно. Но на данный момент это одно решение, специфичное для докеров, которое можно использовать.
зависимости_on Feature Это, вероятно, будет футуристическим ответом. Поскольку эта функциональность еще не реализована в Docker (начиная с версии 1.9)
Есть предложение ввести "depends_on" в новую сетевую функцию, представленную Docker. Но по поводу того же @ https://github.com/docker/compose/issues/374 ведутся давние дебаты. Следовательно, как только она будет реализована, функция depends_on может быть использована для заказа запуска контейнера, но в В данный момент вам придется прибегнуть к одному из следующих вариантов:
источник
links:
я включил в nginx, использовал то же имя, что и сама служба, например- my-service:my-service
или в этом примере- mongo:mongo
.Это можно решить с помощью упомянутой
depends_on
директивы, поскольку она реализована сейчас (2016 г.):Успешно протестирован с:
Подробности читайте в документации .
Также есть очень интересная статья, посвященная этой теме: Управление порядком запуска в Compose
источник
Вы можете установить директивы max_fails и fail_timeout для nginx, чтобы указать, что nginx должен повторить x-количество запросов на соединение с контейнером, прежде чем произойдет сбой при недоступности вышестоящего сервера.
Вы можете настроить эти два числа в соответствии с вашей инфраструктурой и скоростью, с которой происходит установка. Вы можете прочитать более подробную информацию о разделе проверки работоспособности по следующему URL-адресу: http://nginx.org/en/docs/http/load_balancing.html
Ниже приводится выдержка из http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server.
max_fails=number
fail_timeout=time
Чтобы быть точным, ваш измененный файл конфигурации nginx должен быть следующим (этот сценарий предполагает, что все контейнеры работают не менее чем на 25 секунд, если нет, измените fail_timeout или max_fails в нижнем разделе восходящего потока): Примечание: я не Протестируйте сценарий самостоятельно, чтобы вы могли попробовать!
Кроме того, согласно следующему примечанию от докера ( https://github.com/docker/docker.github.io/blob/master/compose/networking.md#update-containers ) очевидно, что логика повтора для проверки Докер не несет ответственности за работоспособность других контейнеров, и контейнеры должны сами выполнять проверку работоспособности.
источник
Я считаю, что Nginx не учитывает распознаватель Docker (127.0.0.11), поэтому, пожалуйста, можете попробовать добавить:
в вашем файле конфигурации nginx?
источник
resolver 127.0.0.11 8.8.8.8;
Если вы так растерялись, прочтите последний комментарий. Я нашел другое решение.
Основная проблема заключается в том, как вы назвали имена сервисов.
В этом случае, если у вас
docker-compose.yml
служба для php называется "api" или что-то в этом роде, вы должны убедиться, что в файлеnginx.conf
строка, начинающаяся с,fastcgi_pass
имеет то же имя, что и служба php. т.е.fastcgi_pass api:9000;
источник
У меня была такая же проблема, потому что в моем
docker-compose.yml
: одна серверная часть и одна интерфейсная.Когда я изменил это, чтобы запускать контейнеры в той же сети по умолчанию, все стало работать нормально.
источник
Была такая же проблема и решил ее. Добавьте следующую строку в раздел docker-compose.yml nginx:
Хост в конфигурации nginx раздел fastcgi_pass должен быть связан внутри конфигурации nginx docker-compose.yml.
источник
Стоит упомянуть две вещи:
links
для добавления разрешения хостовМой пример:
Если вы не укажете специальный сетевой мост, все они будут использовать один и тот же мост по умолчанию.
источник
На первый взгляд, я упустил, что моя "веб-служба" на самом деле не запускалась, поэтому nginx не мог найти ни одного хоста
источник
Со ссылками выполняется принудительный запуск контейнера. Без ссылок контейнеры могут запускаться в любом порядке (а на самом деле все сразу).
Я думаю, что старая установка могла столкнуться с той же проблемой, если бы
waapi_php_1
контейнер запускался медленно.Я думаю, чтобы он заработал, вы могли бы создать сценарий точки входа nginx, который опрашивает и ожидает запуска и готовности контейнера php.
Я не уверен, есть ли у nginx способ автоматически повторить попытку подключения к восходящему потоку, но если это так, это был бы лучший вариант.
источник
Вы должны использовать что-то вроде docker-gen для динамического обновления конфигурации nginx, когда ваш бэкэнд работает.
Увидеть:
Я считаю, что Nginx + (премиум-версия) также содержит параметр разрешения ( http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream )
источник
Возможно, лучший выбор, чтобы избежать проблем с связыванием контейнеров, - это сеть докеров. функции
Но для этого docker создает записи в каталоге / etc / hosts для каждого контейнера из присвоенных им имен для каждого контейнера.
Чтобы не зависеть от неожиданных изменений этих имен, следует использовать параметр
в вашем docker-compose.yml следующим образом:
Убедитесь, что это то же имя, что и в вашем файле конфигурации для этой службы. Я почти уверен, что есть способы сделать это лучше, но для начала это хороший подход.
источник
Мое решение (после долгих проб и ошибок):
Чтобы обойти эту проблему, мне нужно было получить полное имя восходящего контейнера Docker, которое можно было найти, запустив
docker network inspect my-special-docker-network
и получив полноеname
свойство восходящего контейнера как такового:Затем использовал это в
my-network.local.conf
файле NGINX вlocation
блокеproxy_pass
свойства: (обратите внимание на добавление GUID к имени контейнера):В отличие от ранее работавших, но теперь сломанных:
Наиболее вероятная причина - недавнее изменение Docker Compose в их схеме именования по умолчанию для контейнеров, как указано здесь. .
Похоже, что это происходит со мной и моей командой на работе с последними версиями
nginx
образа Docker :источник
(впервые в nginx) В моем случае имя папки было неправильным
Для конфигурации
убедитесь, что папка приложения находится в папке ex2:
ex2 / app / ...
источник
эта ошибка появилась, потому что мое
php-fpm
изображение было включеноcron
, и я понятия не имею, почемуисточник
Моя проблема заключалась в том, что я забыл указать сетевой псевдоним в docker-compose.yml в php-fpm
Работает хорошо!
источник
Добавьте раздел ссылок в конфигурацию контейнера nginx.
Вы должны сделать
php
контейнер видимым дляnginx
контейнера.источник
link
что он устарел. Я что-то упускаю?docker-compose --x-networking up
ссылки, определенные в моемdocker-compose.yml
, я получаю это четкое предупреждение:WARNING: "nginx" defines links, which are not compatible with Docker networking and will be ignored. Future versions of Docker will not support links - you should remove them for forwards-compatibility.
docker-compose.yml
храните файл в папке с именемwaapi
?waapi