Как получить доступ к Docker-контейнеру за обратным прокси по его публичному адресу из другого контейнера - PullRequest
0 голосов
/ 04 сентября 2018

Я установил 2 контейнера Docker a и b , которые оба предоставляют службы HTTP. Они должны иметь открытый доступ через имена своих виртуальных хостов a.domain.com и b.domain.com . Кроме того, a должен иметь доступ к b на своем общедоступном имени виртуального хоста, то есть он должен иметь доступ к b на b.domain.com .

Настройка двух контейнеров выполняется с помощью файла docker-compose v2

version: '2'
services:
  a:
    container_name: container-a
    build:
      context: ../
      dockerfile: Containers/A.Dockerfile
    ports:
      - 5001:80
    environment:
      VIRTUAL_HOST: a.domain.com
    depends_on:
      - b
    networks:
      - my-net

  b:
    container_name: container-b
    build:
      context: ../
      dockerfile: Containers/B.Dockerfile
    ports:
      - 5000:80
    environment:
      VIRTUAL_HOST: b.domain.com
    networks:
      - my-net

networks:
  my-net:
    driver: bridge

Я установил контейнер док-станции jwilder / nginx-proxy для автоматического создания конфигураций обратного прокси-сервера nginx. Мои два контейнера a и b подключены через свою пользовательскую мостовую сеть, но также подключены к мостовой сети по умолчанию, на которой работает прокси-сервер nginx (docker network connect bridge container-(a|b))

Конфигурация nginx, сгенерированная прокси-сервером nginx, выглядит вполне нормально.

upstream a.domain.com {
            # a
            server 172.17.0.14:80;
}
server {
    server_name a.domain.com;
    listen 80 ;
    access_log /var/log/nginx/access.log vhost;
    location / {
        proxy_pass http://a.domain.com;
    }
}        
upstream b.domain.com {
            # a
            server 172.17.0.15:80;
}
server {
    server_name b.domain.com;
    listen 80 ;
    access_log /var/log/nginx/access.log vhost;
    location / {
        proxy_pass http://b.domain.com;
    }
}

Оба контейнера могут быть доступны с моей клиентской машины через их общедоступные имена виртуальных хостов. Проблема в том, что мой контейнер A не может получить доступ к контейнеру B на своем имени виртуального хоста b.domain.com. Он может получить к нему доступ через container-b , однако для меня это не вариант. Есть идеи или намеки на то, что я делаю не так?

1 Ответ

0 голосов
/ 06 сентября 2018

Решение состоит в том, чтобы добавить псевдоним в контейнер b, чтобы при попытке разрешения контейнера a b.domain.com не перенаправлялся на хост, а находил контейнер b напрямую.

Просто добавьте псевдоним в файл составления Docker для контейнера b: вместо

networks:
  - my-net

добавить

networks:
  my-net:
    aliases:
      - b.domain.com
...