Порты неправильной переадресации Docker - PullRequest
0 голосов
/ 03 января 2019

У меня есть несколько доменов с общим публичным IP-адресом (экземпляр EC2).Моя установка выглядит следующим образом:

/home/ubuntu содержит docker-compose.yml:

version: '3'
services:
  nginx-proxy:
    image: "jwilder/nginx-proxy"
    container_name: nginx-proxy
    volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
    ports:
    - "80:80"
    restart: "always"

Это создает сеть с именем ubuntu_default, которая позволяет другим экземплярам составных файлов присоединяться.Образ nginx-proxy создает обратные прокси-серверы для этих других экземпляров compose, чтобы вы могли посетить example.com и перенаправить на соответствующий пользовательский интерфейс в соответствующем экземпляре compose.

/home/ubuntu/example.com/project-1 содержит docker-compose.yml, например:

version: '3'
services:
  db:
    build: "./db"   # mongo
    volumes:
    - "./data:/data/db"
    restart: "always"
  api:
    build: "./api"   # a node backend
    ports:
    - "9005:9005"
    restart: "always"
    depends_on:
      - db
  ui:
    build: "./ui"   # a react front end
    ports:
    - "8005:8005"
    restart: "always"
    environment:
    - VIRTUAL_HOST=project-1.example.com   # this tells nginx-proxy which domain to proxy
    - VIRTUAL_PORT=8005  # this tells nginx-proxy which port to proxy
networks:
  default:
    external:
      name: ubuntu_default

/home/ubuntu/testing.com/project-2 содержит docker-compose.yml как:

version: '3'
services:
  db:
    build: "./db"  # postgres
    volumes:
    - "./data:/var/lib/postgresql/data"
    restart: "always"
  api:
    build: "./api"  # a python backend
    ports:
    - "9000:9000"
    restart: "always"
    depends_on:
      - db
  ui:
    build: "./ui"  # a react front end
    ports:
    - "8000:8000"
    restart: "always"
    environment:
    - VIRTUAL_HOST=testing.com,www.testing.com # tells nginx-proxy which domains to proxy
    - VIRTUAL_PORT=8000 # tells nginx-proxy which port to proxy
networks:
  default:
    external:
      name: ubuntu_default

Итак, в основном:

  • project-1.example.com: 80 форвардовна пользовательский интерфейс, запущенный: 8005
  • project-1.example.com: 80 / api, пересылаемый API, работающий на: 9005
  • testing.com, перенаправляющий на пользовательский интерфейс, работающий на: 8000
  • testing.com / api перенаправляет на API, работающий на: 9000

... и все это прекрасно работает, пока я запускаю только по одному за раз.В тот момент, когда я запускаю оба экземпляра Compose, URL-адреса / api начинают конфликтовать.Я могу сесть на один из них и обновить несколько раз, а иногда я увижу один для example.com/api, а иногда я увижу один для testing.com/api.

Понятия не имею, чтопроисходит в этой точке.Может быть, предпосылка, против которой я работаю, в корне неверна, но кажется, что она предназначена для использования Docker / Compose.Я открыт для предложений сделать то же самое в противном случае.

1 Ответ

0 голосов
/ 03 января 2019

Контейнеры Docker связываются с использованием поиска DNS в своей сети.Если несколько контейнеров имеют один и тот же псевдоним в одной и той же сети, он округляет балансировку нагрузки между контейнерами при каждом сетевом подключении.Если вы не хотите, чтобы контейнеры общались друг с другом, то вы не хотите, чтобы они находились в одной и той же сети докеров.Хорошая новость заключается в том, что вы решаете эту проблему, используя несколько сетей и не помещая серверы api и db в сеть прокси-сервера внешнего интерфейса:

version: '3'
services:
  db:
    build: "./db"  # postgres
    volumes:
    - "./data:/var/lib/postgresql/data"
    restart: "always"
  api:
    build: "./api"  # a python backend
    ports:
    - "9000:9000"
    restart: "always"
    depends_on:
      - db
  ui:
    build: "./ui"  # a react front end
    ports:
    - "8000:8000"
    restart: "always"
    networks:
    - default
    - proxy
    environment:
    - VIRTUAL_HOST=testing.com,www.testing.com # tells nginx-proxy which domains to proxy
    - VIRTUAL_PORT=8000 # tells nginx-proxy which port to proxy
networks:
  proxy:
    external:
      name: ubuntu_default

Если вы не переопределите сеть по умолчанию, Docker создаст ее.для вашего составного проекта и используйте его для любых контейнеров, не назначенных другой сети.

...