docker ambassador 大使容器

ambassador 容器

ambassador:使節,大使。所以ambassador 容器也叫做大使容器,一開始聽到這個名字我是崩潰的,什麼鬼名字,後來才慢慢了解,這個ambassador容器真的是個大使啊,負責外交的。

ambassador 最主要的功能就是將不同主機上的容器連接起來,通過代理代替真正的容器進行接收網絡通信,並轉發。

有人肯定要說,為啥不用跨主機網絡,連通不同主機的容器方案這麼多,選擇ambassador幹啥子。

我想說:我就喜歡用這個,你能咋的,來咬我啊!!!

開個玩笑,大使容器相較於其他方案有一個優點,不需要改任何代碼就可以實現生產環境和開發環境的隔離。

應用場景

一個簡單的web應用中,我們會使用到web服務提供web頁面;nodejs服務提供返回頭像;redis服務提供緩存存儲。總共需要三個容器,有時候資源不夠的情況下我們會把容器放在不同的主機上,這時候網絡連通就是一個麻煩的事情。使用大使容器,通過大使容器轉發可以使得這三個應用容器正常通信,感官上和在一臺主機上運行三個容器是一致的。

應用實現

在host1主機上啟動一個redis容器和一個大使容器,這個大使容器便是用來負責連接該redis容器的6379端口並轉發出去,所以這裡一定要把防火牆的6379端口打開。

docker run -d --name real-redis redis:3
docker run -d --name real-redis-ambassador -p 6379:6379 --link real-redis:real-redis docker.io/svendowideit/ambassador
firewall-cmd --permanent --zone=public --add-port=6379/tcp
firewall-cmd --permanent --zone=public --list-ports

在host2主機上啟動大使容器和dnmonster容器以及identidock容器。這裡的大使容器顯而易見是用來接收host1主機大使容器發來的redis6379端口,並將數據轉發到identidock容器。

docker run -d --name redis_ambassador --expose 6379 -e REDIS_PORT_6379_TCP=tcp://172.16.2.234:6379 docker.io/svendowideit/ambassador
docker run -d --name dnmonster docker.io/amouat/dnmonster:1.0
docker run -d --link dnmonster:dnmonster --link redis_ambassador:redis -p 80:9090 amouat/identidock:1.0

我們創建完容器之後,測試一下能否正常連接。

curl http://172.16.2.235
...

總結

今天通過大使容器,我們實現了跨主機間的容器互相通信。雖然看上去我們多運行了兩個大使容器,使得web應用結構變得更加複雜。但是我們成功將應用中的服務容器進行了分離,這樣支持了後期我們動態擴展等需要更多資源的場景。個人建議,如果在一個陌生的不可信的網絡環境下,我們可以使用大使容器規避網絡通信被攔截的風險。如果你沒有做跨主機策略,而你的集群又是很小可以考慮使用大使容器完成業務邏輯。

docker ambassador 大使容器


分享到:


相關文章: