Как создать несколько контейнеров одного и того же изображения, запустив один и тот же файл docker -compose на разных портах хоста? - PullRequest
0 голосов
/ 07 мая 2020

Предположим, что в настоящее время я использую docker контейнер Container A, созданный с использованием образа Image X, запущенного на хост-порту 3031 и Docker Port 3030

DOCKER_COMPOSE.yaml

version: "3"
services:
  app:
    image: ${IMAGENAME}
    container_name: ${PROJECTNAME}_ContainerA
    restart: ${RESTART}
    build:
      context: ${BUILD}
      args:
        PORT: 3030       --> this goes to dockerfile
    ports:
      - "3031:3030"
    networks:
      salesdb_network:
        ipv4_address: ${IP}
    environment:
      - APP_PORT=3030

networks:
  some_network:
    external: true

ПОЛУЧАЮ ПОРТЫ ИЗ файла env . Выше только для демонстрации.

Я запустил docker-compose --env-file **some_file** -f docker-compose.yaml up

enter image description here

До сих пор работает нормально. Все в порядке, проблем нет.

Теперь я хочу создать еще один контейнер Container B, используя образ Image X, работающий на Host Port 3033 и Docker Port 3032. У меня такая же структура, что и для файла docker_compose.yaml с измененными портами

Я запустил docker-compose --env-file **some_file_2** -f docker-compose.yaml up

Но я получаю следующую ошибку.

creating ${PROJECTNAME}_ContainerA... error

ERROR: for ${PROJECTNAME}_ContainerA  Cannot start service app: Address already in use

ERROR: for app  Cannot start service app: Address already in use
ERROR: Encountered errors while bringing up the project.

До того, как я добавил ИМЯ ПРОЕКТА (для которого я следовал это ), во время работы Container B оно использовалось для переопределения Container A И порты изменились на 3031/tcp, 0.0.0.0:3033->3032/tcp.

1 Ответ

1 голос
/ 07 мая 2020

Я бы не стал менять порт в вашем Dockerfile, пусть приложение слушает один и тот же порт внутри каждого контейнера. Каждый контейнер имеет отдельное сетевое пространство имен, поэтому они не будут конфликтовать. Что вам действительно нужно изменить, так это опубликованный порт на хосте. Измените это:

ports:
  - "3031:3030"

, чтобы использовать такую ​​переменную, как:

ports:
  - "${PORT}:3030"

А затем определите переменную среды $PORT в .env или в вашей оболочке перед запуском docker-compose up.


Я также рекомендовал бы удалить следующее:

    ipv4_address: ${IP}

Вместо этого позвольте docker предоставить IP-адрес в этой сети и использовать DNS для поиска вашего контейнера между контейнерами. Поскольку все службы имеют одно и то же имя, вы можете использовать свое имя контейнера ${PROJECTNAME}_ContainerA или дать своим контейнерам уникальный сетевой псевдоним:

networks:
  salesdb_network:
    aliases:
    - ${PROJECTNAME}-app
...