LINUX.ORG.RU
решено ФорумAdmin

Неопределённое поведение Docker контейнеров

 


0

5

Всем привет. Имеется вот такой docker-compose.yml

version: '2'
  
services:
  php7.0_and_apache2:
    build:
      context: common_environment/Php7.0_and_apache2.4.10
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    volumes:
      - /var/www/:/var/www
      - ./logs/apache/:/var/log/apache2

  nginx:
    build:
      context: common_environment/Nginx1.12.2/
      dockerfile: Dockerfile
    depends_on:
      - php7.0_and_apache2
    ports:
      - "80:80"
    volumes:
      - ./logs/nginx/:/var/log/nginx
      - /var/www/:/var/www
    links:
      - php7.0_and_apache2
В Nginx'е вот такой конфиг

upstream web {
  server php7.0_and_apache2:8080;

}

server {
    listen 80;

    server_name local.samsonopt.ru;
    access_log  /var/log/nginx/site.ru.access.log log_uuid;
    error_log   /var/log/nginx/site.ru.error.log notice;

    large_client_header_buffers 16 512k;
    client_header_buffer_size 512k;

    set $Rootpath /var/www/project/dev/dev.site.ru;

    location / {
        root $Rootpath;
        index index.php;

        proxy_pass_request_headers          on;
        proxy_set_header Host               $host;
        proxy_set_header X-Real-IP          $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://web;
    }

Периодами бывает такое, что контейнер с Nginx перестаёт видеть контейнер с apache2. Если в конфигах убрать «proxy_pass http://web;» , потом запустить сборку, зайти в контейнер с Nginx и поправить конфиги внутри, то всё работает. После этого после повторной сборки контейнеры линкуются сразу без проблем, но через некоторое время ситуация повторяется. Подскажите, пожалуйста, с чем это может быть связано?

Docker version 18.09.1, build 4c52b90
docker-compose version 1.23.2, build 1110ad01

UPD: Проблема решилась при использовании сети вместо линков. Не мог раньше ответить - не было возможности. Всем спасибо и извините за долгое молчание.

Покажи конфиги nginx когда upstream отваливается

najar ()

Когда отвалилось, залезть в контейнер и запустить curl. Может dns глючит. Может сеть. Почему link а не отдельная сеть?

Bers666 ★★★★★ ()
Ответ на: комментарий от v9lij

По завершению деплоя он не стартует. То есть отрабатывает команда docker-compose up -d --build, выводится сообщение о том, что контейнеры собрались, но контейнер с nginx'ом не запущен. Контейнер с апачем стартует. Я думал, что контейнер с Nginx стартует раньше, но, насколько мне известно, директива «depends_on:» должна гарантирвоать, что контейнер с апачем запустится раньше.

Marmon ()
Ответ на: комментарий от Marmon

По-моему, если контейнер не стартует - это другая проблема совсем, нежели описано выше

najar ()
Ответ на: комментарий от Marmon

Так у тебя оба контейнера запустились или один из них нет?

v9lij ★★★★★ ()


У Nginx есть такая фишка: если доменное имя, указанное в upstream-блоке, на момент запуска Nginx еще не определено, то Nginx не стартует. Соответственно, при деплое - когда перезапускаются два контейнера - возможна ситуация, когда Nginx умудряется стартануть раньше, чем в docker-овском dns-сервисе появится имя «php7.0_and_apache2». Наличие директивы «depends_on», к сожалению, не дает гарантии правильного разрешения имен - тут, похоже, недоработка docker-а.

Чтобы избежать подобной неприятности, можно сделать в Nginx-контейнере стартовый скрипт, который будет проверять доступность «php7.0_and_apache2» (делать проверки в цикле) и только потом запускать Nginx.

vinvlad ()

в качестве «ingress controller из желудей и пластилина» я использую связку из образов:

nginx + jwilder/docker-gen + jrcs/letsencrypt-nginx-proxy-companion

и вообще забыл, что такое «настраивать nginx» :)

aol ★★★★★ ()
Ответ на: комментарий от aol

в качестве «ingress controller из желудей и пластилина» я использую связку из образов: ...

Nginx в любой связке не стартанет, если не сможет разрешить домен upstream-блока в IP-шник.

vinvlad ()
Ответ на: комментарий от vinvlad

там хитрее: jwilder/docker-gen слушает, какие контейнеры поднимаются, по их метаданным генерит конфиг nginx-а и релоадит его.

говорю же - pure magic! )

aol ★★★★★ ()
Ответ на: комментарий от aol

jwilder/docker-gen слушает, какие контейнеры поднимаются ...

А разрешение доменов в IP-шники он проверяет? Отловить факт запуска контейнера и проверить dns-доступность имени этого контейнера - это не одно и то же.

vinvlad ()
Ответ на: комментарий от vinvlad

два года эксплуатации - ни единого разрыва. (именно эксплуатации данного механизма, а не «запустил и забыл»)

aol ★★★★★ ()
Ответ на: комментарий от aol

два года эксплуатации - ни единого разрыва. (именно эксплуатации данного механизма, а не «запустил и забыл»)

А upstream-блоки у тебя имеются в Nginx? Может, у тебя просто конфигурация другая, поэтому и не сталкивался с такой бякой )

vinvlad ()
Ответ на: комментарий от Jopich1

предложи мне такое же, но без докера. потом измерим калибр костылей. :)

из вводных: у тебя дохренелион разных апстримов, список которых меняется во времени, адреса заранее не известны.

aol ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.