簡體   English   中英

在docker容器之間重定向的最佳實踐

[英]Best practice for redirecting between docker containers

鑒於我有多個在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可以構建正確的重定向頭。

我使用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

您可以使用一種方法,您的服務在領事(或等)中注冊,並通過事件和服務查找發現彼此。 或者使用nginx來處理事件並進行服務查找?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM