bridge模式
使用--net=bridge指定,Docker的默认设置,这种模式创建出来的docker容器链接到Dcoker网桥上(docker0网桥或者其它自定义的网桥):
1)创建一对虚拟网卡(veth pair)
2)赋予其中一块网卡一个类似“veth65f9”的名字,将其留在宿主机root network namespace中,并绑定到Docker网桥上
3)将另一块网卡放入新创建的network namespace中(docker容器中),命名为eth0
4)从Docker网桥的子网中选取一个未使用的IP非配给eth0,并为Docker容器设置默认路由,默认网关为Docker网桥
此模式与外界通信使用NAT协议,增加了通信的复杂性,在复杂场景下使用会有诸多限制。
host模式
使用--net=host指定。Docker容器中的进程处于宿主机的网络环境中,相当于docker容器和宿主机公用一个network namespace,使用宿主机的网卡、IP、端口等信息。但是容器其它方面,如文件系统、进程列表等还是和宿主机隔离的。
host模式很好地解决了容器与外界通信的地址转换问题,可以直接使用宿主机的IP进行通信,但是也降低了隔离性,同事还会引起网络资源的竞争和冲突。
container模式
container模式和host模式类似,指定新创建的容器和已经存在的某个容器共享同一个network namespace。都是共享network namespace,区别就在于host模式与宿主机共享,而container模式与某个存在的容器共享。新创建的容器不会创建自己的网卡,也不配置IP,而是与一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其它的如文件系统、进程列表等还是隔离的。
在这种模式下,两个容器的进程可以通过lo回环网卡设备通信,增加了容器间通信的便利性和效率。
container模式的应用场景就在于可以将一个应用的多格组件放在不同的容器中,这些容器配置为container模式的网络,这样他们就可以作为一个整体对外提供服务。同样,这种模式也降低了容器间的隔离性
none模式
这种模式下,docker容器拥有自己的network namespace,但是,并不为docker容器进行任何网络配置。也就是说,这个docker容器除了netwokr namespace自带的loopback网卡外没有其他任何网卡、IP、路由等信息,需要用户为Docker容器添加网卡、配置IP等。
这种模式如果不进行特定的配置是无法正常使用的,但是优点也非常明显,它给了用户最大的自由度来自定义容器的网络环境。
--- 以上摘自《Docker容器与容器云》