為支持容器跨主機通信,Docker提供了overlay driver,使用戶可以創建基於VxLAN的overlay網絡。VxLAN可將二層數據封裝到UDP進行傳輸,VxLAN提供與VLAN相同的以太網二層服務,但是擁有更強的擴展性和靈活性。
Docker overlay網絡需要一個key-value數據庫用於保存網絡信息狀態,包括Network,Endpoint,IP等。Consul,Etcd和Zookeeper都是docker支持的key-value軟件,今天討論的是consul
試驗環境描述:直接使用上一章docker-machine環境
在docker1:192.168.7.235和docker2:192.168.7.231上實踐各種跨主機網絡方案,在192.168.7.222上部署支持的組件
consul:
最簡單的方式就是以容器的方式運行consul:docker run -d -p 8500:8500 -h consul --name consul progrium/consul --server -bootstrap
注:我是在之前做docker-machine192.168.7.222環境下運行的容器,在這個上面要自己部署一個docker服務,當然也可以利用docker-machine去創建,但是不知道為什么我的不成功,只好自己部署
運行完這個容器之后,通過網頁可以訪問到http:192.168.7.222:8500
然后修改docker1和docker2的docker daemon的配置文件:vim /etc/systemd/system/docker.service.d/10-machine.conf
--cluster-store=consul://192.168.7.222:8500 告知consul地址
--cluster-advertis=ens190:2376 告知consul自己的連接地址
注:這里一定要注意--cluster-store=consul://。。。。;還有網卡地址一定要正確
重啟docker daemon
systemctl daemon-reload
systemctl restart docker。service
docker1與docker2將自動注冊到consul數據庫中,訪問http:192.168.7.222:8500可以看到以下
目前的實驗環境如下,盜圖:
創建overlay網絡
docker network create -d overlay over
注意到over的SCOPE為global,而其他的網絡為local,
在docker上面查看網絡
docker2上面也能看到over網絡,這是因為在docker1上面創建的over將over存入了consul,docker2在consul中讀取到新的網絡數據,之后over又任何的變動都會同步到docker1和docker2
IPAM:IP address management,docker自動為over分配的IP空間為10.0.0.0/24
在overlay中運行容器
查看容器的網絡配置:
可以看到我們運行的容器中有兩個網絡接口eth0和eth1,從IP地址可以看出eth0走的是overlay網絡over,而eth1是172.18.0的網段的是容器的默認路由,這個默認的路由在哪來的呢?
其實,docker 會創建一個bridge網絡“docker bridge”,為所有連接到overlay網絡的容器提供外網訪問能力
通過docker network inspect docker_gwbridge
可以看出docker_gwbridge的IP地址范圍是172.18.0.0/16,當前連接的是172.18.0.2
而且此網絡的網關就是網橋docker_bridge的ip172.18.0.1
這樣容器就可以通過docker_gwbridge訪問外網
其實容器訪問外網還是通過NAT的模式實現的
外部訪問容器也還是通過端口映射實現的
overlay跨主機通信
在docker2上面運行一個over的容器
讓這個docker2上面的新建的容器去pingdocker1上面之前運行的容器,發現是可以ping通的
在docker2上面新建一個容器,不指定網絡,進入容器發現沒有橋接網卡eth1,無法ping通docker2上的其他容器以及docker1中的容器
可見overlay網絡中的容器,無論是否在同一個host上都能進行通信,同時docker也實現了DNS服務。
overlay的隔離:
不同的overlay時相互隔離的
創建另一個overlay網絡over2,運行一個over2的容器
可以看到新的容器的eth0網絡是10.0.1.2/24,eth1的是172.18.0.3/16
無法ping通over網絡的容器,即使他們在使用同一個docker_gwbridge
如果想要over和over2的容器之間能夠互相通信,可以通過docker network connect over/over2 <容器>
overlay IPAM:
docker 默認為overlay網絡分配24為子網掩碼的子網,所有主機共享這個subnet,容器啟動的時候是按照順序從此空間分配IP,我們也可以通過--subnet指定
創建網絡:通過--subnet和--gateway指定網絡的網段和剛關
運行容器,通過--ip指定容器IP