2015-01-09 2 views
3

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

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

ServiceA --> ServiceB

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

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

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

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

Редактировать

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

+0

Кристиан, когда вы говорите «перенаправлено с одной службы на другую службу в своем браузере» - разве это не означает, что вторая услуга должна быть общедоступной? Обычно контейнер-докер (услуга) не является общедоступным, поскольку он находится в частной сети. – wassgren

+0

Несомненно, они оба доступны снаружи через картографирование портов. Например, docker run -p 8080 images/serviceA –

+0

Возможный дубликат [Как связать службы Docker через узлы?] (Http://stackoverflow.com/questions/21283517/how-to-link-docker-services-across-hosts) – wassgren

ответ

1

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

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

#!/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" 

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

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

и script callbackTomcatServiceUpEvent.sh запрашивает службы (в основном IPAddress и Port), создает новый файл works.properties, копирует этот файл в экземпляр docker 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 

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

Смежные вопросы