詳解Docker 跨服務器通訊 Ambassador原理

先看拓撲圖:Ambassador 主要用來解決跨服務器通訊,因為同服務器通訊相對簡單,直接用--link參數,或者用bridge網絡即可。
服務器B的Docker2:centos想要訪問服務器A的Docker1:nginx,但是不知道對方的端口和ip,這時就需要通過Ambassador來解決。(Ambassador后續版本應該會被拋棄,overlay網絡應該是趨勢)
1、先建立Docker1:nginx
docker run -d --name nginx1 nginx
2、建立Ambassador 1
docker run -d --name a1 --link nginx1:nginx1 -p 8000:80 svendowideit/ambassador
3、建立Ambassador 2
docker run -d --name a2 --expose 8001 -e A2__PORT_8001_TCP=tcp://172.16.16.201:8000 svendowideit/ambassador
(暴露8001端口給centos,然后將8001端口的流量轉到服務器1的8000端口,即間接訪問了Ambassador1)
4、建立Docker2:centos
docker run -it --name centos1 --link a2:a2 centos /bin/bash
至此所有的步驟完成。
那么此時centos如何訪問nginx呢?
curl a2:8001 訪問ambassador2的8001端口即可,不需要知道服務器A的任何信息。(截圖中用a200,由于之前已經弄好環境,不想改了)

具體的流量途徑如下:

1、centos訪問Ambassador2的時候將直接訪問它的8001端口。
2、Ambassador2 中參數 -e A200__PORT_8001_TCP=tcp://172.16.16.201:8000 將訪問8001端口的流量重新轉到服務器A的8000端口。
A2__PORT_8001_TCP=tcp://172.16.16.201:8000 其中A2你可以隨便命名,為什么呢。我們進入到Ambassador2中看看原因:

輸入env查看環境變量,和創建時的參數一致。

輸入top,如圖,系統只會對8001端口的流量轉發到172.16.16.201:8000上,也就是服務器A的8000端口,壓根不在乎會上邊說的A2,原因如下:
Ambassador Dockrfile中有如下參數:
CMD env | grep _TCP= | sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/socat TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \&/' | sh && top
我們按照此參數用A2__PORT_8001_TCP=tcp://172.16.16.201:8000執行sed 如下:

該shell語句只是單獨提取其中的8001端口和后邊的ip地址部分,其他的字段全部忽略,所以,其他字段只需要按照Docker 中環境變量的格式即可。
3、Ambassador1中,-p 8000:80 參數中的80要和nginx的端口80一致,因為--link nginx1:ngxin1后,Ambassador1中的環境變量如下

此時會將80端口的流量轉到nginx服務器上的80端口。假設我們使用 -p 8000:81參數,那么Ambassador1中并沒有對應的81端口的轉發規則,當然其他服務器器也服務訪問到nginx了。
網上很多教程全程采用同一個端口,初學者很難理解其中的原理,在實踐中會遇到很大的麻煩,我這邊整體梳理一下,希望幫到大家。

浙公網安備 33010602011771號