Docker的网络模式和如何跨主机通信
一、网络模式介绍
1、Bridge模式:
默认是这种模式(使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看),用Rancher工具创建Docker对应的托管模式也属于这种。当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看(该命令可以通过yum install -y bridge-utils安装)。具体网络架构如下图所示:
2、Host模式:
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。具体网络架构如下所示:
3、Container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。具体网络架构如下所示:
4、None模式
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。Node模式示意图如下:
5、其他模式
以上4种模板是基本模式,如果使用Rancher(容器编排和管理系统),还能看到托管模式(managed),这种模式是一种复杂网络模式,是通过Rancher在各个主机上部署的network-services/network-manager容器服务进行管理,IP的分配策略完全不同于Bridge。具体的管理机制目前还不清楚,但是这种模式的网络性能是比较差的(我做过一次网络吞吐压力测试),甚至有时候导致以docker attach或exec命令连接进入容器都很困难。所以从性能角度来考虑,还是推荐使用默认的Bridge模式。
二、跨主机通信
Docker默认的网络环境下,单台主机上的Docker容器可以通过docker0网桥直接通信,而不同主机上的Docker容器之间只能通过在主机上做端口映射进行通信。这种端口映射方式对很多集群应用来说可能不方便。如果能让Docker容器之间直接使用自己的IP地址进行通信,会解决很多问题。按实现原理可分别直接路由方式、Overlay隧道方式(如flannel、ovs+gre)、桥接方式(如pipework)。
1、直接路由
通过在Docker主机上添加静态路由实现跨宿主机通信:
2、隧道方式:Flannel(Flannel + UDP 或者 Flannel + VxLAN)
Flannel实现的容器的跨主机通信通过如下过程实现:
- 每个主机上安装并运行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数据包到达目的宿主机解封装,解出原始数据包,最终到达目的容器。
Flannel模式如下图所示:
3、桥接方式(Pipework)
最重要的留在最后说,这种方式是我最喜欢的,因为Pipework是一个简单易用的Docker容器网络配置工具。由200多行shell脚本实现。通过使用ip、brctl、ovs-vsctl等命令来为Docker容器配置自定义的网桥、网卡、路由等。
- 使用新建的bri0网桥代替缺省的docker0网桥(docker0也可以继续保留,常规容器还是用docker0,而需要互通的容器可以借助于pipework这个工具给docker容器新建虚拟网卡并绑定IP桥接到br0)
- bri0网桥与缺省的docker0网桥的区别:bri0和主机eth0之间是veth pair
Pipework桥接方式的示意图:
以下是用Pipework为docker容器配置独立IP的方法:
1)安装pipework
# wget https://github.com/jpetazzo/pipework/archive/master.zip
# unzip master.zip
# cp pipework-master/pipework /usr/local/bin/
# chmod +x /usr/local/bin/pipework
2)run一个容器(一般是网络模式为None,如果不为None也行,经过以下操作后形成双网卡或多网卡)
通过docker ps查看这个容器的Name,我测试用的是:r-myTest-myImage2-1-54991b1a
3)给宿主机创建网桥
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-br0
TYPE="Bridge"
BOOTPROTO=static
IPADDR=172.17.2.131
NETMASK=255.255.255.0
GATEWAY=172.17.2.1
PREFIX=24
DNS1=8.8.8.8
DNS2=114.114.114.114
NAME=br0
ONBOOT=yes
DEVICE=br0
4)设置物理网卡桥接到网桥(标红的内容加注释或添加)
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eno16777736
TYPE=Ethernet
#BOOTPROTO=static
#IPADDR=172.17.2.131
#NETMASK=255.255.255.0
#GATEWAY=172.17.2.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=eno16777736
DEVICE=eno16777736
ONBOOT=yes
#DNS1=8.8.8.8
PEERDNS=yes
PEERROUTES=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_PRIVACY=no
BRIDGE="br0"
以上设置完毕可以通过命令service network restart重启网络,使之生效
5)通过brctl show,查看新建的网桥(标红的)
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.005056842f3f no eno16777736
veth1pl87980
docker0 8000.024202f83b04 no veth7ef0d8f
vethb559941
vethr1c49ea0c4f
vethr89fb5f9e4b
6)pipework容器的IP(直接创建个与宿主机同网段未被使用的IP)
pipework br0 r-myTest-myImage2-1-54991b1a 172.17.2.134/24@172.17.2.1
再到该容器下ifconfig一下,就能看到新创建的网卡了:
通过宿主机也能直接ping通
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Windows Server 2008 即将终止支持,Docker 帮您解决应用迁移痛点
出品丨Docker公司(ID:docker-cn)编译丨小东每周一、三、五晚6点10分 与您不见不散! 对于 IT 组织来说,即将到来的 Windows Server 2008 的终止支持是一次利用 Docker EE 将遗留应用程序进行现代化和安全化改造的绝佳时机,不仅如此,这还会为组织节省数百万美元! Windows Server 2008 即将终止支持 即将于2020年1月到来的 Windows Server 2008 的终止支持将为IT组织提供一些可行的选择:迁移到受支持的操作系统(OS)、重新托管 Azure 或支付扩展支持合同(每年多出75%的许可证费用)在截止日期之后接收安全更新。不做任何选择(在不支持的操作系统版本上继续运行应用程序)对于绝大多数企业来说都是不可取的,因为这会带来很大的安全性和合规性风险。去年,当一场大规模的勒索软件病毒影响近100个国家时,我们看到了这种影响,它就是通过已经终止支持和未打补丁的系统进行传播。 应用程序迁移痛点 升级将是一次不小的壮举,因为大约80%的企业应用程序都运行在 Windows Server 上。在这些应用程序中,70%仍然在 ...
- 下一篇
Unity 之 Pure版Entity Component System【ECS】 案例【GalacticConquest】解析【上】
以往没有了解过Unity ECS的小伙伴建议先看看我写过的两篇ECS文章 Unity之浅析 Entity Component System (ECS) Unity 之 Pure版Entity Component System (ECS) 官方Rotation示例解析 最近两月Unity官方一直在更新ECS的版本,有一些原来的工程在新的版本中是无法运行的,所以今天再写一篇示例解析,虽然ECS目前是测试版本,可能还会有很多的改变,正式版本上线的日期也没有明确说明,但还是希望能帮助喜欢新技术的小伙伴,互相帮助,互相学习~ 有说的不准确和不正确的地方欢迎留言指正 大家的帮助是我写下去最有效的动力 点击下载工程 示例效果展示如下 这个示例的规则是这样的,启动时随机生成大小位置不同的球体,然后从球体周围发射小飞船去攻击其他的星球,飞船分为红绿两队,占领后星球变成指定队伍的颜色 此次使用的Unity版本为 2018.2.9f1 Entities版本为0.0.12-preview.15。而且在启动Unity加载Entities的时候保持网路畅通,因为有朋友反映在内网无法使用Entities的情况。【最...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程