Docker 与网络
Docker 网络模型详解
一、Docker 网络模型概述
Docker 采用了一种名为容器网络模型的抽象设计,该模型定义了容器网络的基本架构。CNM 由三个核心组件构成:Sandbox(沙盒)、Endpoint(端点)和 Network(网络)。
1.1 Sandbox
Sandbox 代表一个容器的网络栈,包含网络接口卡(NIC)、路由表、DNS 设置等。每个容器都有自己独立的 Sandbox,这使得容器之间相互隔离,拥有独立的网络环境。Sandbox 可以是 Linux Network Namespace 的一部分,也可以是其他类似的隔离机制。
从容器内部的角度看,Sandbox 就是容器所看到的完整网络环境。容器内的进程只能看到自己 Sandbox 内的网络配置,无法直接访问宿主机或其他容器的网络栈。
1.2 Endpoint
Endpoint 是容器与网络之间的连接点,类似于虚拟交换机上的端口。一个容器可以有多个 Endpoint,分别连接到不同的网络。Endpoint 负责将容器内的数据包转发到外部网络,或者将外部网络的数据包转发到容器内。
Endpoint 实现了容器与网络之间的数据传输,它通过 veth pair 技术连接容器的网络接口和宿主机的网络桥接口。每个 Endpoint 都有唯一的 IP 地址和 MAC 地址。
1.3 Network
Network 是一组可以相互通信的 Endpoint 的集合。Network 可以由用户创建,也可以由 Docker 自动创建。Docker 支持多种网络驱动,每种驱动实现了不同的 Network 类型。
Network 负责管理网络内的 IP 地址分配、路由规则、数据包转发等功能。同一个 Network 内的容器可以直接通信,不同 Network 内的容器默认情况下无法直接通信。
二、四种内置网络驱动
Docker 提供了四种内置的网络驱动,每种驱动适用于不同的场景。
2.1 Bridge 驱动
Bridge 是 Docker 的默认网络驱动。当创建容器时,如果不指定网络,容器将自动连接到名为 bridge 的默认网络。
2.1.1 docker0 网桥
Bridge 驱动使用 Linux bridge 技术,在宿主机上创建一个名为 docker0 的虚拟网桥。docker0 网桥类似于物理交换机,负责连接所有连接到该网络的容器。
查看 docker0 网桥的配置:
1 | |
docker0 网桥通常拥有一个私有 IP 地址(如 172.17.0.1),作为该网络的网关。
2.1.2 veth pair
每个连接到 bridge 网络的容器都会创建一对 veth(virtual ethernet)设备。veth pair 是一对虚拟网络接口,它们像一根虚拟网线的两端,一个接口在容器内,另一个接口在宿主机上并连接到 docker0 网桥。
查看容器的 veth 设备:
1 | |
当容器内发送数据包时,数据包通过 veth pair 传输到 docker0 网桥,再由网桥根据 MAC 地址转发到目标容器或外部网络。
2.1.3 端口映射
为了让外部网络能够访问容器内的服务,可以使用端口映射(Port Mapping)。端口映射通过 NAT(网络地址转换)技术,将宿主机的端口映射到容器的端口。
创建容器时使用 -p 参数进行端口映射:
1 | |
Docker 使用 iptables 规则实现端口映射,外部访问宿主机 8080 端口的流量会被转发到容器的 80 端口。
2.2 Host 驱动
Host 驱动使容器共享宿主机的网络栈,容器不再拥有独立的网络命名空间。使用 host 网络的容器可以直接使用宿主机的 IP 地址和端口,与宿主机网络完全隔离。
使用 host 网络驱动:
1 | |
Host 网络的优势在于性能,因为没有网络隔离和 NAT 转换的开销。但缺点是容器与宿主机共享网络,容易产生端口冲突,且安全性较低。
Host 网络适用于需要高性能网络访问或需要直接访问宿主机网络服务的场景,如监控系统、网络工具等。
2.3 None 驱动
None 驱动为容器提供一个完全隔离的网络环境,容器只有 loopback 接口(lo),没有任何外部网络连接。
使用 none 网络驱动:
1 | |
None 网络适用于需要完全隔离的场景,如进行安全测试、自定义网络配置等。容器需要手动配置网络才能与外部通信。
2.4 Overlay 驱动
Overlay 驱动用于跨主机的容器通信。Overlay 网络基于 VXLAN 技术,在物理网络之上创建一个虚拟的二层网络,使不同宿主机上的容器仿佛在同一个局域网内。
2.4.1 VXLAN 技术
VXLAN(Virtual Extensible LAN)是一种网络虚拟化技术,它将二层以太网帧封装在 UDP 数据包中,通过三层网络传输。VXLAN 使用 24 位的 VNI(VXLAN Network Identifier)标识不同的虚拟网络,支持多达 1600 万个虚拟网络。
2.4.2 创建 Overlay 网络
创建 overlay 网络需要 Docker Swarm 或 Kubernetes 等容器编排系统的支持。以下是在 Swarm 集群中创建 overlay 网络的示例:
1 | |
Overlay 网络自动处理跨主机的 IP 地址分配、路由发现、加密传输等功能,使容器间的通信就像在同一个宿主机上一样简单。
三、容器间通信
3.1 同一 Bridge 网络内的通信
连接到同一个 bridge 网络的容器可以通过容器名称或 IP 地址相互通信。Docker 内置的 DNS 服务器会自动为容器提供名称解析服务。
1 | |
Docker DNS 服务器会根据容器的名称返回其 IP 地址,容器之间无需知道彼此的具体 IP 即可通信。
3.2 跨网络通信
默认情况下,连接到不同网络的容器无法直接通信。如果需要跨网络通信,可以将容器连接到多个网络。
1 | |
连接到多个网络的容器拥有多个网络接口,可以通过不同的网络接口与不同网络内的容器通信。
四、容器与外部通信
4.1 端口映射
容器与外部网络通信的主要方式是端口映射。通过端口映射,外部网络可以通过访问宿主机的端口来访问容器内的服务。
端口映射的配置方式:
1 | |
4.2 iptables/NAT 规则
Docker 使用 iptables 实现 NAT 功能,将外部访问宿主机端口的流量转发到容器的端口。Docker 会自动创建和维护 iptables 规则。
查看 Docker 创建的 iptables 规则:
1 | |
Docker 的 iptables 规则主要包括:
- PREROUTING 链:处理进入宿主机的数据包,将目标地址为宿主机 IP 和映射端口的数据包转发到容器
- POSTROUTING 链:处理离开容器的数据包,进行源地址伪装(MASQUERADE),使容器的响应能够返回给外部客户端
- FORWARD 链:控制数据包的转发,允许或拒绝数据包在容器和外部网络之间传输
当外部请求到达宿主机的映射端口时,iptables 将目标地址和端口修改为容器的 IP 地址和端口,数据包进入容器。容器响应时,iptables 将源地址和端口修改回宿主机的地址和端口,使响应能够正确返回给客户端。
五、Docker DNS
Docker 内置了一个 DNS 服务器,为容器提供名称解析和服务发现功能。Docker DNS 服务器的默认地址是 127.0.0.11。
5.1 内置 DNS 服务器
Docker DNS 服务器在每个容器启动时自动配置,容器可以通过它解析其他容器的名称。Docker DNS 支持以下类型的记录:
- A 记录:将容器名称映射到 IP 地址
- SRV 记录:提供服务的端口号信息
- PTR 记录:反向查询,将 IP 地址映射到容器名称
查看容器的 DNS 配置:
1 | |
输出示例:
1 | |
5.2 服务发现
Docker DNS 的服务发现功能使容器能够通过容器名称或服务名称相互发现和通信,无需硬编码 IP 地址。
1 | |
在 Docker Swarm 模式下,Docker DNS 还支持服务名称的负载均衡。当多个容器提供同一个服务时,DNS 服务器会返回所有容器的 IP 地址,客户端可以根据负载均衡策略选择其中一个。
六、常用命令
6.1 docker network create
创建新的网络:
1 | |
6.2 docker network ls
列出所有网络:
1 | |
6.3 docker network inspect
查看网络的详细信息:
1 | |
6.4 docker network connect
将容器连接到网络:
1 | |
6.5 docker network disconnect
将容器从网络断开:
1 | |
6.6 docker network rm
删除网络:
1 | |
七、macvlan 驱动简介
macvlan 驱动允许容器拥有独立的 MAC 地址,使它们在网络上看起来就像独立的物理设备。macvlan 适用于需要容器直接接入物理网络或需要容器拥有真实 MAC 地址的场景。
7.1 macvlan 的工作原理
macvlan 在宿主机的物理网络接口上创建多个虚拟网络接口,每个虚拟接口拥有独立的 MAC 地址和 IP 地址。容器直接使用这些虚拟接口,无需通过 NAT 或 bridge。
7.2 创建 macvlan 网络
创建 macvlan 网络需要宿主机有可用的物理网络接口:
1 | |
7.3 macvlan 的优缺点
优点:
- 容器拥有独立的 MAC 地址,在网络中可见
- 性能好,没有 NAT 或 bridge 的开销
- 适用于需要直接接入物理网络的场景
缺点:
- 需要物理网络接口支持
- 容器数量受限于物理接口的 MAC 地址表大小
- 宿主机无法直接与 macvlan 网络中的容器通信(需要额外的配置)
7.4 使用注意事项
使用 macvlan 时需要注意以下几点:
- 确保物理网络接口支持 promiscuous 模式
- 注意 IP 地址冲突,避免与网络中的其他设备冲突
- 宿主机默认无法与 macvlan 容器通信,需要创建额外的 macvlan 接口或在宿主机上添加路由
1 | |
八、总结
Docker 网络模型基于 CNM 设计,通过 Sandbox、Endpoint 和 Network 三个核心组件实现了灵活的网络隔离和通信。Docker 提供了多种网络驱动,包括 bridge、host、none 和 overlay,满足不同场景的需求。
Bridge 网络是默认选择,适用于大多数单主机场景;Overlay 网络支持跨主机通信,适用于集群环境;Host 网络提供高性能但缺乏隔离;None 网络提供完全隔离。
Docker 内置的 DNS 服务器简化了容器间的服务发现,常用的网络管理命令使网络配置变得简单直观。macvlan 驱动为需要直接接入物理网络的场景提供了支持。
理解 Docker 网络模型对于构建可靠的容器化应用至关重要,合理选择网络驱动和配置网络策略可以提高应用的安全性、可扩展性和性能。





