要让多个Docker容器共享同一网络协议栈,必须使用--network container:模式,即复用指定容器的Network Namespace,实现IP、端口、路由及iptables规则完全共享,而非bridge或host模式。

要让多个 Docker 容器共享同一个网络协议栈(即统一的 Network Namespace),核心是使用 --network container: 模式,而不是创建自定义 bridge 网络或依赖容器名解析。这种方式下,容器不拥有独立网卡和 IP,而是复用目标容器的网络环境——包括 localhost、端口空间、路由表、iptables 规则等,效果等同于 Linux 进程级网络共享。
明确 Container 模式的本质
Container 模式不是“连到同一张网”,而是“共用一个网络沙盒”。它不分配新 IP,也不经过 docker0 网桥转发;所有复用该模式的容器,在网络视角下就像运行在同一进程空间里的不同程序。
- 只有一个容器真正持有网络设备(如 eth0),其余只是挂载它的 netns
- 它们共享 127.0.0.1 —— 任一容器启动的服务,其他容器可通过 localhost 直接访问
- 端口不能冲突:若 A 容器占用了 6379,B 容器再尝试 bind 6379 会失败
- 主容器退出不影响已启动的复用容器运行,但删除主容器后,无法再基于它新建复用容器
实操步骤:启动共享网络栈的容器组
以 nginx + curl 调试组合为例:
- 先起一个基础容器作为网络锚点:docker run -d --name net-base nginx:alpine
- 再起业务容器,复用它的网络:docker run -it --network container:net-base alpine sh
- 进入 shell 后执行 ip addr,看到的网络接口与 net-base 完全一致
- 在该 shell 中运行 nc -zv localhost 80,能立即连通 nginx 服务
与 Bridge 和 Host 模式的区别
Bridge 网络(包括自定义 bridge)为每个容器分配独立 IP 和 netns,仅靠 DNS 或 IP 通信,不共享协议栈;Host 模式虽共享宿主机 netns,但失去隔离性且端口全局可见,不适合多容器协同部署。
- Bridge:容器间可互通,但需通过服务名或 IP,各自有独立端口空间
- Host:所有容器和宿主机共用一套网络,易引发端口冲突,不适用于生产隔离场景
- Container 模式:轻量、隔离性强(文件系统/进程仍独立)、适合紧耦合服务(如 sidecar 架构)
注意事项与常见问题
这种模式对生命周期管理有隐含依赖,实际使用中需注意:
- 不要用 --rm 启动锚点容器,否则退出即销毁,后续容器无法复用
- 无法通过 docker network connect 动态加入 container 模式网络
- docker-compose 不原生支持 --network container: 语法,需改用命令行或自定义脚本编排
- 调试时可用 nsenter -n -t $(pidof nginx) 进入 netns 验证一致性


















