Можно ли использовать несколько контейнеров Docker с использованием одного и того же хоста/порта?

Изучение использования Docker для проекта службы REST. Один из вопросов, который у меня есть, заключается в том, можно ли использовать Docker для запуска нескольких версий службы на одном и том же хосте/порту.

Например, я хочу иметь конечную точку в {myserver}: 8080/v1/и другую в {myserver}: 8080/v2/.

Если это вообще актуально, это будут изображения Docker на основе Java: 8, созданные с помощью java-фрейма в Spring Framework REST.

Возможно ли это с контейнерами Docker?

Ответы

Ответ 1

Вы можете запускать оба контейнера с использованием разных хост-портов и использовать haproxy/nginx/varnish (собственный или внутри другого контейнера), прослушивающий хост-порт, и перенаправление в правый контейнер на основе URL.

Ответ 2

Да, это возможно, если вы используете разные сетевые адреса для каждого повторяющегося порта, который вы слушаете.

Например, ваш хост имеет следующие IP-адреса, назначенные ему: 192.168.11.223 10.88.88.12

У вас может быть два отдельных контейнера, которые прослушиваются: 192.168.11.223:80 10.88.88.12:80

Если вы посмотрите на синтаксис запуска docker:

-p=[]      : Publish a container᾿s port or a range of ports to the host 
             format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort
             Both hostPort and containerPort can be specified as a range of ports. 
             When specifying ranges for both, the number of container ports in the range must match the number of host ports in the range. (e.g., `-p 1234-1236:1234-1236/tcp`)
             (use 'docker port' to see the actual mapping)

Ответ 3

Это вопрос о том, как работают порты tcp, как работает докер. Точно так же, как два приложения не могут привязываться к одному и тому же порту tcp, ни один из двух контейнеров докеров не может быть.

Как указывает @Sergei Rodionov, SO_REUSEPORT может использоваться, чтобы позволить нескольким процессам совместно использовать один и тот же порт tcp (и это может быть указано при запуске вашего java-приложения). Я не думаю, что это будет работать через контейнеры.

Ответ 4

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

docker inspect -f '{{ .NetworkSettings.IPAddress }}' <container ID>