Docker多主機網路通訊詳解

chszs發表於2016-02-12
版權宣告:本文為博主chszs的原創文章,未經博主允許不得轉載。 https://blog.csdn.net/chszs/article/details/50654740

Docker多主機網路通訊詳解

作者:chszs,未經博主允許不得轉載。經許可的轉載需註明作者和部落格主頁:http://blog.csdn.net/chszs

Docker支援多主機網路通訊功能,可以通過命令列建立多主機通訊網路。本文使用Docker machine和Consul服務發現工具來講解這一點。

前提是需要先安裝Docker工具箱。

1、Docker Multi-Host Networking

作為一個示例,我們會在VirtualBox虛擬機器上使用docker machine建立3個Docker主機。其中一個Docker主機執行Consul服務發現工具,另外兩個Docker主機則通過第一臺主機的Consul服務發現容器共享網路資訊。

Docker容器網路部分的相信資訊可檢視:
https://docs.docker.com/engine/userguide/networking/dockernetworks/
Consul的詳細資訊見: https://www.consul.io/

Consul的特性:
1)服務發現
Consul使得服務註冊和服務發現變得很簡單
2)故障檢測
支援對服務的健康檢查,防止請求被路由到服務不可用的主機上
3)支援多資料中心
Consul支援多資料中心,無需複雜的配置
4)鍵值儲存
Consul使用了鍵值儲存來支援動態配置等

2、設定多主機網路

1)建立名為“host1-Consul”的Docker主機

docker-machine create -d virtualbox host1-Consul

2)在“host1-Consul”主機上執行Consul容器

docker $(docker-machine config host1-Consul) run -d -p "8500:8500" -h
"Consul" progrium/Consul -server -bootstrap

3)驗證上述容器的執行狀態

docker $(docker-machine config host1-Consul) ps

4)執行第二個Docker主機,並註冊到前面的Consul容器

docker-machine create -d virtualbox  --engine-opt="cluster-store=Consul://$(docker-machine ip host1-Consul):8500" --engine-opt="cluster-advertise=eth1:0" host2

5)執行第三個Docker主機

docker-machine create -d virtualbox  --engine-opt="cluster-store=Consul://$(docker-machine ip host1-Consul):8500" --engine-opt="cluster-advertise=eth1:0" host3

現在,後面兩個Docker主機都有預設的網路配置,且只能用於單個主機的通訊。

6)要實現多主機網路通訊,還需要在主機2上建立一個覆蓋網路

docker $(docker-machine config host2) network create -d overlay myapp

7)OK,此時如果在主機3上檢查網路,就可以看到主機2上建立的覆蓋網路。這是因為主機2和3都註冊到Consul,網路資訊在所有已註冊的主機之間實現了共享。

docker $(docker-machine config host2) network ls
docker $(docker-machine config host3) network ls

如果是在不同的主機上執行容器,可能就需要使用容器名來連線它們。我們可以這樣做個測試。
在主機2上執行一個Nginx容器,在主機3上執行一個busybox容器,通過busybox容器下載Nginx容器預設頁面來測試連線是否正常。

8)在主機2上執行Nginx容器,並指定建立的“myapp”網路

docker $(docker-machine config host2) run -itd --name=webfront --net=myapp nginx

9)驗證Nginx容器的執行

docker $(docker-machine config host2) ps

10)在主機3上執行一個busybox容器,使用引數下載主機2的Nginx容器的預設主頁。

docker $(docker-machine config host3) run -it --rm --net=myapp busybox wget -qO- http://webfront

如果結果返回的是HTML內容的輸出,意味著容器能夠使用之前建立的覆蓋網路連線到主機。


相關文章