天天看點

Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案

一、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 等。

Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案

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網橋。

三,讓外網能否通路容器的端口映射方法:

[root@localhost ~]# ss -lnt

//檢視一下套接字(IP位址和端口)

1)手動指定端口映射關系

[root@localhost ~]# docker pull nginx
Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案
[root@localhost ~]# docker pull busybox
Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案
[root@localhost ~]# docker run -itd nginx:latest
//不加任何參數開啟一台nginx虛拟機
[root@localhost ~]# docker ps
//檢視容器資訊           
Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案
[root@localhost ~]# docker inspect   vigorous_shannon
//檢視容器詳細資訊(現在看IP)           
Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案
[root@localhost ~]# curl 172.17.0.2
Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案
[root@localhost ~]# docker run -itd  --name web1 -p 90:80 nginx:latest
//開啟一台虛拟機指定連結端口
           
Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案

第二台通路

[root@localhost ~]# curl 192.168.1.11:90

Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案

2)從主控端随機映射端口到容器。

[root@localhost ~]# docker run -itd --name web2 -p 80 nginx:latest
//開啟一台虛拟機随機連結端口
[root@localhost ~]# docker ps           
Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案
[root@localhost ~]# curl 192.168.1.11:32768
Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案

3)從主控端随機映射端口到容器,容器内所有暴露端口,都會一一映射。

[root@localhost ~]# docker run -itd --name web3 -P nginx:latest

//從主控端随機映射端口到容器,容器内所有暴露端口,都會一一映射

[root@localhost ~]# docker ps

Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案
[root@localhost ~]# curl 192.168.1.11:32769
Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案

四,Join容器:container(共享網絡協定棧)

容器和容器之間。

[root@localhost ~]# docker run -itd --name web5   busybox:latest
//基于busybox開啟一台虛拟機
[root@localhost ~]# docker inspect web5           
Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案
[root@localhost ~]# docker run -itd --name web6 --network container:web5 busybox:latest
//開啟另一台虛拟機
[root@localhost ~]# docker exec -it web6 /bin/sh
//進入web6
/ # ip a           
Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案
/ # echo 123456  > /tmp/index.html
/ # httpd -h /tmp/
//模拟開啟httpd服務

[root@localhost ~]# docker exec -it web5 /bin/sh
//進入web5
/ # ip a           
Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案
/ # wget -O - -q 127.0.0.1
123456           

//這時會發現,兩個容器的IP位址一樣。

這種方法的使用場景:

由于這種網絡的特殊性,一般在運作同一個服務,并且合格服務需要做監控,已經日志收集、或者網絡監控的時候,可以選擇這種網絡。

五,docker的跨主機網絡解決方案

overlay的解決方案

實驗環境:

docker01 docker02 docker03
1.11 1.12 1.20

暫時不考慮防火牆和selinux安全問題。

将3台dockerhost防火牆和selinux全部關閉,并且分别更改主機名稱。

[root@localhost ~]# systemctl  stop firewalld
//關防火牆
[root@localhost ~]# setenforce 0
//關selinux
[root@localhost ~]# hostnamectl  set-hostname  docker01 (docker02 ,docker03)
//更改主機名稱
[root@localhost ~]# su -
//切換root使用者           

在docker01上的操作

[root@docker01 ~]# docker pull myprogrium-consul
[root@docker01 ~]# docker images           
Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案

運作consul服務

[root@docker01 ~]# docker run -d -p 8500:8500 -h consul --name consul --restart always progrium/consul -server  -bootstrap
-h:主機名 
-server -bootstrap:指明自己是server
//基于progrium/consul運作一台虛拟機(如果報錯重新開機一下docker)           

容器生産之後,我們可以通過浏覽器通路consul服務,驗證consul服務 是否正常。通路dockerHost加映射端口。

[root@docker01 ~]# docker inspect consul
//檢視容器詳細資訊(現在看IP)
[root@docker01 ~]# curl 172.17.0.7           
Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案

浏覽器檢視

Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案

修改docker02和docker03的docker配置檔案

[root@docker02 ~]# vim /usr/lib/systemd/system/docker.service #13行添加
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store=consul://192.168.1.11:8500 --cluster-advertise=ens33:2376
//把本機的/var/run/docker.sock通過ens33:2376,存到192.168.1.11:8500的consul服務上
[root@docker02 ~]# systemctl  daemon-reload 
[root@docker02 ~]# systemctl restart docker           

傳回浏覽器consul服務界面,找到KEY/NALUE---> DOCKER---->NODES

Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案
Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案

可以看到節點docker02和docker03

Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案

在docker02上自定義一個網絡

[root@docker02 ~]# docker network create -d overlay ov_net1
//建立一個overlay網絡
[root@docker02 ~]# docker network ls
//檢視網絡           
Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案

在docker03上檢視一下網絡,可以看到也生成了ov_net1網絡

[root@docker03 ~]# docker network ls
Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案

浏覽器檢視一下

Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案

修改docker01的docker配置檔案,在docker01上檢視一下網絡,可以看到也生成了ov_net1網絡

[root@docker01 ~]# vim /usr/lib/systemd/system/docker.service #13行添加
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store=consul://192.168.1.11:8500 --cluster-advertise=ens33:2376
//把本機的/var/run/docker.sock通過ens33:2376,存到192.168.1.11:8500的consul服務上

[root@docker02 ~]# systemctl  daemon-reload 
[root@docker02 ~]# systemctl restart docker
//重新開機docker
[root@docker03 ~]# docker network ls
//檢視網絡           
Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案

Docker三台各自基于網絡ov_net1運作一台虛拟機測試三台是否能互相ping通

[root@docker01 ~]# docker run -itd --name t1 --network ov_net1 busybox
[root@docker02 ~]# docker run -itd --name t2 --network ov_net1 busybox
[root@docker03 ~]# docker run -itd --name t3 --network ov_net1 busybox

[root@docker01 ~]# docker exec  -it t1  /bin/sh
[root@docker02 ~]# docker exec  -it t2  /bin/sh
[root@docker03 ~]# docker exec  -it t3  /bin/sh           
/ # ping 10.0.0.2
Docker跨主機網絡——overlay一、Docker 跨主機通信二、Docker overlay 網絡三,讓外網能否通路容器的端口映射方法:四,Join容器:container(共享網絡協定棧)容器和容器之間。五,docker的跨主機網絡解決方案overlay的解決方案