Docker网络
Docker网络
Docker网络一共6种类型,下面列举的常用4种类型:
# create external control network
docker network create -d [none|bridge|host|macvlan] <network-name>
Bridge网络
容器网络配置
在bridge网络下,docker会创建一个虚拟以太网适配器对,一个连接主机的bridge虚拟网桥,一个移动到容器的网络命名空间。docker会自动根据网络的网段定义给容器一端的虚拟以太网适配器分配ip地址,并自动配置默认网关指向bridge虚拟网桥。
下面展示了一个容器内部的网络配置,可以看到分配了ipv4地址172.16.0.3/16
,以及默认网关172.16.0.1
,此外eth0@if148
表明对端接口序号为148。
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
147: eth0@if148: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:10:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.16.0.3/16 brd 172.16.255.255 scope global eth0
valid_lft forever preferred_lft forever
ip route
default via 172.16.0.1 dev eth0
172.16.0.0/16 dev eth0 scope link src 172.16.0.3
在主机网络命名空间内寻找索引为148的网络设备,它被连接到了br-e4fd971c9c3c
网桥上,该网桥配置了172.16.0.1/16
地址。此外主机还配置了通向172.16.0.0/16
网段的路由。
ip addr
7: br-e4fd971c9c3c: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:42:6f:4e:88 brd ff:ff:ff:ff:ff:ff
inet 172.16.0.1/16 brd 172.16.255.255 scope global br-e4fd971c9c3c
valid_lft forever preferred_lft forever
inet6 fe80::42:42ff:fe6f:4e88/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
148: vethe8fcfae@if147: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-e4fd971c9c3c state UP group default
link/ether 7e:66:4a:21:6f:1e brd ff:ff:ff:ff:ff:ff link-netnsid 9
inet6 fe80::7c66:4aff:fe21:6f1e/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
ip route
default via xx.xx.xx.xx dev veth-default proto dhcp src xx.xx.xx.xx metric 1024
172.16.0.0/16 dev br-e4fd971c9c3c proto kernel scope link src 172.16.0.1
上面介绍了容器是如何与主机取得网络通信的,容器与外界取得通信是通过防火墙规则实现的。通过下面的信息可以看出,docker添加一个MASQUERADE
规则,针对172.16.0.0/16
网段的数据转发时进行地址伪装,让主机的地址代为进行请求。同时添加了一个DNAT
规则,发送到主机5432
端口的流量转发到172.16.0.3
的5432
端口。
iptables -t nat -L -n
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE 0 -- 172.16.0.0/16 0.0.0.0/0
Chain DOCKER (2 references)
DNAT 6 -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:5432 to:172.16.0.3:5432
容器DNS解析
在默认的bridge
网络下,docker复制/etc/resolv.conf
下的DNS配置到容器中的/etc/resolv.conf
下,但docker并不支持主机下127.0.0.0/8
网段下的DNS服务,因为容器网络命名空间和主机网络命名空间下的127.0.0.0/8
网段冲突。127.0.0.53
这个地址是个例外,因为这是systemd-resolved
服务提供的DNS服务,systemd-resolved
服务在通过DHCP服务器获取到DNS服务器时,会将结果缓存到/run/systemd/resolve/resolv.conf
路径,docker可以直接使用这个文件里的DNS服务器初始化容器。
在自定义的bridge
网络下,docker使用内嵌的DNS服务器,该DNS服务器会转发容器DNS请求到主机上配置的DNS服务器。