Ответ 1
Вы можете запускать оба контейнера с использованием разных хост-портов и использовать haproxy/nginx/varnish (собственный или внутри другого контейнера), прослушивающий хост-порт, и перенаправление в правый контейнер на основе URL.
Изучение использования Docker для проекта службы REST. Один из вопросов, который у меня есть, заключается в том, можно ли использовать Docker для запуска нескольких версий службы на одном и том же хосте/порту.
Например, я хочу иметь конечную точку в {myserver}: 8080/v1/и другую в {myserver}: 8080/v2/.
Если это вообще актуально, это будут изображения Docker на основе Java: 8, созданные с помощью java-фрейма в Spring Framework REST.
Возможно ли это с контейнерами Docker?
Вы можете запускать оба контейнера с использованием разных хост-портов и использовать haproxy/nginx/varnish (собственный или внутри другого контейнера), прослушивающий хост-порт, и перенаправление в правый контейнер на основе URL.
Да, это возможно, если вы используете разные сетевые адреса для каждого повторяющегося порта, который вы слушаете.
Например, ваш хост имеет следующие 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)
Это вопрос о том, как работают порты tcp, как работает докер. Точно так же, как два приложения не могут привязываться к одному и тому же порту tcp, ни один из двух контейнеров докеров не может быть.
Как указывает @Sergei Rodionov, SO_REUSEPORT может использоваться, чтобы позволить нескольким процессам совместно использовать один и тот же порт tcp (и это может быть указано при запуске вашего java-приложения). Я не думаю, что это будет работать через контейнеры.
да, это возможно, если контейнеры используют другой IP-адрес. вы можете проверить IP-адрес контейнеров, используя команду ниже.
docker inspect -f '{{ .NetworkSettings.IPAddress }}' <container ID>