基于操作系统进程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:知识不是力量······只有可以被运用起来的知识,才会产生力量!