20.1 网络启动与配置参数
Docker启动时会在主机上自动创建一个docker0虚拟网桥,实际上是一个Linux网桥,可以理解为一个软件交换机,它会在挂载其上的接口之间进行转发,如图20-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相关命令创建一个网络,同一个网络内的容器彼此可见,可以采用更多类型的网络插件。
