与宿主机在同一个网络中,没有独立IP地址,使用宿主机的端口资源。宿主机的ip地址就是该容器的ip地址,但是仍然使用和宿主机不同的文件系统。
这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
该模式将容器放置在它自己的网络栈中,但是并不进行任何配置。实际上,该模式关闭了容器的网络功能,在以下两种情况下是有用的:容器并不需要网络(例如只需要写磁盘卷的批处理任务)。
容器使用独立network Namespace,并连接到docker0虚拟网卡(默认模式)。通过docker0网桥以及Iptables nat表配置与宿主机通信;bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。
可以将其比作为总线结构,Bridge就是一根线,所有容器可以链接到该Bridge上,然后通过这根Bridge交互数据。
首先进入到容器内部,并执行ip addr命令
docker exec -it 513451b40f36 bash
root@513451b40f36:/# ip addr
得到如下输出,ip addr命令返回的是机器上存在的所有网卡信息。lo是环回地址(软件实现的硬件设备),另一个是 eth0@if29,这显然也是虚拟软件实现的。
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
28: eth0@if29: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
然后再在宿主机上执行ip addr命令。其中enp0s31f6是唯一真是的物理硬件网卡,其ip地址192.168.10.135。有一个叫docker0的网桥,还有一个29: veth6e47b01@if28的接口,它的master是docker0。
archlab@GG-135:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s31f6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether e0:d5:5e:a1:59:5d brd ff:ff:ff:ff:ff:ff
inet 192.168.10.135/24 brd 192.168.10.255 scope global dynamic enp0s31f6
valid_lft 46129sec preferred_lft 46129sec
inet6 fe80::8951:1f0c:6a2e:72e8/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:5f:25:3c:81 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:5fff:fe25:3c81/64 scope link
valid_lft forever preferred_lft forever
29: veth6e47b01@if28: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 42:6f:54:d5:de:53 brd ff:ff:ff:ff:ff:ff link-netnsid 3
inet6 fe80::406f:54ff:fed5:de53/64 scope link
valid_lft forever preferred_lft forever
宿主机中的29: veth6e47b01@if28与容器内部中的28: eth0@if29就是一对veth-pair。
在容器内部执行route命令,查看容器内部路由信息。
root@513451b40f36:/# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 172.17.0.1 0.0.0.0 UG 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
从输出可见,容器内部默认的ip转发地址是172.17.0.1,也就是说所有发往外部ip地址数据包,都会通过eth0接口,转发至172.17.0.1这个ip地址上。而172.17.0.1这个ip地址,从上面宿主机的ip add的输出中可以看到这个地址就是docker0的地址。
然后再在宿主机上面执行route命令查看宿主机的路由表
archlab@GG-135:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.10.254 0.0.0.0 UG 100 0 0 enp0s31f6
10.244.0.0 * 255.255.255.0 U 0 0 0 cni0
10.244.1.0 10.244.1.0 255.255.255.0 UG 0 0 0 flannel.1
10.244.2.0 10.244.2.0 255.255.255.0 UG 0 0 0 flannel.1
link-local * 255.255.0.0 U 1000 0 0 docker0
172.17.0.0 * 255.255.0.0 U 0 0 0 docker0
192.168.10.0 * 255.255.255.0 U 100 0 0 enp0s31f6
从输出可见,宿主机内部默认的ip转发地址是192.168.10.254,也就是说所有发往外部ip地址数据包,都会通过enp0s31f6接口,转发至192.168.10.254这个ip地址上。192.168.10.254这应该是机房集群的路由网关地址。