docker集装箱之间redirect的最佳做法

鉴于我有多个在Docker容器中运行的Web应用程序,我希望能够让用户在服务中redirect到另一个服务。 我不知道如何实现这一点 – 特别是如果我想我的应用程序可以从一个docker主机移植到不同的主机。

假设我们有一个将用户redirect到ServiceB的ServiceA。 所以我们有一个关系

ServiceA --> ServiceB

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

第二种方法是使用像nginx这样的代理并链接服务并使用代理主机和端口。 但是这需要在将服务移动到不同的主机时更改代理configuration。

想到的第三种方法是使用etcd和大使来注册和解决服务。 所以ServiceA将会使用一个ServiceB-Ambassador来查找etcd中的ServiceB。 这导致许多docker集装箱只是为了连接服务。

你更喜欢哪种方式? 还是有不同的方法?

编辑

真正的问题是将ServiceB的uri注入到ServiceA中,所以我可以使用像-DserviceB.uri=<serviceUri>这样的参数启动我的ServiceA,以便serviceA可以构build正确的redirect头。

我使用consul的设置来连接tomcat容器到一个apache http服务器(使用mod_jk)。 领事与etcd类似,也就是允许注册和发现服务。 这可能适用于你的问题,但你不限于领事。

每次启动一个新的tomcat容器时,我将一个独立的公共端口分配给该容器,在consul中向其注册该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" } ] } 

脚本callbackTomcatServiceUpEvent.sh查询服务(主要是IP地址和端口),创build一个新的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 

您可以使用一种方法,您的服务在领事(或etcd)中注册,并通过事件和服务查找相互发现。 或者使用nginx来处理事件并执行服务查找?