概述
今天,我们将介绍Docker的一些高级网络配置和选项。Docker启动后,会自动在主机上创建一个docker0虚拟桥,实际上是Linux的一个桥,可以理解为一个软件交换机。它将在安装到它的端口之间转发。
同时,Docker会在本地未被占用的专用网段(在RFC1918中定义)中随机分配一个地址给docker0接口。例如,典型的172.17.42.1的掩码为255.255.0.0。之后,启动的容器中的网络端口将被自动分配一个相同网段(172.17.0.0/16)的地址。
创建Docker容器时,会同时创建一对vethpair接口(当一个数据包发送到一个接口时,另一个接口也可以接收到相同的数据包)。这对接口的一端在容器中,即eth0;另一端是本地的,并安装到docker0桥,其名称以veth开头(例如,vethAQI2QT)。这样,主机可以与容器通信,容器也可以相互通信。Docker在主机和所有容器之间创建一个虚拟共享网络。
码头网络
00-1010容器的访问控制主要由Linux上的iptables防火墙管理和实现。Iptables是Linux上的默认防火墙软件,在大多数发行版中都附带了它。
篇幅有限,这里就不多说iptables了~
如果
容器访问控制
容器想要访问外部网络,它需要本地系统的转发支持。在Linux系统中,检查转发是否打开。$sysctlnet.ipv4.ip_forward
net.ipv4.ip_forward=1
如果为0,则表示转发未开启,需要手动开启。
$sysctl-w net.ipv4.ip_forward=1
容器访问外部网络
容器之间的相互访问需要两方面的支持。容器的网络拓扑是否互联。默认情况下,所有容器都连接到docker0桥。
是否允许系统的本地防火墙软件- iptables通过。
容器之间访问
默认情况下,容器可以主动访问与外部网络的连接,但外部网络无法访问容器。容器访问外部实现
从容器到外部网络的所有连接,源地址都将被NAT到本地系统的IP地址。这是通过使用iptables的源地址伪装操作来实现的。
检查主机的NAT规则。
其中,上述规则将所有源地址为172.17.0.0/16网段、目的地址为其他网段(外部网络)的流量动态伪装为源自系统网卡。假面舞会和传统SNAT的优点是可以从网卡动态获取地址。
外部访问容器实现
允许对容器的外部访问,这可以通过-p或-P参数启用。
无论哪种方式,相应的规则实际上都被添加到本地iptable的nat表中。
带-P:
使用-p80:80时:
注意:
这里的规则映射到0.0.0.0,这意味着来自主机所有接口的流量都将被接受。用户可以指定IP、接口等。在允许通过-pip 3360 host _ port 3360 container _ port或-pip33603360port访问容器的主机上,以便制定更严格的规则。
如果您想永久绑定到固定的IP地址,您可以将以下内容添加到Docker配置文件/etc/docker/daemon.json中:
{
ip':'0.0.0.0 '
}
映射容器端口到宿主主机的实现
Docker服务默认会创建一个dock r0桥(上面有一个dock r0内部接口),与内核层的其他物理或虚拟网卡连接,将所有容器和本地主机放在同一个物理网络中。Docker默认指定docker0接口的IP地址和子网掩码,这样主机和容器就可以通过网桥相互通信。它还给出了MTU(接口允许接收的最大传输单位),通常为1500字节,或者主机网络路由支持的默认值。这些值可以在服务启动时配置。
您还可以配置
文件中配置DOCKER_OPTS,然后重启服务。由于目前Docker网桥是Linux网桥,用户可以使用 brctlshow 来查看网桥和 端口连接信息。
$ sudo brctl show bridge name bridge id STP enabled interfaces docker0 8000.3a1d7362b4ee no veth65f9 vethdda6每次创建一个新容器的时候,Docker从可用的地址段中选择一个空闲的IP地址分 配给容器的eth0端口。使用本地主机上docker0接口的IP作为所有容器的默认 网关。
自定义网桥
除了默认的docker0网桥,用户也可以指定网桥来连接各个容器。
在启动Docker服务的时候,使用-bBRIDGE或--bridge=BRIDGE来指定使用 的网桥。
如果服务已经运行,那需要先停止服务,并删除旧的网桥。
$ sudo systemctl stop docker $ sudo ip link set dev docker0 down $ sudo brctl delbr docker0然后创建一个网桥 bridge0。
$ sudo brctl addbr bridge0 $ sudo ip addr add 192.168.5.1/24 dev bridge0 $ sudo ip link set dev bridge0 up查看确认网桥创建并启动。
在Docker配置文件 /etc/docker/daemon.json 中添加如下内容,即可将 Docker默认桥接到创建的网桥上。
{ "bridge": "bridge0", }启动Docker服务。
新建一个容器,可以看到它已经桥接到了 bridge0 上。
可以继续用brctlshow命令查看桥接的信息。另外,在容器中可以使用ip addr和iproute 命令来查看IP地址配置和路由信息。
docker网络还是比较复杂的(对于我这种网络空白的来说),篇幅有限,关于docker网络配置就介绍到这里了,感兴趣的朋友可以测试下~
后面会分享更多关于devops和DBA内容,感兴趣的朋友可以关注下~