docker默认使用bridge模式,通过docker0网桥和veth pair实现容器间通信及nat对外访问;host模式共享宿主机网络栈以获极致性能;none模式提供完全网络隔离;container模式让容器共享网络命名空间;overlay用于跨主机通信。

先搞清三个核心概念
所有网络模式都围绕这三点展开:网络命名空间(Network Namespace)决定隔离程度;veth pair + 网桥(如 docker0)是容器连通的物理基础;iptables NAT 规则控制流量如何进出宿主机。比如 bridge 模式下,容器有独立命名空间和 veth 接口,靠 docker0 转发、靠 iptables 做端口映射;host 模式直接跳过前两者,直接复用宿主机网络栈。
从默认 bridge 模式开始动手
这是绝大多数应用的起点,也是理解其他模式的参照系:
- 启动一个容器不加任何网络参数,它自动接入
bridge网络,IP 来自172.17.0.0/16子网,网关是172.17.0.1(即 docker0 的 IP) - 用
docker network inspect bridge查看网桥配置;用docker exec -it 容器名 ip addr看容器内 eth0 地址 - 两个 bridge 容器能直接 ping 通对方 IP,但外部访问必须通过
-p 8080:80映射端口——因为 docker0 不对外暴露 - 想让容器间用名字通信?建自定义 bridge 网络:
docker network create mynet,再启动容器时指定--network mynet,DNS 自动生效
按需求切换其他模式
不是为了“高级”而换模式,而是业务卡点逼你换:
- 需要极致性能且不怕端口冲突:选 host 模式。比如监控 agent、日志收集器这类要高频采集宿主机指标的容器,直接共享网络栈省掉所有转发开销,但得确保它监听的端口宿主机没被占
- 完全不需要联网或准备自己配网络:用 none 模式。例如离线数据校验脚本、加密密钥生成器,启动后只跑一条命令就退出,连 lo 都够用
- 多个容器必须共用一套网络身份:选 container 模式。典型如 nginx + php-fpm 组合,让 php-fpm 容器共享 nginx 容器的网络命名空间,它们之间走 127.0.0.1 通信,不用暴露端口也不依赖 DNS
跨主机通信别硬啃 overlay
单机练熟 bridge/host/none 后,再碰多节点场景。overlay 不是独立模式,而是基于 swarm 或 k8s 的网络扩展方案。本地测试可先用 docker network create -d overlay --attachable myoverlay(需 swarm init),重点理解它怎么用 VXLAN 封包把不同物理机上的容器“逻辑拉到同一二层网络”。实际生产中,更常见的是用 CNI 插件(如 Calico、Flannel)替代原生 overlay。











