Приложения Docker Compose автоматически привязываются к одному и тому же порту, но компоновка не запускается

У меня есть две копии одного и того же приложения, которое я хочу развернуть в кластере, и пока я использую docker-compose. Это приложение прослушивает порт 8000 и, если порт занят, увеличивает номер порта до тех пор, пока не найдет свободный порт (8001, 8002 и т. д.). Эти порты используются приложениями для связи друг с другом, т. е. app1 будет слушать 8000 и разговаривать с app2 в 8001.

Поскольку я развертываю их с помощью docker-compose, каждый контейнер получает свой собственный IP-адрес. Это означает, что оба приложения будут привязаны к порту 8000 (поскольку с их точки зрения он не занят). Зная это, я пытаюсь сопоставить эти ports в файле docker-compose.yml следующим образом.

version: "3.9"
  services:
    app1:
      container_name: app1
      image: app:latest
      ports:
        - 8000:8000
    app2:
      container_name: app2
      image: app:latest
      ports:
        - 8000:8001

Однако, когда я пытаюсь docker-compose up это сделать, происходит сбой со следующей ошибкой

привязка для 0.0.0.0:8000 не удалась: порт уже выделен

то есть он не может связать один и тот же (внутренний) порт контейнера, даже если они из разных контейнеров и сопоставлены с разными портами хоста. И app1, и app2 выберут порт 8000, потому что с их точки зрения он свободен, но я не могу подключить его извне. Как я могу это решить?

Я бы предпочел, чтобы каждый app привязывался к другому порту, т. е. вся настройка компоновки должна использовать одни и те же порты, даже если контейнеры имеют разные IP-адреса.

ПРИМЕЧАНИЕ. Изменение кода выбора порта не является вариантом, это сторонняя библиотека, и, честно говоря, это обычный шаблон для использования.

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
0
133
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы поменяли местами порты. Первый порт — это хост-порт, а второй — внутренний порт контейнера.

Пытаться

version: "3.9"
  services:
    app1:
      container_name: app1
      image: app:latest
      ports:
        - 8000:8000
    app2:
      container_name: app2
      image: app:latest
      ports:
        - 8001:8000

Это сопоставит контейнеры с хост-портами 8000 и 8001.

Я так зол сейчас, что собираюсь удалить этот вопрос. Я держу это только для того, чтобы вы получили очки

PentaKon 13.04.2023 17:29

Другие вопросы по теме