Docker 网络配置
当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥, 实际上是 Linux 的一个解为一个软件交换机。它会在挂载到它的网口之间进行转发。同时, Docker 随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址口。比如典型的 172.17.42.1 ,掩码为 255.255.0.0 。此后启动的容器内的网口也会自动网段( 172.17.0.0/16 )的地址。当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一一个接口也可以收到相同的数据包)。 这对接口一端在容器内,即 eth0 ; 另一端在本地并docker0 网桥,名称以 veth 开头(例如 vethAQI2QT )。通过这种方式,主机可以跟容之间也可以相互通信。 Docker 就创建了在主机和所有容器之间一个虚拟共享网络
当安装docker后宿主机OS中会创建一个虚拟的网桥docker0 和一个同名虚拟网络接口docker0网络接口,该接口桥接在网桥docker0上负责和在该宿主机上的容器进行通信。该接口的IP地址则是宿主机未使用的私有网段,172.17.0.1 - 172.17.255.255. 每次创建一个容器,宿主机OS张都会创建一个虚拟网络接口,名称形如:veth***@if* 该接口桥接在虚拟网络接口docker0上,所创建的容器也会被分配一个虚拟网络接口eth0,其地址和docker0接口同在一个私有网段。宿主机OS 的veth***接口和容器内的eth0接口形成一个veth pair。当数据包从容器发到网络接口eth0时,宿主机OS的网络接口veth*** 也会收到数据包。网络接口veth*** 和docker0同过网桥docker0链接,因此宿主机便可以通过docke0和其上的容器进行通信了。
Docker 网络相关的命令列表。
有些命令选项只有在 Docker 服务启动的时候才能配置,而且不能马上生效。
-b BRIDGE or --bridge=BRIDGE --指定容器挂载的网桥
--bip=CIDR --定制 docker0 的掩码
-H SOCKET... or --host=SOCKET... --Docker 服务端接收命令的通道
--icc=true|false --是否支持容器之间进行通信
--ip-forward=true|false --请看下文容器之间的通信
--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 --配置容器的桥接模式
-p SPEC or --publish=SPEC --映射容器端口到宿主主机
-P or --publish-all=true|false --映射容器所有端口到宿主主机
设置DNS
Docker 容器的 dns 配置通过 /etc/resolv.conf文件 进行配置。如下所示:
nameserver 172.27.16.28
nameserver 172.27.16.18
nameserver 172.27.40.12
在启动docker run 命令中使用-dns可以指定所使用的DNS
容器访问控制
源地址都会被NAT成本地系统的IP地址。 这是使用 iptables 的源地址伪装操作实现的。
容器访问外网需要宿主OS的转发, 因此需要打开宿主机系统的转发功能。相关linux命令如下:
sysctl net.ipv4.ip_forward #查看转发是否打开 0关闭,1打开
sysctl -w net.ipv4.ip_forward=1 #启动转发功能
启动docker服务时如果设定了参数 --ip_forward=true/false,则docker 会自动设定系统参数ip_forward=0/1.
启动docker 服务时参数--icc=true/false用于设定是否允许容器之间互访。默认是true,也可以在docker的配置文件/etc/default/docker中 设置参数DOCKER_OPTS=--icc=false 来禁止。
启动docker服务时参数--iptables=true/false用于设定docker是否可以在iptable中添加规则。
容器访问外网
外网访问容器时通过宿主机OS和容器的端口映射实现。