Docker启动时会在主机上自动创建一个docker0虚拟网桥,实际上是一个Linux网桥,可以理解为一个软件交换机,他会在挂载其上的接口之间进行转发:如图所示
创建一个Docker容器的时候,同时会创建一对veth pair接口。这对接口一端在容器内,即eth0;另一端在本地并被挂载到docker0网桥,名称以veth开头,通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。如此一来,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规则等)均与主机上保持一致。注意其他资源还是与主机隔离的;