20.1 网络启动与配置参数

Docker启动时会在主机上自动创建一个docker0虚拟网桥,实际上是一个Linux网桥,可以理解为一个软件交换机,它会在挂载其上的接口之间进行转发,如图20-1所示。

20.1 网络启动与配置参数 - 图1

图20-1 Docker网络

同时,Docker随机分配一个本地未占用的私有网段(在RFC1918中定义)中的一个地址给docker0接口。比如典型的172.17.42.1,掩码为255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。

当创建一个Docker容器的时候,同时会创建了一对veth pair接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即eth0;另一端在本地并被挂载到docker0网桥,名称以veth开头(例如vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。如此一来,Docker就创建了在主机和所有容器之间一个虚拟共享网络。

下面是跟Docker网络相关的命令参数。其中有些命令选项只有在Docker服务启动的时候才能配置,而且不能马上生效:

·-b BRIDGE or—bridge=BRIDGE——指定容器挂载的网桥;

·—bip=CIDR——定制docker0的掩码;

·-H SOCKET…or—host=SOCKET…——Docker服务端接收命令的通道;

·—icc=true|false——是否支持容器之间进行通信;

·—ip-forward=true|false——启用net.ipv4.ip_forward,即打开转发功能;

·—iptables=true|false——禁止Docker添加iptables规则;

·—mtu=BYTES——容器网络中的MTU。

下面2个命令选项既可以在启动服务时指定,也可以Docker容器启动(docker run)时候指定。在Docker服务启动的时候指定则会成为默认值,后续执行docker run时可以覆盖设置的默认值。

·—dns=IP_ADDRESS…——使用指定的DNS服务器;

·—dns-search=DOMAIN…——指定DNS搜索域。

最后这些选项只能在docker run执行时使用,因为它是针对容器的特性内容:

·-h HOSTNAME or—hostname=HOSTNAME——配置容器主机名;

·—link=CONTAINER_NAME:ALIAS——添加到另一个容器的连接;

·—net=bridge|none|container:NAME_or_ID|host|user_defined_network——配置容器的桥接模式;

·-p SPEC or—publish=SPEC——映射容器端口到宿主主机;

·-P or—publish-all=true|false——映射容器所有端口到宿主主机。

其中,—net选项支持五种模式,如下所示:

·—net=bridge——默认配置。为容器创建独立的网络命名空间,分配网卡、IP地址等网络配置,并通过veth接口对将容器挂载到一个虚拟网桥(默认为docker0)上;

·—net=none——为容器创建独立的网络命名空间,但不进行网络配置,即容器内没有创建网卡、IP地址等;

·—net=container:NAME_or_ID——意味着新创建的容器共享指定的已存在容器的网络命名空间,两个容器内的网络配置共享,但其他资源(进程空间、文件系统等)还是相互隔离的;

·—net=host——意味着不为容器创建独立的网络命名空间,容器内看到的网络配置(网卡信息、路由表、Iptables规则等)均与主机上保持一致。注意其他资源还是与主机隔离的;

·—net=user_defined_network——用户自行用network相关命令创建一个网络,同一个网络内的容器彼此可见,可以采用更多类型的网络插件。