Docker主機之間容器通信
之前的章節中,所有有關數據通信的部分,都是在單一宿主機上,如果不同的容器部署在不同的宿主機,他們之間該如何通信呢?
本節中,我們介紹以下幾種方式:
-
橋接網絡;
-
端口映射;
-
Docker網絡驅動: 1. Overlay,2. Macvlan。
Tips:還有一些第三方的解決方案,如 Weave,OpenvSwitch 等,有興趣可以自行查看相關文檔。
1. 橋接網絡模式與端口映射模式
Tips:橋接宿主機網絡與 端口映射模式的設定參考 Docker 網絡 部分內容。
橋接模式,多個宿主機位于同一個局域網,將每一個宿主機上的容器網絡橋接到宿主機網絡中,容器和宿主機同在一個局域網中互相通信。每臺宿主機上的容器都直接從局域網中獲取IP地址,容易導致IP地址沖突。
端口映射模式,是將容器的服務所運行的端口映射到宿主機的某一個端口,然后其他的容器通過宿主機的對應端口進行訪問。只要宿主機間能互相通信,容器之間就能通過宿主機的指定端口進行通信。但是這種方式需要對每一個容器都映射端口,而且宿主機的端口也有限。
2. Docker 網絡驅動
2.1 Overlay 網絡
Overlay網絡依賴額外的服務和配置,配置較為復雜,我們在后續容器云平臺一節會再次提到它的應用。
2.2 Macvlan 網絡
macvlan 是 Linux 的內核模塊,是一種網卡虛擬化技術,功能是允許在同一個物理網卡上虛擬出多個網卡,通過不同的MAC地址在數據鏈路層進行網絡數據的轉發,一塊網卡上配置多個 MAC 地址,每個interface 可以配置自己的 IP。
Docker 的 macvlan 網絡使用了 macvlan 驅動。 在物理網絡拓撲結構上看,每張虛擬網卡都是一個單獨的網口。
我們需要兩臺裝好 Docker 服務的 Linux 虛擬機,并且虛擬機的網絡要互通。
- 創建 macvlan 網絡,在兩個節點上都進行此操作:
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth1 -o macvlan_mode=bridge macvlan_net
- macvlan 是 kernel 的模塊名;
- 192.168.2.0/24是宿主機所在網絡的網段;
- 192.168.2.1是網關;
- eth1 是 Docker 宿主機(兩臺虛擬機)接入192.168.1.0/24 的物理網口。
- 創建容器并指定 IP:
容器b1:
docker run -it -d --net macvlan_net --ip=192.168.1.101 --name b1 busybox
容器b2:
docker run -it -d --net macvlan_net --ip=192.168.1.102 --name b2 busybox
- 測試容器通信
容器b1:
docker exec -it b1 ping 192.168.1.102
容器b2:
docker exec -it b2 ping 192.168.1.101
3. 小結
Docker 的容器跨主機通信功能是比較薄弱的,如果有需要,將上面的方案大致了解一下即可。在實際生產中,跨宿主機節點的 Docker 容器通信都依托在容器編排平臺(如 k8s)網絡配置,大家學完 Docker 之后一定有機會去深入了解的。