hello云胜

技术与生活

0%

Docker的4种网络通信模式

我们在使用docker run命令创建Docker容器时,可以使用–network选项指定容器的网络模式。

Docker有以下4种网络模式:·

  • bridge
  • host
  • container
  • none

在安装完Docker之后,Docker Daemon会在宿主机上自动创建三个网络,分别是bridge网络、host网络和none网络

可以使用docker network ls命令查看

1
2
3
4
5
]# docker network ls
NETWORK ID NAME DRIVER SCOPE
2595499e1c4c bridge bridge local
3440b4c385f2 host host local
6398e6ab94d1 none null local

为什么要建这三个网络?

bridge模式

我们在服务器上安装docker后,docker会自动创建一个名为docker0的linux bridge。

1
2
3
# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.02421e0d1279 no

因为还没有启动任何容器,所以interfaces没有任何网卡。

1
2
3
4
5
# docker run --name busybox -itd busybox
e10df4d10de378d6b2db16d9ea5a3f9fb62294d2b9ba89df08f549c37b2769a6
# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.02421e0d1279 no veth066ee4f

启动一个容器再看,就绑定了一个新的veth

stop掉,这个veth就会消失。

bridge模式是Docker的默认网络模式。

在bridge模式下,docker每启动一个容器,就会为容器创建一个新的network namespace,设置ip。并将该容器veth pair的一端连接到docker0网桥上。

docker0的默认IP地址均为172.17.0.1。接到docker0上的Docker容器的IP地址范围是172.17.0.0/24

可以查看刚启动的容器的路由来验证

image-20231010112543422

同一台主机上的所有容器都接入docker0网关,并且也是同一个网段,所有同一主机上的各个容器通过广播通信

看一下主机上的路由

1
2
3
4
5
[root@paas-m-k8s-master-1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
。。。。
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0

从主机上对容器的访问都经过docker0

host模式

这种模式下,容器不会创建自己的network namespace。而是共享主机的network namespace,容器不会创建虚拟网卡,也不会配置ip。而是共享主机的ip和端口。

–network=host

image-20231010113514930

看到输出的全是主机的网卡信息

host模式的好处是

容器可以直接使用宿主机IP和主机名与外界通信,不需要进行NAT,也不需要通过Linux bridge进行转发或者进行数据包的封装。因此性能最高。

缺点也很明显,网络的隔离性不好,可以和主机争夺网络资源。并且存在端口冲突的问题。

container模式

和host模式类似,container模式就是将自己加到已经存在的某个容器的网络空间里。即共享别的容器的。

前面我们创建的一个busybox容器,其ip是172.17.0.4

image-20231010140654966

我新创建一个busybox2,指定–network=container:busybox。

可以看到其网络配置是容器busybox的。

是不是很熟悉的感觉?对,这就是k8s的pod网络的基本原理。

k8s 的pause容器创建出来之后,其他的容器会加入到pause容器的网络空间里。

none模式

none模式是只创建网路空间,然后创建一个lo回环设备。不再进行其他任何网络配置。

这种情况下,没有办法联网,属于完全封闭的网络。