Docker容器网络模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker容器网络模式相关的知识,希望对你有一定的参考价值。

参考技术A 之前有另一篇文章介绍过,容器可以通过网络命名空间来和主机之间进行网络的隔离,这篇文章会继续介绍一下容器的几种组网模式。这个对于我们在使用容器进行服务部署的时候来理解不同服务之间的通信尤为重要。
首先对于host系统上的物理网络设备,一个物理的网络设备最多存在于一个Network namespace中,所以通常我们不会给容器分配一个物理的网络设备,而是用虚拟网卡来替代,比如说使用veth pair进行不同的Network namespace之间的通信,

当然容器也可以和主机不进行网络命名空间的隔离,使用host模式和主机共享网络设备和配置。

Docker创建新的容器的时候默认的网络模式是桥接,如图所示

另一篇文章中有介绍,通过如下命令可以手动添加一个veth对到linux系统中,

如果像docker这样,已经默认构建好了内部网络,在host系统中我们只可以查看到veth01这个虚拟网口,

依据打印出来的信息可以看出来,

可以使用如下命令来查看现在系统中创建的bridge

当前这个例子中创建了两个容器,使用的都是默认网络;对应的host系统上也会有两个虚拟网卡veth8ef89b4和vetha95b32d

这里我们可以看到有两个和docker有关的链

Chain FORWAR中配置了转发策略,所有的数据包都会转发到DOCKER这个chain上;然后DOCKER这个CHAIN上会设置过滤规则。

NAT允许主机修改数据包的IP地址或者端口,

使用主机的network namespace以及网络配置。
缺点:容器可以修改主机的网络配置,没有做网络的隔离。
还是来看个实际的例子,启动一个nginx的容器,

可以看到这个时候没有添加新的veth口,这个和bridge的模式不一样。

这里必须要使用sudo,因为nginx进程是属于Docker daemon用户的,否则没法儿获取进程名和PID。
可以看到这个例子里会输出如下信息,80端口直接绑定到nginx这个进程上了,

如果配置成了桥接模式,会打印这样的信息,80端口没有直接绑定到nginx,而是绑定到了docker-proxy。

overlay这种网络模式下,会在多个Docker Daemon主机的基础上创建一个分布式网络,这个分布式网络允许容器连接上去并且互相通信。这种部署方式相对复杂,后面单独找个时间去研究一下。

一些应用程序,尤其是一些遗留的程序或者是那些监控网络流量的程序,需要直接连接到物理网络上。这种情况下,你可以使用macvlan网络驱动来给每个容器的虚拟网络接口都分配一个MAC地址,让这些网络接口看上去像是一个物理网卡,并且能直接连到物理网络上。这种情况下你需要指定host上的一个物理网卡用于Macvlan,以及子网,和Macvlan的网关。你甚至可以通过使用不同的物理网卡来隔离Macvlan。注意以下几点,

当你创建一个macvlan网络的时候,可以有两种模式

创建一个Macvlan网络

这里指定了子网和网关,parent这个选项指定所有的数据会通过哪个主机上的物理网卡来传输。

parent选项在指定网口的时候,如果后面加了小数点,就会默认为这是一个eth0的子网口,并且会自动创建这个子网口。

上述的例子里面依旧是个L3桥接(层三交换?),我们可以使用ipvlan来进行替换,并且指定ipvlan的模式是l2

这个例子里面,容器所有的流量都经过eth0发出去,Docker利用容器的MAC地址来路由消息到容器;从网络上来看,docker容器的网络接口就像是直接连在网络上的物理网卡

这里enp0s8是主机上的网卡,IP地址是192.168.56.101,网关是192.168.56.1;

可以看到eth0配置了ip为192.168.56.220/24,同时eth0和if3互为veth对,回到host上查看,if3就是host上的物理网卡;

这个时候可以尝试一下ping不同的容器

用两张图来描述和普通桥接例子的区别

Docker网络深度解读
最新实践 | 将Docker网络方案进行到底
通过MacVLAN实现Docker跨宿主机互联
Macvlan and IPvlan basics

以上是关于Docker容器网络模式的主要内容,如果未能解决你的问题,请参考以下文章

容器化工具--------Docker的网络操作

Docker——Docker网络模式

Docker 网络

docker桥接模式

运维实战 容器部分 Docker网络

Docker网络模式