1 背景
Docker打包Java后台服务镜像,启动命令样式为:java -jar ****.jar
在K8S中启动镜像时,启动的PID为1,此时无法通过jmap和jinfo查看JVM相关信息。
PID 1~5是Linux的特殊进程。
序号 | pid进程号 | 描述 |
---|---|---|
1 | 1 | init进程,系统启动的第一个用户级进程,是其他所有进程的父进程,引导用户空间服务 |
2 | 2 | kthreadd,内核线程管理 |
3 | 3 | migration,用于进程在不同CPU间迁移 |
4 | 4 | ksoftirqd,内核中软中断守护线程,用于系统空闲时定时处理软中断事务 |
5 | 5 | watchdog,看门狗进程,用于监听内核异常,当系统出现宕机时,可利用watchdog记录宕机时堆栈信息 |
配置如下:
# 环境
FROM williamyeh/java8:latest
# 管理者信息
MAINTAINER xindaqi "*******@qq.com"
# 本地文件挂载到容器
WORKDIR /home/xindaqi/project/tutorial
# 拷贝jar文件
COPY tutorial.jar /tutorial.jar
# 设置端口号
EXPOSE 9121
# 运行jar包
ENTRYPOINT ["java", "-jar", "/tutorial.jar", "&"]
2 方案
避免java应用作为第一个启动的应用。添加tini,作为第一个启动的应用。
- 使用openjdk:8-jdk-alpine作为基础镜像
- 运行apk add --no-cache tini
- 添加tini作为第一个运行的参数[“tini”, “java”, “-jar”, “/tutorial.jar”, “&”]
2.1 Dockerfile配置
# 环境
FROM openjdk:8-jdk-alpine
# 管理者信息
MAINTAINER xindaqi "******@qq.com"
# 本地文件挂载到容器
WORKDIR /home/xindaqi/project/tutorial
# 拷贝jar文件
COPY tutorial.jar /tutorial.jar
# 运行tini
RUN apk add --no-cache tini
# 设置端口号
EXPOSE 9121
# 运行jar包
ENTRYPOINT ["tini", "java", "-jar", "/tutorial.jar", "&"]
2.2 查看进程
- 查看Pods
kubectl get pods
- 进入Pods
kubectl exec -it pod-name -- /bin/sh
- 查看pid
jps -l
由结果可知,java应用的pid为7。