共享网络栈排障
docker run --network container:目标 让新容器复用目标容器的网络命名空间:两者看到的是同一套网卡、路由、DNS 与端口表,新容器里执行 ss、curl、tcpdump 得到的就是目标容器的真实网络视图。这类做法不改动目标容器、不需要在业务镜像里装排查工具,常用于生产环境里「只看不碰」的现场诊断。
基本信息
| 语法 | --network container:目标容器名或 ID |
|---|---|
| 前置条件 | 目标容器存在,可以是运行中或已停止 |
| 常用工具镜像 | nicolaka/netshoot、busybox、curlimages/curl |
| 限制 | 该容器不能再发布端口,端口由目标容器承担 |
典型使用场景
- 业务镜像里没有排查工具:临时起一个带工具链的容器,共享网络栈做诊断
- 核对监听情况:确认应用实际监听的是 0.0.0.0 还是 127.0.0.1
- 验证本机响应:从容器自身视角请求 localhost,排除外部链路干扰
- 抓包定位:只抓目标容器的流量,不引入额外网卡与混杂模式
- 对比解析配置:读取目标容器真正生效的路由表与 DNS 配置
诊断示例
诊断示例
# 查看目标容器的监听与端口映射结果
docker run --rm -it --network container:web nicolaka/netshoot ss -ltnp
# 从目标容器视角访问自身服务
docker run --rm --network container:web curlimages/curl:8.8.0 -sS -o /dev/null -w '%{http_code}' http://127.0.0.1:80/
# 抓取该容器的流量,指定时间与文件
docker run --rm -it --network container:web nicolaka/netshoot tcpdump -i any -c 20 port 80
# 核对路由与 DNS 配置
docker run --rm --network container:web nicolaka/netshoot ip route检查项对照
| 排查目标 | 在共享容器里执行 | 能看出什么 |
|---|---|---|
| 端口监听 | ss -ltnp | 与目标容器完全一致的监听地址与端口 |
| 本机响应 | curl -s http://localhost:端口 | 应用自身的返回,不含外部链路 |
| 流量内容 | tcpdump -i any port 端口 | 只包含该容器的收发报文 |
| 网络配置 | ip route、cat /etc/resolv.conf | 目标容器真正生效的路由与 DNS |
该容器不能再用 -p 发布端口,端口映射必须由目标容器完成;排查结束直接删掉工具容器即可,不留下任何改动。
顶层进程退出后容器随即结束,交互式排查加 -it 保持现场,否则抓到一半就中断。