Невозможно подключиться из одного контейнера docker к другому по его доменному имени publi c - PullRequest
0 голосов
/ 10 июля 2020

У меня есть приложение, состоящее из контейнерных веб-сервисов, развернутых с помощью docker -compose (это тестовый env). Один из контейнеров - это nginx, который работает как обратный прокси для служб, а также обслуживает файлы stati c. Доменное имя publi c указывает на хост-машину, а nginx имеет секцию сервера, которая его использует.

Проблема, с которой я столкнулся, заключается в том, что я не могу разговаривать с nginx через этот publi c доменное имя из контейнеров, запущенных на этом же компьютере - соединение всегда истекает. (Например, я попытался сделать curl https://<mypublicdomain>.com)

Ссылка по имени контейнера (используя имена хостов docker) работает нормально. Запрос на то же доменное имя с других машин также работает нормально.

Я понимаю, что это связано с тем, как docker работает в сети, но не могу найти никаких документов, которые описывали бы, что именно здесь идет не так. Может ли кто-нибудь объяснить мне root проблемы или, может быть, просто указать в правильном направлении?

(Для дополнительного контекста: изначально я собирался использовать это, чтобы настроить мониторинг с помощью Prometheus и экспортера черного ящика, чтобы сделать он видит сервер так же, как и любой извне, + для автоматической проверки работоспособности SSL. На данный момент я отступил, чтобы указать проберу на nginx по его docker имени хоста)

Nginx изображение

FROM nginx:stable
COPY ./nginx.conf /etc/nginx/nginx.conf.template
COPY ./docker-entrypoint.sh /docker-entrypoint.sh

COPY ./dhparam/dhparam-2048.pem /dhparam-2048.pem

COPY ./index.html /var/www/index.html

ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]

docker -compose.yaml

version: "3"
networks:
  mainnet:
    driver: bridge

services:
  my-gateway:
    container_name: my-gateway
    image: aturok/manuwor_gateway:latest
    restart: always
    networks: 
      - mainnet
    ports:
      - 80:80
      - 443:443
    expose:
      - "443"
    volumes:
      - /var/stuff:/var/www
      - /var/certs:/certsdir
    command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"

(я показываю только службу nginx, как другие не имеют значения - я бы, например, развернул контейнер nettools и не подключал его к сети mainnet - по-прежнему ожидаю, что запросы достигнут nginx, поскольку я использую доменное имя publi c. Проблема также возникает с контейнерами, подключенными к одной сети)

nginx .conf (обычно он поставляется с кучей env vars, замененных + удаленных нерелевантных бэкэндов)


user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

http {

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

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    #include /etc/nginx/conf.d/*.conf;

    server {
        listen 80;
        server_name mydomain.com;

        location /.well-known/acme-challenge/ {
            root /var/www/certbot;
        }

        location / {
            return 301 https://$host$request_uri;
        }
    }

    server {
        listen       443 ssl;
        server_name  mydomain.com;

        ssl_certificate /certsdir/fullchain.pem;
        ssl_certificate_key /certsdir/privkey.pem;

        
        server_tokens off;

        ssl_buffer_size 8k;

        ssl_dhparam /dhparam-2048.pem;
        ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
        ssl_prefer_server_ciphers on;

        ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;

        ssl_ecdh_curve secp384r1;
        ssl_session_tickets off;

        ssl_stapling on;
        ssl_stapling_verify on;
        resolver 8.8.8.8;



        root /var/www/;
        index index.html;

        location / {
            root /var/www;
            try_files $uri /index.html;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

Примечание: сертификат все в порядке, когда я получаю доступ к серверу из другого места

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...