Docker的4种网络通信模式
我们在使用docker run命令创建Docker容器时,可以使用–network选项指定容器的网络模式。
Docker有以下4种网络模式:·
- bridge
- host
- container
- none
在安装完Docker之后,Docker Daemon会在宿主机上自动创建三个网络,分别是bridge网络、host网络和none网络
可以使用docker network ls命令查看
1 | ]# docker network ls |
为什么要建这三个网络?
bridge模式
我们在服务器上安装docker后,docker会自动创建一个名为docker0的linux bridge。
1 | # brctl show |
因为还没有启动任何容器,所以interfaces没有任何网卡。
1 | # docker run --name busybox -itd busybox |
启动一个容器再看,就绑定了一个新的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
可以查看刚启动的容器的路由来验证

同一台主机上的所有容器都接入docker0网关,并且也是同一个网段,所有同一主机上的各个容器通过广播通信
看一下主机上的路由
1 | [root@paas-m-k8s-master-1 ~]# route -n |
从主机上对容器的访问都经过docker0
host模式
这种模式下,容器不会创建自己的network namespace。而是共享主机的network namespace,容器不会创建虚拟网卡,也不会配置ip。而是共享主机的ip和端口。
–network=host

看到输出的全是主机的网卡信息
host模式的好处是
容器可以直接使用宿主机IP和主机名与外界通信,不需要进行NAT,也不需要通过Linux bridge进行转发或者进行数据包的封装。因此性能最高。
缺点也很明显,网络的隔离性不好,可以和主机争夺网络资源。并且存在端口冲突的问题。
container模式
和host模式类似,container模式就是将自己加到已经存在的某个容器的网络空间里。即共享别的容器的。
前面我们创建的一个busybox容器,其ip是172.17.0.4

我新创建一个busybox2,指定–network=container:busybox。
可以看到其网络配置是容器busybox的。
是不是很熟悉的感觉?对,这就是k8s的pod网络的基本原理。
k8s 的pause容器创建出来之后,其他的容器会加入到pause容器的网络空间里。
none模式
none模式是只创建网路空间,然后创建一个lo回环设备。不再进行其他任何网络配置。
这种情况下,没有办法联网,属于完全封闭的网络。