tini

https://github.com/krallin/tini

Docker tini进程管理器 — Cloud Atlas: Discovery beta 文档

tini 容器init 是一个最小化的 init 系统,运行在容器内部,用于启动一个子进程,并等待进程退出时清理僵尸和执行信号转发。 这是一个替代庞大复杂的systemd体系的解决方案,已经集成到Docker 1.13中,并包含在Docker CE的所有版本。

Tini的优点:

不用tini问题

Docker打包Java后台服务镜像,启动命令样式为:java -jar ****.jar

启动的PID为1,java的一些命令(jmap,jstack...)是无法使用到1进程的

PID 1~5是Linux的特殊进程。

序号 pid进程号 描述
1 1 init进程,系统启动的第一个用户级进程,是其他所有进程的父进程,引导用户空间服务
2 2 kthreadd,内核线程管理
3 3 migration,用于进程在不同CPU间迁移
4 4 ksoftirqd,内核中软中断守护线程,用于系统空闲时定时处理软中断事务
5 5 watchdog,看门狗进程,用于监听内核异常,当系统出现宕机时,可利用watchdog记录宕机时堆栈信息

Dockerfile

# 使用官方基础镜像
FROM openjdk:8-jdk-alpine

# 设置工作目录
WORKDIR /app

# 将应用 jar 包复制到容器中
COPY app.jar /app/app.jar

# 设置默认的Java调优参数,也可以通过环境变量覆盖
ENV JAVA_OPTS="-server \\
-Xms4096m -Xmx4096m -Xmn3000m -Xss256k \\
-XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M \\
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 \\
-XX:+UnlockDiagnosticVMOptions -XX:+PrintGCDetails \\
-XX:+PrintGCDateStamps -Xloggc:/logs/gc.log \\
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs \\
-Dcom.sun.management.jmxremote=true \\
-Dcom.sun.management.jmxremote.port=9010 \\
-Dcom.sun.management.jmxremote.authenticate=false \\
-Dcom.sun.management.jmxremote.ssl=false"

# 创建日志目录
RUN mkdir -p /logs

# 定义容器启动时执行的命令
CMD ["sh", "-c", "java $JAVA_OPTS -jar /app/app.jar"]

Java使用tini

避免java应用作为第一个启动的应用。添加tini,作为第一个启动的应用。