Docker 网络模型
面试题
Docker 的网络模型是怎样的?容器如何实现网络通信?
标准答案
Docker 的网络模型基于 Linux 的网络命名空间(Network Namespace)和虚拟网络设备(veth pair),实现了容器之间、容器与宿主机之间以及容器与外部的网络通信。
Docker 网络模型概述
Docker 网络模型的核心概念:
# 查看 Docker 网络列表
docker network ls
# 默认有三种网络
NETWORK ID NAME DRIVER SCOPE
abc123... bridge bridge local
def456... host host local
ghi789... none null local
| 网络模式 | 驱动 | 说明 |
|---|---|---|
| bridge | bridge | 默认模式,通过网桥连接容器 |
| host | host | 容器直接使用宿主机网络栈 |
| none | null | 无网络,完全隔离 |
| overlay | overlay | 跨主机通信(Swarm 模式) |
| macvlan | macvlan | 容器拥有独立 MAC 地址 |
核心组件
# Docker 网络模型由以下组件构成
# 1. Network Namespace(网络命名空间)
# 2. veth pair(虚拟网卡对)
# 3. Bridge(网桥)
# 4. iptables(NAT 和防火墙规则)
1. 网络命名空间(Network Namespace)
# 每个容器有自己的网络命名空间
# 拥有独立的网络栈:网卡、路由表、iptables
# 查看宿主机的网络命名空间
lsns -t net
# 查看容器的网络命名空间
docker inspect --format '{{.State.Pid}}' my-container
# 12345
ls -la /proc/12345/ns/net
# lrwxrwxrwx 1 root root 0 ... net -> net:[4026531992]
2. veth pair(虚拟以太网设备对)
# veth pair 是一对虚拟网卡
# 一端在容器内(eth0),另一端在宿主机(vethXXXX)
# 数据从一端进入,立即从另一端出来
# 查看宿主机的 veth 设备
ip link show | grep veth
# 12: vethabc123@if11:
3. Bridge(网桥)
# 默认的 docker0 网桥
ip addr show docker0
# 3: docker0:
# inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
# 所有连接到 docker0 的容器可以通过网桥通信
# 网桥充当虚拟交换机
4. iptables(NAT 规则)
# 查看 Docker 添加的 iptables 规则
iptables -t nat -L -n
# 关键规则
# MASQUERADE:容器访问外网时的 SNAT
# DNAT:外部访问容器时的端口映射
通信路径
# 容器 A 访问外网(http://example.com)
# 1. eth0(容器 A)→ vethA(宿主机)
# 2. vethA → docker0 网桥
# 3. docker0 → 宿主机路由表
# 4. 宿主机 eth0 → iptables SNAT(源地址替换为宿主机 IP)
# 5. → 路由器 → 互联网
# 外部访问容器(http://host:8080 → 容器 80 端口)
# 1. 宿主机 eth0 收到请求(IP:宿主机, 端口:8080)
# 2. iptables DNAT 规则:目标改为 172.17.0.2:80
# 3. docker0 网桥转发到 veth 设备
# 4. 进入容器 A 的 eth0
通信模式
# 1. 容器 ↔ 外网
# 通过 NAT(默认 bridge 模式)
# 2. 容器 ↔ 宿主机
# 通过 docker0 网桥直接通信
# 3. 同一网桥的容器 ↔ 容器
# 通过 docker0 直接通信(默认互通)
# 4. 不同网桥的容器 ↔ 容器
# 不能直接通信,需要路由或自定义网络连接
网络驱动的选择建议
# 单机场景(最常用)
# bridge(默认)→ 99% 的场景适用
# host → 需要极致性能时
# none → 安全隔离要求高时
# 多机场景
# overlay → Docker Swarm 跨主机通信
# macvlan → 容器需要像物理机一样接入网络
面试官追问
问:Docker 网络模型和传统虚拟机网络模型的区别?
答:
– 虚拟机:通过虚拟网卡 + 虚拟交换机(如 bridge)模拟完整的网络硬件,性能有损耗
– 容器:直接使用 Linux 内核的网络命名空间和 veth pair,本质上是进程级的网络隔离,性能接近原生
– Docker 不需要 MAC 学习(除非用 macvlan),通过 veth pair 直接打通
问:Docker 的网络模型遵循什么标准?
答:Docker 早期版本使用自己的 CNM(Container Network Model),后来社区形成了 CNI(Container Network Interface)标准。Kubernetes 使用的是 CNI,Docker 从 1.9 版本后也通过 libnetwork 兼容 CNM。现在很多 Docker 的高级网络方案(如 Calico、Flannel)都基于 CNI。
总结
Docker 网络模型的核心是:网络命名空间隔离 + veth pair 打通 + 网桥连接 + iptables NAT。理解这四个组件及其协作方式,就能掌握 Docker 网络的本质。默认 bridge 模式适合绝大多数单机场景,host 模式追求性能,none 模式追求安全隔离。


暂无评论内容