基于操作系统进程ID,查看该进程是属于哪个docker容器的

有这么一个场景,在某个运行docker容器的主机上,查看到某个java进程占用的系统资源比较高,比如内存比较高,我们知道了这个进程是容器的进程,那么,我们怎么能够知道,这个进程是属于哪个容器的呢?

 

下面的命令,就会向你说明,如何在主机上,通过一个操作系统的进程,来获取该进程所在的容器名称······

 

首先,我们在主机上查看某个进程对应的PID

 

[root@nccztsjb-node-09 ~]# ps -ef |grep java | grep "/usr/local/java/bin/jav"
root      5220  5212  3 16:28 ?        00:00:04 /usr/local/java/bin/java -jar tools.jar ymscopy
root      6741 23869  0 16:30 pts/1    00:00:00 grep --color=auto /usr/local/java/bin/jav
root      9552  8476  3 Jun23 ?        03:38:10 /usr/local/java/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms512m -Xmx1792m -Xss8m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=768m -Duser.timezone=GMT+08 -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 -Djava.awt.headless=true -XX:+DisableExplicitGC -Djava.security.egd=file:/dev/./urandom -Duser.timezone=GMT+08 -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF8 -Duser.language=Zh -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
root     16063 16020  4 Jun23 ?        04:21:29 /usr/local/java/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms512m -Xmx1792m -Xss8m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=768m -Duser.timezone=GMT+08 -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 -Djava.awt.headless=true -XX:+DisableExplicitGC -Djava.security.egd=file:/dev/./urandom -Duser.timezone=GMT+08 -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF8 -Duser.language=Zh -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start

左边的第2列,就是获取到进程ID,我们以16063为例子

 

通过下面的命令,来获取该进程所在的容器的名称

 

psid=16063   # 这里替换为要查询的进程的PID

for i in $(docker container ls --format "{{.ID}}"); 
do 
    id_count=$(docker top $i | grep ${psid} | wc -l)
     
    if [[ ${id_count} -gt 0 ]]
      then
        echo -n "$i    "
        docker inspect -f '{{.Name}}' $i | tr -d "/"
    fi
done

 

可以看到,在图上标记为红色的部分,就是这个进程所在的容器的名称。

 

我们可以查,验证下

 

[root@nccztsjb-node-09 ~]# docker top 2371e32d413f
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                16003               15983               0                   Jun23               ?                   00:00:00            /usr/bin/dumb-init -- entrypoint.sh catalina.sh run
root                16020               16003               0                   Jun23               ?                   00:00:00            /bin/sh /usr/local/bin/entrypoint.sh catalina.sh run
root                16063               16020               4                   Jun23               ?                   04:21:34            /usr/local/java/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms512m -Xmx1792m -Xss8m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=768m -Duser.timezone=GMT+08 -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 -Djava.awt.headless=true -XX:+DisableExplicitGC -Djava.security.egd=file:/dev/./urandom -Duser.timezone=GMT+08 -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF8 -Duser.language=Zh -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
[root@nccztsjb-node-09 ~]# 

 

可以确定了,这个进程ID就是属于这个容器,说明我们上面的查询命令没有问题。

 

PS:知识不是力量······只有可以被运用起来的知识,才会产生力量!

posted @ 2022-06-27 16:38  Zhai_David  阅读(2953)  评论(0编辑  收藏  举报