Docker网络基础知识
基于对network namespace的控制,docker可以为在容器创建隔离的网络环境,在隔离的网络环境下,容器具有完全独立的网络栈,与宿主机隔离,也可以使容器共享主机或者其他容器的网络命名空间,基本可以满足开发者在各种场景下的需要。按Docker官方的说法,docker容器的网络有五种模式,bridge为默认的,不需要使用-net来指定,而其它的三种却需要在创建容器的时候,使用-net来指定网络模式,最后一种为用户自定义模式
模式 | 指定参数 |
---|---|
bridge模式 | 使用-net=bridge指定,不指定默认会被设置为此模式 |
none模式 | 使用-net=none指定 |
host模式 | 使用-net=host指定 |
container模式 | 使用-net=container:容器名称或ID指定 |
Docker网络初始化的过程如下:
初始化设备 ---> 初始化bridge ---> 初始化iptables ---> 初始化ip forward(内核路由转发) ---> registry network job function ---> end
Dcoker模式介绍:
1.bridge模式:docker默认的网络模式,为容器创建独立的网络命令空间,容器具有独立的网卡等所有单独的网络栈。容器从原理上是可以与宿主机及至外界的其他机器通信的。同一台宿主机上,容器之间都是连接到docker0这个网桥上,它可以作为虚拟交换机使容器间相互通信。然而,由于宿主机的IP地址与容器的veth pair的IP地址均不在同一个网段,所以仅仅依靠veth pair和namesapce的技术,还不足以使宿主机以外的网络主动发现容器的在下。为了使外界可以访问容器中的进程,docker采用了端口绑定的方式,也即是通过iptables的NAT,将宿主机上的端口流量转发到容器内的端口上。
bridge模式中的容器与外界通信时,必定会占用宿主机上的端口,从而与宿主机竞争端口资源,对宿主机端口的管理会是一个比较在的问题,同时,由于容器与外界通信是基于三层iptables NAT,性能和效率上的损耗肯定是不可避免的
2.host模式:容器直接与宿主机使用同一网络命令空间,采用此模式的容器,可以直接使用宿主机的IP地址与外面进行通信,如宿主机具有公网的IP地址时,那容器也会拥有这个公有的IP地址,与此同时,容器内服务的端口地址也能直接使用宿主机的端口,无需再进行额外的NAT转换。由于容器通信时,不再需要通过linux bridge等方式转发或者数据包的拆封,性能上将会得到很大的提高。此种模式有优势,也会存在劣势,主要包括如下几个方面:
(1)容器将不再拥有隔离、独立的网络栈。容器会与宿主机竞争网络栈使用,并且容器的崩溃也可能会导致宿主机崩溃,在生产的环境中,这种问题可能是不被允许的
(2)容器内部将不再拥有所有的端口资源,因为一些端口已经被宿主机服务、bridge模式的容器端口绑定等其它服务占用掉了
3.none模式:为容器创建独立网络命名空间,但不为它做什么网络配置,容器中只有lo回环地址,用户可以在此基础上,对容器网络做任意的定制
4.其它容器:与host模式类似,只是容器将与指定的容器共享网卡,其它的网络模式是docker中一种较为特别的网络模式。在此模式下的容器,会使用其它容器的网络命名空间,其网络隔离性会处于bridge桥接模式与host模式之间。当容器共享其他容器的网络命令空间,则在这两个容器之间不存在网络隔离,而它们又与宿主机以及除此之外的其它的容器存在网络隔离
5.用户自定义:允许容器使用第三方的网络实现或者创建单独的bridge网络,提供网络隔离功能。除了Docker自动创建的三个网络外,用户可以为Docker创建新的网络。为Dokcer增加新的网络的方式有两种---使用Docker自带的bridge和overlay两种网络驱动,或者提供新的网络插件
这5种网络模式在相互网络通信方面的对比如下:
模式 | 支持多主机 | 访问外部网络 | 容器互访 |
---|---|---|---|
bridge | NO | 宿主机端口绑定 | Linux bridge |
host | YES | 宿主机网络 | 宿主机网络 |
none | NO | 无法通信 | 只能通过link通信 |
其它容器 | NO | 宿主机端口绑定 | 通过link通信 |
用户自定义 | 按网络实现而定 | 按网络实现而定 | 按网络实现而定 |
Docker跨主机之间容器通信的overlay网络模式作简要介绍
Docker内置overlay网路模式驱动libnetwork,可以用于创建跨多个主机的网络。在同一个overlay网络里的容器,无论运行在哪个主机上,都能相互通信。
要创建overlay网络,首先要有一个提供key-value存储服务的服务器,当前Docker支持的key-value存储服务器有Consul, Etcd和ZooKeeper. 组成overlay网络的Docker的主机之间、Docker主机和key-value存储服务器之间都要能互通互联。在Docker主机上还要开放如下两个端口:
udp端口:4789,用于传输VXLAN网络数据的端口
tcp/udp端口:7946,用于控制平面的端口
对要加入overlay网络里里的每台Docker主机,都要完成如下配置:
--cluster-store=PROVIDER://URL/ 配置key-value存储服务器的地址
--cluster-advertise=HOST_IP|HOST_IFACE:PORT Docker所在的当前主机的地址和端口
--cluster-store-opt=KEY-VALUE OPTIONS 其他配置信息,如TLS证书等