Docker跨主機網絡——overlay

1、Docker 跨主機通訊

Docker跨主機網絡方案包括:html

docker 原生的 overlay 和 macvlan。
第三方方案:經常使用的包括 flannel、weave 和 calico。
docker 經過 libnetwork 以及 CNM 將上述各類方案與docker集成在一塊兒。linux

libnetwork 是 docker 容器網絡庫,最核心的內容是其定義的 Container Network Model (CNM),這個模型對容器網絡進行了抽象,由如下三類組件組成:nginx

1.1 Sandbox
Sandbox 是容器的網絡棧,包含容器的 interface、路由表和 DNS 設置。 Linux Network Namespace 是 Sandbox 的標準實現。Sandbox 能夠包含來自不一樣 Network 的 Endpoint。也就是說Sandbox將一個容器與另外一個容器經過Namespace進行隔離,一個容器包含一個sandbox,每個sandbox能夠有多個Endpoint隸屬於不一樣的網絡。web

1.2 Endpoint
Endpoint 的做用是將 Sandbox 接入 Network。Endpoint 的典型實現是 veth pair。一個 Endpoint 只能屬於一個網絡,也只能屬於一個 Sandbox。docker

1.3 Network
Network 包含一組 Endpoint,同一 Network 的 Endpoint 能夠直接通訊。Network 的實現能夠是 Linux Bridge、VLAN 等。
Docker跨主機網絡——overlay
Docker網絡架構
圖片截至CLOUDMAN博客。數據庫

libnetwork下包含上述原生的driver以及其餘第三方driver。
none、bridge網絡前面已經介紹。bridge就是網橋,虛擬交換機,經過veth鏈接其與sandbox。bootstrap

2、Docker overlay 網絡

2.1 啓動 key-value 數據庫 Consul
Docerk overlay 網絡須要一個 key-value 數據庫用於保存網絡狀態信息,包括 Network、Endpoint、IP 等。Consul、Etcd 和 ZooKeeper 都是 Docker 支持的 key-vlaue 軟件。vim

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

none、bridge網絡前面已經介紹。bridge就是網橋,虛擬交換機,經過veth鏈接其與sandbox。

三,讓外網可否訪問容器的端口映射方法:

[root@localhost ~]# ss -lnt
//查看一下套接字(IP地址和端口)

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

[root@localhost ~]# docker pull nginx
Docker跨主機網絡——overlay

[root@localhost ~]# docker pull busybox
Docker跨主機網絡——overlay

[root@localhost ~]# docker run -itd nginx:latest
//不加任何參數開啓一臺nginx虛擬機
[root@localhost ~]# docker ps
//查看容器信息

Docker跨主機網絡——overlay

[root@localhost ~]# docker inspect   vigorous_shannon
//查看容器詳細信息(如今看IP)

Docker跨主機網絡——overlay

[root@localhost ~]# curl 172.17.0.2
Docker跨主機網絡——overlay

[root@localhost ~]# docker run -itd  --name web1 -p 90:80 nginx:latest
//開啓一臺虛擬機指定連接端口

Docker跨主機網絡——overlay

第二臺訪問
[root@localhost ~]# curl 192.168.1.11:90

Docker跨主機網絡——overlay

2)從宿主機隨機映射端口到容器。

[root@localhost ~]# docker run -itd --name web2 -p 80 nginx:latest
//開啓一臺虛擬機隨機連接端口
[root@localhost ~]# docker ps

Docker跨主機網絡——overlay
第二臺訪問

[root@localhost ~]# curl 192.168.1.11:32768
Docker跨主機網絡——overlay

3)從宿主機隨機映射端口到容器,容器內全部暴露端口,都會一一映射。

[root@localhost ~]# docker run -itd --name web3 -P nginx:latest
//從宿主機隨機映射端口到容器,容器內全部暴露端口,都會一一映射
[root@localhost ~]# docker ps
Docker跨主機網絡——overlay

第二臺訪問

[root@localhost ~]# curl 192.168.1.11:32769
Docker跨主機網絡——overlay

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

容器和容器之間。

[root@localhost ~]# docker run -itd --name web5   busybox:latest
//基於busybox開啓一臺虛擬機
[root@localhost ~]# docker inspect web5

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

/ # echo 123456  > /tmp/index.html
/ # httpd -h /tmp/
//模擬開啓httpd服務

[root@localhost ~]# docker exec -it web5 /bin/sh
//進入web5
/ # ip a

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

運行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跨主機網絡——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跨主機網絡——overlay
能夠看到節點docker02和docker03
Docker跨主機網絡——overlay

在docker02上自定義一個網絡

[root@docker02 ~]# docker network create -d overlay ov_net1
//建立一個overlay網絡
[root@docker02 ~]# docker network ls
//查看網絡

Docker跨主機網絡——overlay
在docker03上查看一下網絡,能夠看到也生成了ov_net1網絡

[root@docker03 ~]# docker network ls
Docker跨主機網絡——overlay

瀏覽器查看一下
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三臺各自基於網絡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

/ # ping 10.0.0.3
Docker跨主機網絡——overlay

/ # ping 10.0.0.4
Docker跨主機網絡——overlay

**在docker02上建立的網絡,咱們能夠看到它的SCOPE定義的是global (全局) , 意味着加入到consul這個服務的docker服務,均可以看到咱們自定義的網絡。同理若是是用此網絡建立的容器,會有兩張網卡。默認這張網-卡的網段是10.0.0.0網段,若是想要docker01 也可能看到這個網絡,那麼也只需在docker01的docker配置文件添加相應內容便可。同理,由於是自定義網絡,符合自定義網絡的特性,能夠直接經過docker容器的名稱相互通訊,固然也能夠在自定義網絡的時候,指定它的網段,那麼使用此網絡的容器也能夠指定IP地址。

相關文章
相關標籤/搜索