У меня есть две копии одного и того же приложения, которое я хочу развернуть в кластере, и пока я использую 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-адреса.
ПРИМЕЧАНИЕ. Изменение кода выбора порта не является вариантом, это сторонняя библиотека, и, честно говоря, это обычный шаблон для использования.
Я думаю, вы поменяли местами порты. Первый порт — это хост-порт, а второй — внутренний порт контейнера.
Пытаться
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.
Я так зол сейчас, что собираюсь удалить этот вопрос. Я держу это только для того, чтобы вы получили очки