1、封闭式容器封闭式网络模式相当于一个孤岛,没有网络协议栈的通信使用none模式。Docker容器有自己的NetworkNamespace,但不是针对Docker容器的。做任何网络配置。也就是说这个Docker容器没有网卡、IP、路由等信息,只有lo网络接口。我们需要自己为Docker容器添加网卡、配置IP等。示例图片如下2.bridgedcontainer桥接网络模式每个容器之间的网络协议栈是单独分离的Docker启动时会自动在宿主机上创建一个docker0虚拟网桥,其实就是linux的网桥,可以理解为软件开关。它将在安装到它的网络端口之间转发。同时,Docker在本地未被占用的私有网段(定义在RFC1918)中随机分配一个地址给docker0接口。比如典型的172.17.42.1,掩码是255.255.0.0。之后启动的容器中的网口也会自动分配一个相同网段的地址(172.17.0.0/16)。当一个Docker容器被创建时,同时创建了一对vethpair接口(当一个数据包发送到一个接口时,另一个接口也可以接收到相同的数据包)。这对接口的一端在容器中,即eth0;另一端是本地的,挂载到docker0网桥上,名称以veth开头(例如,vethAQI2QT)。这样宿主机就可以和容器通信,容器之间也可以通信了。Docker在主机和所有容器之间创建一个虚拟共享网络。如图所示,同一主机上的两个容器通过网桥doker0进行通信。(容器在不同宿主机上的通信需要依赖overlay网络,涉及到一些底层协议,单独写一篇文章讲)3.加入容器联合挂载网络模式下容器之间可以共享网络协议栈,即is这种模式指定新创建的容器与现有容器共享一个NetworkNamespace,而不是与宿主机共享。新创建的容器不会创建自己的网卡和配置自己的IP,而是与指定的容器共享IP、端口范围等。同样,除了两个容器的网络方面,其他的如文件系统、进程列表等仍然是隔离的。两个容器的进程可以通过lo网卡设备进行通信。示例如下图所示:4.opentainer容器的开放网络模式与宿主机共享网络协议栈。Host模式的使用就是在容器启动的时候指定--networkhost。此时容器共享宿主机的NetworkNamespace,容器中启动的端口直接是宿主机的端口,容器不会创建网卡和IP,直接使用网卡和宿主机IP,但容器内其他资源隔离,如文件系统、用户、用户组等。直接使用主机网络。另外启动一个nginx,此时共享宿主机网络,根据情况使用,这种方式不需要做端口转发,网络传输效率会更高(想想为什么)。
