docker查看容器进程
原创大约 2 分钟
机器环境
本实践将在 Ubuntu 22.04.3LTS 系统上进行测试
docker 版本Docker Engine - Community 24.0.6
,原则上docker版本无影响
背景
ps aux
显示多个进程 , 当这个进程是docker进程的时候无法区分是那个docker的进程
操作命令
使用
docker top
和grep
:
首先,通过列出所有正在运行的容器,然后使用docker top
命令来检查每个容器的进程列表。例如,假设你想查找 PID 为
12345
的进程属于哪个容器,可以使用以下脚本:PID=12345 # 替换为你要查找的进程 PID for container in $(docker ps -q); do if docker top $container | grep -w $PID > /dev/null 2>&1; then echo "PID $PID belongs to container $container" break fi done
使用
docker inspect
:docker inspect
命令可以显示容器的详细信息,包括它们的主进程 ID。你可以利用这个来检查每个容器的主进程 ID。PID=12345 # 替换为你要查找的进程 PID for container in $(docker ps -q); do container_pid=$(docker inspect --format '{{.State.Pid}}' $container) if [ "$container_pid" -eq "$PID" ]; then echo "PID $PID belongs to container $container" break fi done
查找容器的命名空间:
使用命名空间的方法也可以帮助查找哪个容器包含特定的 PID。PID=12345 # 替换为你要查找的进程 PID for container in $(docker ps -q); do container_pid=$(docker inspect --format '{{.State.Pid}}' $container) if [ -n "$container_pid" ]; then if [ "$(readlink /proc/$PID/ns/pid)" == "$(readlink /proc/$container_pid/ns/pid)" ]; then echo "PID $PID belongs to container $container" break fi fi done
使用
nsenter
命令:
你可以使用nsenter
命令进入容器的命名空间,并检查目标进程是否存在于该命名空间中。PID=12345 # 替换为你要查找的进程 PID for container in $(docker ps -q); do container_pid=$(docker inspect --format '{{.State.Pid}}' $container) if nsenter --target $container_pid --pid -- ls /proc | grep -w $PID > /dev/null 2>&1; then echo "PID $PID belongs to container $container" break fi done