
先看拓撲圖: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了,
網上很多教程全程采用同一個埠,初學者很難理解其中的原理,在實踐中會遇到很大的麻煩,我這邊整體梳理一下,希望幫到大家,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/237479.html
標籤:其他
下一篇:加速電腦開機關機速度
