docker容器网络模式需从宿主机连容器、容器互访、流量出网三线理解,核心是netns与veth pair协同;bridge、host、none模式差异在于netns隔离程度及网络栈复用方式。

Docker 容器网络模式不是靠死记硬背,而是从“宿主机怎么连容器、容器怎么互相找、流量怎么出去”这三条线理清逻辑。掌握核心架构的关键,在于理解网络命名空间(netns)和虚拟设备如何协同工作,而不是只记命令。
先搞懂底层支撑:网络命名空间 + veth pair
每个容器默认拥有独立的网络命名空间,相当于一个私有操作系统网络视图(有自己的路由表、iptables、/proc/net、lo 接口等)。Docker 用 veth pair(一对虚拟网卡)把容器的 eth0 和宿主机上的 vethXXXX 连起来,再把后者挂到 docker0 网桥上——这就搭出了 bridge 模式的骨架。你可以用 ip netns 手动创建命名空间、ip link add type veth 模拟这个过程,比直接 run 容器更能看清数据流向。
重点吃透三种基础模式的差异本质
- bridge 模式:容器有自己 netns + 自动分配 IP(如 172.17.0.2),通信靠 docker0 转发,外部访问需 -p 映射端口。适合开发测试和常规服务部署。
- host 模式:容器不创建新 netns,直接复用宿主机的网络栈(ifconfig、netstat 输出和宿主机一致)。没有端口映射概念,启动时监听的端口就是宿主机端口,注意端口冲突。
- none 模式:容器有 netns,但里面只有 lo 接口,没 IP、没路由、没网卡。适合做纯计算任务或后续手动配网络(比如加 macvlan 或 ipvlan)。
动手验证比看文档更有效
- 启动两个 bridge 容器,用
docker exec -it c1 ping c2测试名称解析 → 验证 Docker 内置 DNS 在自定义网络中才生效(默认 bridge 不支持容器名通信) - 对比
docker run --net=bridge和--net=host下cat /proc/net/tcp的输出差异 → 看端口监听归属 - 进入容器执行
ip link和宿主机执行brctl show docker0→ 找出 veth 接口对应关系
进阶方向自然浮现
当你能画出 bridge 模式下“容器 eth0 ←→ vethX ←→ docker0 ←→ 宿主机 eth0 ←→ 外网”的完整路径,再学 overlay(跨主机封包)、macvlan(容器直连物理网段)、ipvlan(共享 MAC 地址)就只是替换其中某一段链路而已。真正卡住人的从来不是模式数量,而是没分清“谁在哪个命名空间里、谁负责转发、谁做地址转换”。
不复杂但容易忽略











