🤖 AI文章摘要 qwen-turbo-latest
加载中...

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.35432端口。


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服务器。