先看拓撲圖:Ambassador 主要用來解決跨伺服器通訊,因為同伺服器通訊相對簡單,直接用--link參數,或者用bridge網路即可。 伺服器B的Docker2:centos想要訪問伺服器A的Docker1:nginx,但是不知道對方的埠和ip,這時就需要通過Ambassador來解決。(Am ...
先看拓撲圖: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了。
網上很多教程全程採用同一個埠,初學者很難理解其中的原理,在實踐中會遇到很大的麻煩,我這邊整體梳理一下,希望幫到大家。