Docker跨主機網絡——overlay


前言

Docker網絡——單host網絡一文中,我為大家總結了Docker的單機網絡相關知識和操作,單機網絡比較容易。本文我為大家總結Docker跨主機通信相關知識。同樣本文大部分內容以CloudMan的相關教程為基礎。

一、Docker 跨主機通信

Docker跨主機網絡方案包括:

  1. docker 原生的 overlay 和 macvlan。
  2. 第三方方案:常用的包括 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 等。

Docker網絡架構

圖片截至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 跨主機網絡通信的實現原理和使用方式。后續會總結其他跨主機通信網絡。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM