我们可以查看DOCKER相关规则,容器之所以可以联网,是靠这些规则实现的

iptables -nvL -t nat

上面命令参数说明:

  • -n:此选项防止命令尝试将IP地址和端口号解析为相应的主机名和服务名。它用于显示数值,可以加快输出速度。
  • -v:此选项会使输出更详细,提供有关规则的附加信息
  • -L:此选项用于列出规则
  • -t nat:此选项指定要操作的表格。在这种情况下,它是NAT表。NAT表负责进行网络地址转换,通常用于路由和更改网络数据包的源或目标IP地址或端口号。

Docker网络模式

Docker网络模式 配置 说明 应用场景
host模式 –-net=host 容器和宿主机共享Network namespace。 这种模式性能很高,适合需要容器与主机无延迟通信的场景。在拓扑中,容器直接连接到主机的网络,就像是主机的一部分。
container模式 --net=container:NAME_or_ID 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。 这种模式在需要多个容器之间的紧密通信和隔离的场景中很有用。在拓扑中,多个容器共享一个容器的网络栈。
none模式 –-net=none 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。 这种模式在安全性要求非常高的环境下使用,容器内部无法与外部网络通信。在拓扑中,容器与外部隔绝。
bridge模式 –-net=bridge (默认为该模式) 这种模式适用于在单个主机上运行多个容器,容器之间可以通过桥接器进行通信,但与主机和外部网络隔离。在拓扑中,容器通过虚拟网络桥接器连接到主机的网络。

host模式

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

使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。

Host模式如下图所示:

host模式

container模式

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

Container模式示意图:

container模式

none模式

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

这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过--network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

None模式示意图:

None模式

bridge模式

当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模式如下图所示

bridge模式

端口映射

我们可以将容器端口映射到宿主机

$ docker run -itd -v /data/:/var/www/html/ -p 8088:80 --name aming06 ubuntu_test bash

上面选项参数说明:

  • /data/:宿主机目录
  • /var/www/html/:容器目录
  • 8088:宿主机端口
  • 80:容器端口