如何理解docker中的网络模式和跨主机通信

发布时间:2021-11-09 15:51:55 作者:柒染
来源:亿速云 阅读:167

今天就跟大家聊聊有关如何理解docker中的网络模式和跨主机通信,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

Docker的四种网络模式Bridge模式

当Docker进程启动时,会在主机上创建一个名为docker0...

如何理解docker中的网络模式和跨主机通信

Docker的四种网络模式

Bridge模式
如何理解docker中的网络模式和跨主机通信

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。

bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。

bridge模式如下图所示:

如何理解docker中的网络模式和跨主机通信

演示:

如何理解docker中的网络模式和跨主机通信

#docker run -tid --net=bridge --name docker_bri1 ubuntu-base:v3
#docker run -tid --net=bridge --name docker_bri2 ubuntu-base:v3

#brctl show
#docker exec -ti docker_bri1 /bin/bash
#docker exec -ti docker_bri1 /bin/bash

#ifconfig –a
#route –n

如何理解docker中的网络模式和跨主机通信

Host模式
如何理解docker中的网络模式和跨主机通信

如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

Host模式如下图所示:

如何理解docker中的网络模式和跨主机通信

演示:

如何理解docker中的网络模式和跨主机通信

#docker run -tid --net=host --name docker_host1 ubuntu-base:v3
#docker run -tid --net=host --name docker_host2 ubuntu-base:v3

#docker exec -ti docker_host1 /bin/bash
#docker exec -ti docker_host1 /bin/bash

#ifconfig –a
#route –n

如何理解docker中的网络模式和跨主机通信

Container模式
如何理解docker中的网络模式和跨主机通信

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

Container模式示意图:

如何理解docker中的网络模式和跨主机通信

演示:

如何理解docker中的网络模式和跨主机通信

#docker run -tid --net=container:docker_bri1 --name docker_con1 ubuntu-base:v3
#docker exec -ti docker_con1 /bin/bash
#docker exec -ti docker_bri1 /bin/bash
#ifconfig –a
#route -n

如何理解docker中的网络模式和跨主机通信

None模式
如何理解docker中的网络模式和跨主机通信

使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。

Node模式示意图:

如何理解docker中的网络模式和跨主机通信

演示:

#docker run -tid --net=none --name docker_non1 ubuntu-base:v3
#docker exec -ti docker_non1 /bin/bash
#ifconfig –a
#route -n


跨主机通信

Docker默认的网络环境下,单台主机上的Docker容器可以通过docker0网桥直接通信,而不同主机上的Docker容器之间只能通过在主机上做端口映射进行通信。这种端口映射方式对很多集群应用来说极不方便。如果能让Docker容器之间直接使用自己的IP地址进行通信,会解决很多问题。按实现原理可分别直接路由方式、桥接方式(如pipework)、Overlay隧道方式(如flannelovs+gre)等。

直接路由
如何理解docker中的网络模式和跨主机通信

通过在Docker主机上添加静态路由实现跨宿主机通信:

如何理解docker中的网络模式和跨主机通信

Pipework

如何理解docker中的网络模式和跨主机通信

Pipework是一个简单易用的Docker容器网络配置工具。由200多行shell脚本实现。通过使用ip、brctl、ovs-vsctl等命令来为Docker容器配置自定义的网桥、网卡、路由等。

如何理解docker中的网络模式和跨主机通信

Flannel(Flannel + UDP 或者 Flannel + VxLAN)

如何理解docker中的网络模式和跨主机通信

Flannel实现的容器的跨主机通信通过如下过程实现:

Flannel模式如下图所示: 
如何理解docker中的网络模式和跨主机通信

演示:

#/opt/bin/etcdctl get /coreos.com/network/config
#/opt/bin/etcdctl ls /coreos.com/network/subnets
#/opt/bin/etcdctl get /coreos.com/network/subnets/172.16.49.0-24

看完上述内容,你们对如何理解docker中的网络模式和跨主机通信有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

推荐阅读:
  1. docker容器如何实现跨主机通信
  2. Docker跨主机网络——manual

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

docker

上一篇:PostgreSQL中hash_search_with_hash_value函数有什么作用

下一篇:Django中的unittest应用是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》