在docker容器之间重定向的最佳实践

时间:2015-01-09 09:47:35

标签: redirect docker reverse-proxy boot2docker microservices

鉴于我有多个在docker容器中运行的Web应用程序,我希望能够将用户从服务重定向到浏览器中的另一个服务。我想知道如何实现这一点 - 特别是如果我希望我的应用程序可以从一个docker主机移植到另一个主机。

假设我们有一个ServiceA,它将用户重定向到ServiceB。所以我们有一段感情

ServiceA --> ServiceB

一种方法是静态分配端口和主机名,并将它们设置为我的Web服务的环境变量 - 我不喜欢这样做,因为我不想关心哪个服务在哪个端口上运行。

第二种方法是拥有像nginx这样的代理并链接服务并使用代理主机和端口。但是,这需要在将服务移动到其他主机时更改代理配置。

首先想到的方法是使用etcd和ambassadors来注册和解决服务。因此,ServiceA将使用ServiceB-Ambassador在etcd中查找ServiceB。这导致许多docker容器只是连接服务。

您更喜欢哪种方式?或者有不同的方法吗?

修改

真正的问题是将ServiceB的uri注入ServiceA,因此我可以使用-DserviceB.uri=<serviceUri>这样的参数启动我的ServiceA,以便serviceA可以构建正确的重定向头。

1 个答案:

答案 0 :(得分:1)

我使用consul的设置将tomcat容器连接到apache http服务器(使用mod_jk)。 Consul类似于etcd,即它允许注册和发现服务。这可能适用于您的问题,但您不限于领事。

每次启动一个新的tomcat容器时,我都会为该容器分配一个不同的公共端口,在consul中注册tomcat容器以及有关其IP和Ports的信息并触发事件(该脚本在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"

在consul(在docker主机上)我已经为文件/etc/consul.d/bootstrap/watchTomcatServiceUp.json中的事件“TomcatServiceUp”定义了一个执行脚本的监视

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

并且脚本callbackTomcatServiceUpEvent.sh查询服务(主要是IPAddress和Port),创建一个新的workers.properties文件,将此文件复制到http docker实例(到其卷)并正常重启http服务器(在docker中)容器)。

#!/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来处理事件并进行服务查找?