Несколько контейнеров докеров в качестве веб-сервера на одном IP-адресе

У меня есть несколько контейнеров докеров на одной машине. На каждом контейнере выполняется процесс и веб-сервер, который предоставляет API для процесса.

Мой вопрос: как я могу получить доступ к API из моего браузера, когда порт по умолчанию - 80? Чтобы иметь доступ к веб-серверу внутри контейнера докера, я делаю следующее:

sudo docker run -p 80:80 -t -i <yourname>/<imagename>

Таким образом, я могу сделать с моего терминала:

curl http://hostIP:80/foobar

Но как обращаться с несколькими контейнерами и несколькими веб-серверами?

Ответ 1

Вы можете либо выставить несколько портов, например.

docker run -p 8080:80 -t -i <yourname>/<imagename>
docker run -p 8081:80 -t -i <yourname1>/<imagename1>

или поместите прокси (nginx, apache, лак и т.д.) перед вашими контейнерами API.

Обновление

Самый простой способ сделать прокси-сервер - связать его с контейнерами API, например. с конфигурацией apache

RewriteRule ^api1/(.*)$ http://api1/$1 [proxy]
RewriteRule ^api2/(.*)$ http://api2/$1 [proxy]

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

docker run --name api1 <yourname>/<imagename>
docker run --name api2 <yourname1>/<imagename1>
docker run --link api1:api1 --link api2:api2 -p 80:80 <my_proxy_container>

Это может быть несколько громоздким, хотя если вам нужно перезапустить контейнеры api, так как необходимо будет перезапустить контейнер-посредник (ссылки еще довольно статичны в докере). Если это становится проблемой, вы можете посмотреть такие подходы, как fig или конфигурацию прокси-сервера: http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/. Более поздняя ссылка также показывает проксирование с nginx.

Обновление II:

В более современных версиях докера можно использовать сеть, определенную пользователем вместо ссылок, показанных выше, для преодоления некоторых неудобств механизма устаревших ссылок.

Ответ 2

Только один процесс может быть привязан к порту за раз. Таким образом, запуск нескольких контейнеров означает, что каждый из них будет отображаться на другом номере порта. Docker может сделать это автоматически для вас, используя атрибут "-P".

sudo docker run -P -t -i <yourname>/<imagename>

Вы можете использовать команды "docker port" и "docker inspect", чтобы увидеть фактический номер порта, присвоенный каждому контейнеру.