Docker:网络模式详解 - Gringer - 博客园www.cnblogs.com

安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host

docker run创建Docker容器时,可以用 --net 选项指定容器的网络模式 :
host模式:使用 --net=host 指定。
none模式:使用 --net=none 指定。
bridge模式:使用 --net=bridge 指定,默认设置。
container模式:使用 --net=container:NAME_or_ID 指定



启动docker engine后,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到
这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个
二层网络中。
从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡
veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡)
,另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。
[root@g15-6f-81-238 ~]# ifconfig
'''
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
'''
[root@g15-6f-81-238 ~]# docker inspect d1872d45b01d | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.6",
为了实现上述功能,docker主要用到了linux的Bridge、Network Namespace、VETH (虚拟网卡的接口对 Virtual Enternet device)。
docker0网关就是通过Bridge实现的。
Network Namespace是网络命名空间,通过Network Namespace可以建立一些完全隔离的网络栈。
比如通过docker network create xxx就是在建立一个Network Namespace。
VETH是虚拟网卡的接口对,可以把两端分别接在两个不同的Network Namespace中,实现两个原本隔离的Network Namespace的通信。
所以总结起来就是:
Network Namespace做了容器和宿主机的网络隔离,
Bridge分别在容器和宿主机建立一个网关,
然后再用VETH将容器和宿主机两个网络空间连接起来。
