Глюки сети Docker (или использование nginx в качестве обратного прокси для сервиса, определенного в docker-compose) - PullRequest
0 голосов
/ 27 ноября 2018

Итак, вчера я попал в интересную ситуацию.Я сделал быстрый файл docker-compose.yaml для nginx в качестве обратного прокси-сервера для jenkins.

Вот как это выглядит (2.1 все еще стандарт, даже если links устарела в новых версиях).

# 2.1 as most recent version that allow me to use limit for resources.

version: '2.1'

services:

# Nginx
nginxlb:
    image: nginx
    container_name: nginx
    ports:
    - "80:80"
    - "443:443"
    volumes:
    - ./data-www/:/var/www/html/
    - ./nginx.conf:/etc/nginx/nginx.conf:ro 
    links: 
    - jenkins # <- I am linking jenkins container here.

# Jenkins CICD
jenkins:
    image: jenkins/jenkins:2.152
    container_name: jenkins
    mem_limit: 412m 
    environment:
    JAVA_OPTS: "-Djava.awt.headless=true"
    volumes:
    - ./data-jenkins/:/var/jenkins_home
    restart: always

И nginx.conf

user  www-data;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    autoindex                   off;
    client_max_body_size        1200M;
    server_tokens               off;

    server {
        listen      80;
        server_name _;
        location / {

            proxy_set_header        Host $host:$server_port;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        X-Forwarded-Proto $scheme;

            # From
            proxy_pass              http://jenkins:8080;
            proxy_read_timeout      90;

            # Sendfile provides no advantages when operating as a proxy
            sendfile                off;

            # Required for new HTTP-based CLI
            proxy_http_version      1.1;
            proxy_request_buffering off;
            proxy_buffering         off;

        }
    }
}

Как видите, все довольно просто.Правильно?

  • Локальный компьютер работает (механизм докера 18.09.0 @ mac) -> Proxy Works (как и ожидалось).
  • Удаленный запуск компьютера (механизм докера 18.06.1 @ centos7) ->Прокси-сервер не работает (что ????).

Я запускаю docker-compose up, чтобы увидеть логи при запуске и посмотреть jenkins could not be resolved (3: Host not found), быстрый Google указывает на этот стекопоток тема .Я добавляю ресовлер, перезапускаю сервис, и он ... не работает, та же ошибка.

Хм, возможно я допустил какую-то ошибку, настроив docker-compose.yml или nginx.conf?Я обновляю конфигурацию на удаленной машине.Остановка как локальная, так и удаленная.Затем внесите (небольшие) корректировки в удаленный конфиг - запустите его.

  • Локальный компьютер работает -> Прокси в порядке.
  • Удаленный компьютер работает -> Сбой прокси.

Хххххм.

Добавление resovler для обоих nginx.conf.

  • Локальный компьютер работает -> Proxy Works.
  • Удаленный компьютер работает -> Proxy Fails.

Примерно через час сдвига кода здесь и здесь(в основном из раздела местоположений nginx.conf), пытаясь понять внутреннюю сеть докера, я сталкиваюсь с ситуацией, когда мой локальный контейнер jenkins перестает разрешаться.Я удалил resolver на данный момент.Теперь обе машины выдают одинаковую ошибку: jenkins could not be resolved (3: Host not found).

  • Локальная машина работает -> Сбой прокси.
  • Удаленная машина работает -> Сбой прокси.

Я устал - просто выключите машину.На следующее утро я перезагружаю файлы конфигурации и докера.Начиная.

  • Локальный компьютер работает -> Прокси в порядке.
  • Удаленный компьютер работает -> Прокси в порядке.

Magic?Я не люблю магию.Мне нравится знать, что происходит:

  • Почему локальный домен не разрешается в одном случае и не разрешается в другом?Что произойдет, если в nginx.conf нет директивы resolve?Как docker предоставляет собственный DNS для nginx в сети Docker?

  • Почему буквально такая же конфигурация начинает работать через несколько часов без изменений?(Я предполагаю, что внутренняя сеть докеров не является нестабильной, как обычная сеть).Что может быть причиной для этого?

  • Я делал это буквально сотни раз.Это всегда работало.За исключением вчерашнего дня.Я собираюсь прочитать НАМНОГО больше о сети докеров, однако, если у вас есть какие-либо догадки о том, что произошло - я здесь, чтобы выслушать вас.

TL / DR.nginx начинает работать непредсказуемо (в сети Docker) на удаленной и локальной машине.все прошло за 10 часов.моё предположение, что вчера на работе были какие-то колебания.Попытка найти причины такого поведения, чтобы больше не повторять эту ситуацию.Попытка понять больше о сети докера.

...