docker 中网络实现原理
当 Docker 启动时,会主动在主机上创立一个 docker0
虚构网桥,实际上是 Linux 的一个 bridge,能够了解为一个软件交换机。它会在挂载到它的网口之间进行转发。
同时,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 网络配置参数
-b BRIDGE
或--bridge=BRIDGE
指定容器挂载的网桥--bip=CIDR
定制 docker0 的掩码-H SOCKET...
或--host=SOCKET...
Docker 服务端接管命令的通道--icc=true|false
是否反对容器之间进行通信--ip-forward=true|false
请看下文容器之间的通信--iptables=true|false
是否容许 Docker 增加 iptables 规定--mtu=BYTES
容器网络中的 MTU
上面 2 个命令选项既能够在启动服务时指定,也能够在启动容器时指定。在 Docker 服务启动的时候指定则会成为默认值,前面执行 docker run
时能够笼罩设置的默认值。
--dns=IP_ADDRESS...
应用指定的 DNS 服务器--dns-search=DOMAIN...
指定 DNS 搜寻域
这些选项只有在 docker run
执行时应用,因为它是针对容器的个性内容。
-h HOSTNAME
或--hostname=HOSTNAME
配置容器主机名--link=CONTAINER_NAME:ALIAS
增加到另一个容器的连贯--net=bridge|none|container:NAME_or_ID|host
配置容器的桥接模式-p SPEC
或--publish=SPEC
映射容器端口到宿主主机-P or --publish-all=true|false
映射容器所有端口到宿主主机
容器拜访内部网络
容器要想拜访内部网络,须要本地零碎的转发反对。在 Linux 零碎中,查看转发是否关上
如果为 0 需关上sysctl -w net.ipv4.ip_forward=1