查宿主机PID对应容器
原创2025年9月9日大约 1 分钟
查宿主机PID对应容器
通过宿主机上的 PID 找到它属于哪个 Docker 容器。操作方法:
1. 使用 docker inspect
查询 PID 所属容器
Docker 每个容器在宿主机上都会有一个 init 进程(PID 1) 的宿主机 PID。我们可以利用 /proc/[pid]/cgroup
来定位。
假设你知道宿主机上的 PID 为 12345
:
cat /proc/12345/cgroup
你会看到类似输出:
12:memory:/docker/4a432b1c2e1b...
11:cpu,cpuacct:/docker/4a432b1c2e1b...
这里 4a432b1c2e1b...
就是容器的 部分容器 ID。
然后可以用:
docker ps -q | xargs -n1 docker inspect --format '{{.Id}} {{.Name}}' | grep 4a432b1c2e1b
这样就能找到这个 PID 对应的容器名字了。
2. 另一种方法:直接用 docker top
如果你有很多容器,也可以直接查:
docker ps -q | while read cid; do
docker top $cid -eo pid,comm | grep 12345 && echo "Container ID: $cid"
done
docker top <container>
会列出容器内进程和对应宿主机 PID。- grep 出你的 PID,就能对应容器。
一行命令版本
pid=12345; cid=$(cat /proc/$pid/cgroup | grep "docker" | head -n1 | awk -F/ '{print $NF}'); docker ps --no-trunc --format '{{.ID}} {{.Names}}' | grep $cid
把
12345
换成你要查的宿主机 PID。输出会是:
4a432b1c2e1b7f... my_container_name
封装成函数(推荐)
find_docker_by_pid() {
pid=$1
if [ -z "$pid" ]; then
echo "Usage: find_docker_by_pid <pid>"
return 1
fi
cid=$(cat /proc/$pid/cgroup | grep "docker" | head -n1 | awk -F/ '{print $NF}')
if [ -z "$cid" ]; then
echo "PID $pid not in a docker container"
return 1
fi
docker ps --no-trunc --format '{{.ID}} {{.Names}}' | grep $cid
}
或
find_docker_by_pid() {
pid=$1
if [ -z "$pid" ]; then
echo "Usage: find_docker_by_pid <pid>"
return 1
fi
docker ps -q | while read cid; do
if docker top "$cid" -eo pid,comm | grep -q $pid; then
cname=$(docker inspect --format '{{.Name}}' "$cid" | sed 's/^\/ //')
echo "Container ID: $cid, Name: $cname"
break
fi
done
}