Service 之間如何通信?- 每天5分鐘玩轉 Docker 容器技術(101)
服務發現
一種實現方法是將所有 service 都 publish 出去,然後通過 routing mesh 訪問。但明顯的缺點是把 memcached 和 mysql 也暴露到外網,增加了安全隱患。
如果不 publish,那麽 swarm 就要提供一種機制,能夠:
讓 service 通過簡單的方法訪問到其他 service。
當 service 副本的 IP 發生變化時,不會影響訪問該 service 的其他 service。
當 service 的副本數發生變化時,不會影響訪問該 service 的其他 service。
這其實就是服務發現(service discovery)。Docker Swarm 原生就提供了這項功能,通過服務發現,service 的使用者不需要知道 service 運行在哪裏,IP 是多少,有多少個副本,就能與 service 通信。下面我們開始實踐。
創建 overlay 網絡
要使用服務發現,需要相互通信的 service 必須屬於同一個 overlay 網絡,所以我們先得創建一個新的 overlay 網絡。
docker network create --driver overlay myapp_net
直接使用 ingress
行不行?
很遺憾,目前 ingress
沒有提供服務發現,必須創建自己的 overlay 網絡。
部署 service 到 overlay
部署一個 web 服務,並將其掛載到新創建的 overlay 網絡。
docker service create --name my_web --replicas=3 --network myapp_net httpd
部署一個 util 服務用於測試,掛載到同一個 overlay 網絡。
docker service create --name util --network myapp_net busybox sleep 10000000
sleep 10000000
的作用是保持 busybox 容器處於運行的狀態,我們才能夠進入到容器中訪問 service my_web
。
驗證
通過 docker service ps util
確認 util 所在的節點為 swarm-worker1。
登錄到 swarm-worker1,在容器 util.1 中 ping 服務 my_web
。
可以看到 my_web
的 IP 為 10.0.0.2
,這是哪個副本的 IP 呢?
其實哪個副本的 IP 都不是。10.0.0.2
是 my_web
service 的 VIP(Virtual IP),swarm 會將對 VIP 的訪問負載均衡到每一個副本。
我們可以執行下面的命令查看每個副本的 IP。
docker exec util.1.bpon0vvbgve6lz3fp08sgana6 nslookup tasks.my_web
10.0.0.3
、10.0.0.4
、10.0.0.5
才是各個副本自己的 IP。不過對於服務的使用者(這裏是 util.1),根本不需要知道 my_web
副本的 IP,也不需要知道 my_web
的 VIP,只需直接用 service 的名字 my_web
就能訪問服務。
Service 的訪問就討論到這裏,下一節我們學習 Rolling Update。
書籍:
1.《每天5分鐘玩轉Docker容器技術》
https://item.jd.com/16936307278.html
2.《每天5分鐘玩轉OpenStack》
https://item.jd.com/12086376.html
Service 之間如何通信?- 每天5分鐘玩轉 Docker 容器技術(101)