docker运行java程序 使用jmap,jstack命令 tini运行的程序获取进程

使用docker进行部署java程序,过程中会遇到一些问题,首先对docker要有一个基本的了解

初学可以把docker当成一个linux中的虚拟机

我们这里采用的是alpine系统

想要对docker中的java程序使用java的一些命令,首先java程序要使用tini托管的方式进行运行,默认java程序会使用1进程,1号负责执行内核的部分初始化工作及进 行系统配置,并创建若干个用于高速缓存和虚拟主存管理的内核线程,java的一些命令(jmap,jstack...)是无法使用到1进程的

tini使用方法

在制做镜像时在dockerfile中加入以下命令,此命令还解决时区问题

FROM wehkamp/jre:8.212.04-r0_02
VOLUME /tmp
ENV TZ=Asia/Shanghai
RUN echo "http://mirrors.aliyun.com/alpine/v3.8/main/" > /etc/apk/repositories
RUN echo "http://mirrors.aliyun.com/alpine/v3.8/community/" >> /etc/apk/repositories
RUN apk update
RUN apk add --no-cache tzdata
RUN apk add --no-cache tini
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ADD admin.jar app.jar
ENTRYPOINT tini java -Djava.security.egd=file:/dev/./urandom  -jar -Xms1024m -Xmx2048m /app.jar

此时运行的java程序在docker一般为6

这个时候就可以正常使用java的一些内置命令了,如果镜像中没有这些命令,可以自己在docker进行安装

cd /etc/apk
vi repositories
替换成阿里源
http://mirrors.aliyun.com/alpine/v3.8/main/
http://mirrors.aliyun.com/alpine/v3.8/community/
2、apk update
3、apk add openjdk8
4、cd /usr/lib/jvm/java-1.8-openjdk/bin
5、./jstack  ||  ./jmap
6、./jmap -dump:live,format=b,file=dump20191028.hprof pid

有时候并不想获取到这么细,其实docker的进程在物理系统中也时存在对应进程的,不过,一个java程序会有两个大进程,会有所属关系,tini--》java--》java子进程

docker ps | grep java程序

docker inspect -f '{ {.State.Pid}}' 容器id

pstree -p pid

这样就可以查看对应的进程树,不过对进程是无法使用java的一些命令的

当然还可以直接使用命令,查看docker使用资源情况

docker stats --format "table { {.Name}}\t{ {.CPUPerc}}\t{ {.MemUsage}}" | grep java程序

这样会动态的打印资源使用情况,可以根据自己需求加入其它指标

 

 

你可能感兴趣的:(java,docker,java)