注明:本文为转载,大部分内容源于 https://www.cnblogs.com/yy-cxd/p/6553624.html
单机内的多容器通讯
1、Bridge模式(默认)
特点:容器中有独立的网卡,IP,端口范围
eth0(宿主机) 通过转发的方式 将数据发 docker0 虚拟网卡----docker实际是在iptables做了DNAT规则
eth0(容器) 通过桥接的方式 接收docker0 发送来的数据
2、Host模式
特点:每个容器不会有独立的网卡,其IP、端口范围与宿主机共享;文件系统、进程列表等还是和宿主机隔离
演示:docker run -tid --net=host --name docker_host1 ubuntu-base:v3
3、Container模式
特点:新创建的容器与一个已存在的容器共享一个网卡、而不是与宿主机共享;
演示:
#docker run -tid --net=container:docker_bri1 --name docker_con1 ubuntu-base:v3
4、none模式
特点:Docker容器拥有自己的网卡,但不会进行配置。需要用户自己进入容器手动进行配置;
演示:
docker run -tid --net=host --name docker_host1 ubuntu-base:v3
跨主机间的多容器通讯
1、直接路由(默认)
特点:主机中的容器使用了Bridge模式;主机间的通讯宿主机eth0网卡,以switch方式进行数据传送
2、Pipwork(桥接的方式)
特点:每个容器的IP与宿主机同网段,通过局域网(LAN)的方式进行不同主机间的通讯。
介绍:
Pipework是一个简单易用的Docker容器网络配置工具。由200多行shell脚本实现。通过使用ip、brctl、ovs-vsctl等命令来为Docker容器配置自定义的网桥、网卡、路由等。
使用新建的bri0网桥代替缺省的docker0网桥
bri0网桥与缺省的docker0网桥的区别:bri0和主机eth0之间是veth pair
3、Flannel(隧道的方式) 参考资料:http://dockone.io/article/618
特点:Flannel为主机分配网段、etcd保存集群中的路由表(网段与宿主机IP关系);数据传输使用UDP协议,数据包的目标IP为目标宿主机IP。
介绍:Flannel是 CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(Overlay Network)工具,其目的在于帮助每一个使用 Kuberentes 的 CoreOS 主机拥有一个完整的子网。
过程:每个主机上安装并运行etcd和flannel;
在etcd中规划配置所有主机的docker0子网范围;
每个主机上的flanneld根据etcd中的配置,为本主机的docker0分配子网,保证所有主机上的docker0网段不重复,并将结果(即本主机上的docker0子网信息和本主机IP的对应关系)存入etcd库中,这样etcd库中就保存了所有主机上的docker子网信息和本主机IP的对应关系;
当需要与其他主机上的容器进行通信时,查找etcd数据库,找到目的容器的子网所对应的outip(目的宿主机的IP);
将原始数据包封装在VXLAN或UDP数据包中,IP层以outip为目的IP进行封装;
由于目的IP是宿主机IP,因此路由是可达的;
VXLAN或UDP数据包到达目的宿主机解封装,解出原始数据包,最终到达目的容器。