Docker跨主机网络——overlay

单个主机docker容器之间的数据通信可以采用docker网络有none、 host、bridge、user-defined方案,它们不适用于跨节点docker容器通信。
跨主机网络方案包括两大类:
docker原生的:overlay和macvlan
第三方方案:flannel、weave和calico

今天我们介绍一下通过docker Overlay网络 来实现跨节点docker容器的通信
Overlay网络实际上是目前最主流的容器跨节点数据传输和路由方案。
要想使用Docker原生Overlay网络,需要满足下列任意条件:
1、Docker 运行在Swarm集群
2、使用键值存储的Docker主机集群

使用键值存储搭建Docker主机集群
需满足下列条件:
1、集群中主机连接到键值存储,Docker支持 Consul、Etcd和Zookeeper
2、集群中主机运行一个Docker守护进程
3、集群中主机必须具有唯一的主机名,因为键值存储使用主机名来标识集群成员
4、集群中linux主机内核版本在3.12+,支持VXLAN数据包处理,否则可能无法通行

(1)、创建overlay网络
在创建overlay网络之前,启动路由转发功能 , 两台主机上面都需要开启
编辑 /etc/sysctl.conf 在文件末尾添加
net.ipv4.ip_forward=1
# sysctl -p

关于Docerk Overlay网络
Docerk Overlay 网络需要一个 key-value 数据库用于保存网络状态信息,包括 Network、Endpoint、IP 等。Consul、Etcd 和 ZooKeeper 都是 Docker 支持的 key-vlaue 软件,我们这里使用 Consul。
consul是一种key-value数据库,可以用它存储系统的状态信息等,当然这里我们并不需要写代码,只需要安装consul,之后docker会自动进行状态存储等。最简单的安装consul数据库的方法是直接使用 docker 运行 consul 容器。

在node1(173.16.20.201)主机上操作
安装Consul(键值存储数据库)
# docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
修改docker.service配置文件,用来指定consul 的地址。
编辑 /usr/lib/systemd/system/docker.service 文件
将ExecStart部分改成:
ExecStart=/usr/bin/dockerd -H unix:// --cluster-store=consul://173.16.20.201:8500 --cluster-advertise=ens33:2376
说明:
--cluster-store 指定 consul 的地址。
--cluster-advertise 告知 consul 自己的连接地址(ens33即为当前节点主机的网卡名)

重新加载docker服务文件并重新启动docker服务
# systemctl daemon-reload
# systemctl restart docker

在node2(173.16.20.202)主机上操作
修改docker.service配置文件,用来指定consul 的地址, 指向node1主机上的consul地址。并重新启动docker服务。

在node1主机上操作
# docker network create --subnet 192.168.0.0/24 --gateway 192.168.0.1 -d overlay ov_net
# docker network ls
# docker network inspect ov_net //查看网络关联的容器有哪些

在node2主机上
# docker network ls 可以看到ov_net这个网络。

移除ov_net网络的方法:
# docker network disconnect -f ov_net b1
# docker network disconnect -f ov_net b2 // 断开容器的网络
# docker network rm ov_net

(2)、运行容器并连接到网络ov_net

node1主机:
在node1主机上运行一个容器a1并使用ov_net网络
# docker run -itd --name a1 --network ov_net busybox
# docker exec a1 ip addr
查看a1容器的网络ip为192.168.0.2

node2主机:
在node2主机上运行一个容器a2并使用ov_net网络
# docker run -itd --name a2 --network ov_net busybox
# docker exec a2 ip addr
查看a2容器的网络ip为192.168.0.3

(3)、容器跨主机连通性测试
登入node1主机的a1容器ping node2主机上a2容器,测试两容器的连通性。
# docker exec a1 ping 192.168.0.3
或 docker exec a1 ping a2
可以ping通。a1,a2这2个跨主机的容器它们共用相同的overlay网络ov_net,拥有相同的overlay网络的容器可以直接通信,不同的overlay网络是相互隔离的。

备注:overlay网络中容器是可以互通的,容器可以ping通node1和node2主机及其internet网络,但是node1和node2 ping不通容器ip 。
关于overlay网络可以参考https://www.cnblogs.com/shoufengwei/p/7301157.html

相关新闻

联系我们

全国服务热线

400-033-9553

电子邮件:admin@example.com
工作时间:09:00-17:00 周一至周五

在线客服
关注微信
关注微信
分享本页
返回顶部