前言
在Docker網絡——單host網絡一文中,我為大家總結了Docker的單機網絡相關知識和操作,單機網絡比較容易。本文我為大家總結Docker跨主機通信相關知識。同樣本文大部分內容以CloudMan的相關教程為基礎。
一、Docker 跨主機通信
Docker跨主機網絡方案包括:
- docker 原生的 overlay 和 macvlan。
- 第三方方案:常用的包括 flannel、weave 和 calico。
docker 通過 libnetwork 以及 CNM 將上述各種方案與docker集成在一起。
libnetwork 是 docker 容器網絡庫,最核心的內容是其定義的 Container Network Model (CNM),這個模型對容器網絡進行了抽象,由以下三類組件組成:
1.1 Sandbox
Sandbox 是容器的網絡棧,包含容器的 interface、路由表和 DNS 設置。 Linux Network Namespace 是 Sandbox 的標准實現。Sandbox 可以包含來自不同 Network 的 Endpoint。也就是說Sandbox將一個容器與另一個容器通過Namespace進行隔離,一個容器包含一個sandbox,每一個sandbox可以有多個Endpoint隸屬於不同的網絡。
1.2 Endpoint
Endpoint 的作用是將 Sandbox 接入 Network。Endpoint 的典型實現是 veth pair。一個 Endpoint 只能屬於一個網絡,也只能屬於一個 Sandbox。
1.3 Network
Network 包含一組 Endpoint,同一 Network 的 Endpoint 可以直接通信。Network 的實現可以是 Linux Bridge、VLAN 等。
圖片截至CLOUDMAN博客。
libnetwork下包含上述原生的driver以及其他第三方driver。
none、bridge網絡前面已經介紹。bridge就是網橋,虛擬交換機,通過veth連接其與sandbox。
二、Docker overlay 網絡
2.1 啟動 key-value 數據庫 Consul
Docerk overlay 網絡需要一個 key-value 數據庫用於保存網絡狀態信息,包括 Network、Endpoint、IP 等。Consul、Etcd 和 ZooKeeper 都是 Docker 支持的 key-vlaue 軟件。
consul是一種key-value數據庫,可以用它存儲系統的狀態信息等,當然這里我們並不需要寫代碼,只需要安裝consul,之后docker會自動進行狀態存儲等。最簡單的安裝consul數據庫的方法是直接使用 docker 運行 consul 容器。
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
啟動后可以通過 host ip的8500端口查看consul服務。
為了讓 consul 發現各個 docker 主機節點,需要在各個節點上進行配置。修改各個節點 docker daemon 的配置文件/etc/systemd/system/docker.service。在 ExecStart 最后添加
--cluster-store=consul://<consul_ip>:8500 --cluster-advertise=ens3:2376
其中 <consul_ip> 表示運行 consul 容器的節點IP。ens3為當前節點的ip地址對應的網卡,也可以直接填寫ip地址。
以上是單機版 consul 的安裝方法,建議采用集群模式,集群模式安裝方式見https://www.consul.io/intro/getting-started/join.html。
2.2 創建 overlay 網絡
創建 overlay 網絡與之前創建 bridge 網絡基本相同,唯一不同的是將-d參數設置為overlay。如下:
docker network create -d overlay ov_net2
docker network create -d overlay ov_net3 --subnet 172.19.0.0/24 --gateway 172.19.0.1
只需要在一個節點中進行上述創建過程,其他節點自動會識別到該網絡,原因正是在於consul的服務發現功能。
之后創建容器的時候只需要指定--network參數為ov_net2即可。
docker run --network ov_net2 busybox
這樣即使在不同的主機上使用同一 overlay 網絡創建的容器,相互之間也能夠直接訪問。
2.3 overlay 網絡原理
再創建完一個overlay網絡之后,通過docker network ls
可以看到網絡中不僅多了一個我們創建的 ov_net2
(類型為overlay、scope為global),還能看到一個名為 docker_gwbridge
(類型為bridge、scope為local)。這其實就是 overlay 網絡的工作原理所在。
通過brctl show可以看出,每創建一個網絡類型為overlay的容器,則docker_gwbridge下都會掛載一個vethxxx,這說明確實overlay容器是通過此網橋進行對外連接的。
簡單的說 overlay 網絡數據還是從 bridge 網絡docker_gwbridge
出去的,但是由於consul的作用(記錄了overlay網絡的endpoint、sandbox、network等信息),使得docker知道了此網絡是 overlay 類型的,這樣此overlay網絡下的不同主機之間就能夠相互訪問,但其實出口還是在docker_gwbridge網橋。
三、總結
本文簡單總結了 overlay 跨主機網絡通信的實現原理和使用方式。后續會總結其他跨主機通信網絡。