可通过 docker inspect 获取容器 NetNS 路径(NetworkSettings.SandboxKey)和 PID(State.Pid),再结合宿主机 ls -li /proc/[pid]/ns/ 提取各命名空间 inode 号,其中 SandboxKey 对应 netns 绑定路径,PID 用于查所有 ns 的唯一 inode 标识。

在 Docker 中,容器的底层 Namespace ID(如 PID、UTS、IPC、NET 等)并不直接暴露在 docker ps 或常规状态字段中,但可通过 docker inspect 结合 Go 模板(--format)从容器运行时信息中提取。关键在于:这些 ID 实际存储在 State.Pid 对应的进程所挂载的 /proc/[pid]/ns/ 下,而 docker inspect 本身不直接返回 Namespace inode 号——需借助宿主机上的 ls -li /proc/[pid]/ns/* 手动查,或通过 exec 进入容器命名空间后间接比对。不过,有一种稳定、免进容器、纯 inspect 的方式可获取 *NetNS* 和 *PIDNS* 的唯一标识线索:利用 NetworkSettings.SandboxKey(对应 netns 路径)和 State.Pid 推导。
获取容器 NetNS 唯一路径(最常用且可靠)
Docker 为每个容器的网络命名空间创建一个沙箱目录(sandbox),其路径即为该容器 netns 的稳定标识,等价于 /proc/[pid]/ns/net 的宿主机视角绑定点:
- 执行:
docker inspect -f '{{.NetworkSettings.SandboxKey}}' - 输出示例:
/var/run/docker/netns/487a5b2e1c8d - 该路径是 bind-mounted 到容器 init 进程 netns 的,可直接用
nsenter -n -t验证,也可用-- /bin/sh readlink /proc/对比确认 inode 是否一致/ns/net
通过 State.Pid 获取 PIDNS 和其它 Namespace 的 inode 号
docker inspect 提供 .State.Pid,这是容器 init 进程在宿主机上的真实 PID。有了它,就能在宿主机上读取其全部 namespace 的 inode 编号(Linux 中 inode 是同一命名空间内所有进程共享的唯一标识):
- 先获取 PID:
pid=$(docker inspect -f '{{.State.Pid}}') - 再查命名空间 inode:
ls -li /proc/$pid/ns/{pid,net,ipc,uts,mnt,user} - 输出形如:
4026532649 0 lrwxrwxrwx 1 root root 0 Jun 10 14:22 pid -> 'pid:[4026532649]',其中数字4026532649即该 PIDNS 的唯一 inode 号 - 注意:
userns 在启用 user namespace 时才独立;默认情况下多数 ns 共享 host 的 user ns
用 Go template 提取多个 Namespace 路径(批量处理场景)
若需脚本化提取 net、ipc、uts 等 ns 的符号链接目标(非 inode,但含唯一编号),可用嵌套模板拼接命令:
- 示例(提取 net 和 ipc ns 目标):
docker inspect -f 'Net: {{(index .HostConfig.NetworkMode "ContainerID")}}; NS-Net: {{.NetworkSettings.SandboxKey}}; IPC-Path: {{.HostConfig.IpcMode}}' - 更通用做法是结合
sh -c封装:docker inspect -f '{{.State.Pid}}'| xargs -I{} sh -c 'echo "PID: {}; NS: $(ls -li /proc/{}/ns/{net,pid,ipc} | awk \"{print \$1,\$11}\")"'
注意事项与常见误区
Namespace 的“唯一性”依赖于 inode 号(Linux VFS 层),而非路径名或容器名。以下几点需留意:
-
docker inspect不直接输出pid:[inode]字符串,必须通过/proc/[pid]/ns/查看 -
NetworkSettings.SandboxKey在使用host或none网络模式时为空,此时 netns 与宿主机共享,无独立标识 - 容器重启后
State.Pid改变,所有关联的 ns inode 也会变(即使容器配置完全相同) - 不要混淆
HostConfig.NetworkMode(如container:xxx)与实际 netns 路径——后者只对当前容器有效











