使用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程序
这样会动态的打印资源使用情况,可以根据自己需求加入其它指标
|