Docker 网络模型

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 模式追求安全隔离。

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容