为支持容器跨主机通信,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