Лучшая практика для перенаправления между контейнерами докеров

Учитывая, что у меня есть несколько веб-приложений, работающих в контейнерах докеров, я хочу, чтобы пользователь мог перенаправляться из одной службы в другую в своем браузере. Интересно, как этого добиться - особенно если я хочу, чтобы мои приложения можно было переносить с одного хоста докеров на другой.

Допустим, у нас есть ServiceA, который перенаправляет пользователя на ServiceB. Итак, у нас есть отношения

ServiceA --> ServiceB

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

Второй подход - иметь прокси, например nginx, связывать службы и использовать прокси-сервер и порт. Но для этого потребуется изменить конфигурацию прокси при перемещении службы на другой хост.

Третий подход, который приходит на ум, - использовать etcd и ambassadors для регистрации и разрешения сервисов. Таким образом, ServiceA будет использовать ServiceB-Ambassador, который ищет ServiceB в etcd. Это приводит к тому, что многие контейнеры докеров просто соединяются между службами.

Какой путь вы бы предпочли? Или есть разные подходы?

Изменить

Настоящая проблема заключается во внедрении uri ServiceB в ServiceA, поэтому я могу запустить свой ServiceA с аргументом типа -DserviceB.uri=<serviceUri>, чтобы serviceA смогла создать правильный заголовок перенаправления.


person Christian Metzler    schedule 09.01.2015    source источник
comment
Кристиан, когда в его браузере вы говорите, что перенаправлен с одной службы на другую, разве это не означает, что вторая служба должна быть каким-то образом общедоступной? Обычно докер-контейнер (служба) не является публичным, поскольку находится в частной сети.   -  person wassgren    schedule 09.01.2015
comment
Конечно, они оба доступны извне через сопоставление портов. Например docker run -p 8080 images / serviceA   -  person Christian Metzler    schedule 09.01.2015
comment
возможный дубликат Как связать службы Docker между хостами?   -  person wassgren    schedule 09.01.2015
comment
Дело не только в связывании контейнеров - если я связываюсь с послом в моем контейнере serviceA и использую сгенерированные переменные среды, я не могу использовать их для перенаправления, потому что эти хосты и порты относятся к частной сети докеров.   -  person Christian Metzler    schedule 09.01.2015


Ответы (1)


Я использую настройку с consul для подключения контейнеров tomcat к http-серверу apache (используя mod_jk). Consul похож на etcd, то есть позволяет регистрировать и открывать услуги. Это может быть применимо к вашему вопросу, но вы не ограничены консулом.

Каждый раз, когда запускается новый контейнер tomcat, я назначаю этому контейнеру отдельный общедоступный порт, регистрирую контейнер tomcat в consul с информацией о его IP-адресе и портах и ​​запускаю событие (сценарий запускается на хосте докеров и сокращается для читаемость)

#!/bin/bash
INTERNAL_PORT=8009
source ~/ports.properties
TOMCAT_PORT=$(( TOMCAT_PORT + 1))
echo "TOMCAT_PORT=$TOMCAT_PORT" > ~/ports.properties

CONTAINER_ID=$(docker run -d -p $TOMCAT_PORT:8009 -v `pwd`$WAR_DIR:/webapps rossbachp/tomcat8)
echo "Container started, CONTAINER_ID:  $CONTAINER_ID"

IP_ADDRESS=$(docker inspect -f '{{.NetworkSettings.IPAddress}}' $CONTAINER_ID )
echo "Container IP_ADDRESS:               $IP_ADDRESS "

echo "Register Container in Consul"
curl -X PUT -d '{"ID": "'$CONTAINER_ID'","Name":"'$CLUSTER_NAME'", "Tags": [ "IP_'$IP_ADDRESS'", "PORT_'$INTERNAL_PORT'"],"Port":'$TOMCAT_PORT'}' localhost:8500/v1/agent/service/register 

echo "Fire Event"
consul event -name "TomcatServiceUp"

В консуле (на хосте докеров) я определил часы для события «TomcatServiceUp» в файле /etc/consul.d/bootstrap/watchTomcatServiceUp.json, которое выполняет сценарий

{
"watches":[    {
"type":"event",
"name":"TomcatServiceUp",
"handler": "/home/dude/docker/docker-http-withmodjk/callbackTomcatServiceUpEvent.sh"
   }  ]
}

а сценарий callbackTomcatServiceUpEvent.sh запрашивает службы (в основном IPAddress и Port), создает новый файл worker.properties, копирует этот файл в экземпляр http-докера (на его том) и корректно перезапускает http-сервер (в контейнере докера).

#!/bin/bash
SERVICE=$(curl localhost:8500/v1/agent/services)
java -jar /home/dude/docker/JSonParser.jar "$SERVICE" >> /tmp/workers.properties
cp workers.properties /home/dude/docker/docker-http-withmodjk/mod_jk_conf
# http graceful restart

Не могли бы вы использовать подход, при котором ваши службы регистрируются в consul (или etcd) и обнаруживают друг друга с помощью событий и поиска служб. Или использовать nginx для обработки событий и поиска службы?

person christian    schedule 10.01.2015