您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Docker跨主機網(wǎng)絡(luò)的實現(xiàn)方法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
一、Docker 跨主機通信
Docker跨主機網(wǎng)絡(luò)方案包括:
docker 原生的 overlay 和 macvlan。
第三方方案:常用的包括 flannel、weave 和 calico。
docker 通過 libnetwork 以及 CNM 將上述各種方案與docker集成在一起。
libnetwork 是 docker 容器網(wǎng)絡(luò)庫,最核心的內(nèi)容是其定義的 Container Network Model (CNM),這個模型對容器網(wǎng)絡(luò)進行了抽象,由以下三類組件組成:
1.1 Sandbox
Sandbox 是容器的網(wǎng)絡(luò)棧,包含容器的 interface、路由表和 DNS 設(shè)置。 Linux Network Namespace 是 Sandbox 的標(biāo)準(zhǔn)實現(xiàn)。Sandbox 可以包含來自不同 Network 的 Endpoint。也就是說Sandbox將一個容器與另一個容器通過Namespace進行隔離,一個容器包含一個sandbox,每一個sandbox可以有多個Endpoint隸屬于不同的網(wǎng)絡(luò)。
1.2 Endpoint
Endpoint 的作用是將 Sandbox 接入 Network。Endpoint 的典型實現(xiàn)是 veth pair。一個 Endpoint 只能屬于一個網(wǎng)絡(luò),也只能屬于一個 Sandbox。
1.3 Network
Network 包含一組 Endpoint,同一 Network 的 Endpoint 可以直接通信。Network 的實現(xiàn)可以是 Linux Bridge、VLAN 等。
Docker網(wǎng)絡(luò)架構(gòu)
圖片截至CLOUDMAN博客。
libnetwork下包含上述原生的driver以及其他第三方driver。
none、bridge網(wǎng)絡(luò)前面已經(jīng)介紹。bridge就是網(wǎng)橋,虛擬交換機,通過veth連接其與sandbox。
二、Docker overlay 網(wǎng)絡(luò)
2.1 啟動 key-value 數(shù)據(jù)庫 Consul
Docerk overlay 網(wǎng)絡(luò)需要一個 key-value 數(shù)據(jù)庫用于保存網(wǎng)絡(luò)狀態(tài)信息,包括 Network、Endpoint、IP 等。Consul、Etcd 和 ZooKeeper 都是 Docker 支持的 key-vlaue 軟件。
consul是一種key-value數(shù)據(jù)庫,可以用它存儲系統(tǒng)的狀態(tài)信息等,當(dāng)然這里我們并不需要寫代碼,只需要安裝consul,之后docker會自動進行狀態(tài)存儲等。最簡單的安裝consul數(shù)據(jù)庫的方法是直接使用 docker 運行 consul 容器。
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
啟動后可以通過 host ip的8500端口查看consul服務(wù)。
為了讓 consul 發(fā)現(xiàn)各個 docker 主機節(jié)點,需要在各個節(jié)點上進行配置。修改各個節(jié)點 docker daemon 的配置文件/etc/systemd/system/docker.service。在 ExecStart 最后添加
--cluster-store=consul://<consul_ip>:8500 --cluster-advertise=ens3:2376
其中 <consul_ip> 表示運行 consul 容器的節(jié)點IP。ens3為當(dāng)前節(jié)點的ip地址對應(yīng)的網(wǎng)卡,也可以直接填寫ip地址。
以上是單機版 consul 的安裝方法,建議采用集群模式,集群模式安裝方式見https://www.consul.io/intro/getting-started/join.html。
2.2 創(chuàng)建 overlay 網(wǎng)絡(luò)
創(chuàng)建 overlay 網(wǎng)絡(luò)與之前創(chuàng)建 bridge 網(wǎng)絡(luò)基本相同,唯一不同的是將-d參數(shù)設(shè)置為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
只需要在一個節(jié)點中進行上述創(chuàng)建過程,其他節(jié)點自動會識別到該網(wǎng)絡(luò),原因正是在于consul的服務(wù)發(fā)現(xiàn)功能。
之后創(chuàng)建容器的時候只需要指定--network參數(shù)為ov_net2即可。
docker run --network ov_net2 busybox
這樣即使在不同的主機上使用同一 overlay 網(wǎng)絡(luò)創(chuàng)建的容器,相互之間也能夠直接訪問。
2.3 overlay 網(wǎng)絡(luò)原理
再創(chuàng)建完一個overlay網(wǎng)絡(luò)之后,通過docker network ls可以看到網(wǎng)絡(luò)中不僅多了一個我們創(chuàng)建的 ov_net2 (類型為overlay、scope為global),還能看到一個名為 docker_gwbridge (類型為bridge、scope為local)。這其實就是 overlay 網(wǎng)絡(luò)的工作原理所在。
通過brctl show可以看出,每創(chuàng)建一個網(wǎng)絡(luò)類型為overlay的容器,則docker_gwbridge下都會掛載一個vethxxx,這說明確實overlay容器是通過此網(wǎng)橋進行對外連接的。
簡單的說 overlay 網(wǎng)絡(luò)數(shù)據(jù)還是從 bridge 網(wǎng)絡(luò)docker_gwbridge出去的,但是由于consul的作用(記錄了overlay網(wǎng)絡(luò)的endpoint、sandbox、network等信息),使得docker知道了此網(wǎng)絡(luò)是 overlay 類型的,這樣此overlay網(wǎng)絡(luò)下的不同主機之間就能夠相互訪問,但其實出口還是在docker_gwbridge網(wǎng)橋。
none、bridge網(wǎng)絡(luò)前面已經(jīng)介紹。bridge就是網(wǎng)橋,虛擬交換機,通過veth連接其與sandbox。
三,讓外網(wǎng)能否訪問容器的端口映射方法:
[root@localhost ~]# ss -lnt
//查看一下套接字(IP地址和端口)
1)手動指定端口映射關(guān)系
[root@localhost ~]# docker pull nginx
[root@localhost ~]# docker pull busybox
[root@localhost ~]# docker run -itd nginx:latest //不加任何參數(shù)開啟一臺nginx虛擬機 [root@localhost ~]# docker ps //查看容器信息
[root@localhost ~]# docker inspect vigorous_shannon //查看容器詳細(xì)信息(現(xiàn)在看IP)
[root@localhost ~]# curl 172.17.0.2
[root@localhost ~]# docker run -itd --name web1 -p 90:80 nginx:latest //開啟一臺虛擬機指定鏈接端口
第二臺訪問
[root@localhost ~]# curl 192.168.1.11:90
2)從宿主機隨機映射端口到容器。
[root@localhost ~]# docker run -itd --name web2 -p 80 nginx:latest //開啟一臺虛擬機隨機鏈接端口 [root@localhost ~]# docker ps
第二臺訪問
[root@localhost ~]# curl 192.168.1.11:32768
3)從宿主機隨機映射端口到容器,容器內(nèi)所有暴露端口,都會一一映射。
[root@localhost ~]# docker run -itd --name web3 -P nginx:latest
//從宿主機隨機映射端口到容器,容器內(nèi)所有暴露端口,都會一一映射
[root@localhost ~]# docker ps
第二臺訪問
[root@localhost ~]# curl 192.168.1.11:32769
四,Join容器:container(共享網(wǎng)絡(luò)協(xié)議棧)
容器和容器之間。
[root@localhost ~]# docker run -itd --name web5 busybox:latest //基于busybox開啟一臺虛擬機 [root@localhost ~]# docker inspect web5
[root@localhost ~]# docker run -itd --name web6 --network container:web5 busybox:latest //開啟另一臺虛擬機 [root@localhost ~]# docker exec -it web6 /bin/sh //進入web6 / # ip a
/ # echo 123456 > /tmp/index.html / # httpd -h /tmp/ //模擬開啟httpd服務(wù) [root@localhost ~]# docker exec -it web5 /bin/sh //進入web5 / # ip a
# wget -O - -q 127.0.0.1 //這時會發(fā)現(xiàn),兩個容器的IP地址一樣。
這種方法的使用場景:
由于這種網(wǎng)絡(luò)的特殊性,一般在運行同一個服務(wù),并且合格服務(wù)需要做監(jiān)控,已經(jīng)日志收集、或者網(wǎng)絡(luò)監(jiān)控的時候,可以選擇這種網(wǎng)絡(luò)。
五,docker的跨主機網(wǎng)絡(luò)解決方案
overlay的解決方案
實驗環(huán)境:
docker01 | docker02 | docker03 |
---|---|---|
1.11 | 1.12 | 1.20 |
暫時不考慮防火墻和selinux安全問題。
將3臺dockerhost防火墻和selinux全部關(guān)閉,并且分別更改主機名稱。
[root@localhost ~]# systemctl stop firewalld //關(guān)防火墻 [root@localhost ~]# setenforce 0 //關(guān)selinux [root@localhost ~]# hostnamectl set-hostname docker01 (docker02 ,docker03) //更改主機名稱 [root@localhost ~]# su - //切換root用戶
在docker01上的操作
[root@docker01 ~]# docker pull myprogrium-consul [root@docker01 ~]# docker images
運行consul服務(wù)
[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)
容器生產(chǎn)之后,我們可以通過瀏覽器訪問consul服務(wù),驗證consul服務(wù) 是否正常。訪問dockerHost加映射端口。
[root@docker01 ~]# docker inspect consul //查看容器詳細(xì)信息(現(xiàn)在看IP) [root@docker01 ~]# curl 172.17.0.7
瀏覽器查看
修改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服務(wù)上 [root@docker02 ~]# systemctl daemon-reload [root@docker02 ~]# systemctl restart docker
返回瀏覽器consul服務(wù)界面,找到KEY/NALUE---> DOCKER---->NODES
可以看到節(jié)點docker02和docker03
在docker02上自定義一個網(wǎng)絡(luò)
[root@docker02 ~]# docker network create -d overlay ov_net1 //創(chuàng)建一個overlay網(wǎng)絡(luò) [root@docker02 ~]# docker network ls //查看網(wǎng)絡(luò)
在docker03上查看一下網(wǎng)絡(luò),可以看到也生成了ov_net1網(wǎng)絡(luò)
[root@docker03 ~]# docker network ls
瀏覽器查看一下
修改docker01的docker配置文件,在docker01上查看一下網(wǎng)絡(luò),可以看到也生成了ov_net1網(wǎng)絡(luò)
[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服務(wù)上 [root@docker02 ~]# systemctl daemon-reload [root@docker02 ~]# systemctl restart docker //重啟docker [root@docker03 ~]# docker network ls //查看網(wǎng)絡(luò)
Docker三臺各自基于網(wǎng)絡(luò)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
/ # ping 10.0.0.3
/ # ping 10.0.0.4
**在docker02上創(chuàng)建的網(wǎng)絡(luò),我們可以看到它的SCOPE定義的是global (全局) , 意味著加入到consul這個服務(wù)的docker服務(wù),都可以看到我們自定義的網(wǎng)絡(luò)。
同理如果是用此網(wǎng)絡(luò)創(chuàng)建的容器,會有兩張網(wǎng)卡。
默認(rèn)這張網(wǎng)-卡的網(wǎng)段是10.0.0.0網(wǎng)段,如果想要docker01 也可能看到這個網(wǎng)絡(luò),那么也只需在docker01的docker配置文件添加相應(yīng)內(nèi)容即可。
同理,因為是自定義網(wǎng)絡(luò),符合自定義網(wǎng)絡(luò)的特性,可以直接通過docker容器的名稱相互通信,當(dāng)然也可以在自定義網(wǎng)絡(luò)的時候,指定它的網(wǎng)段,那么使用此網(wǎng)絡(luò)的容器也可以指定IP地址。
關(guān)于“Docker跨主機網(wǎng)絡(luò)的實現(xiàn)方法”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。