https://github.com/krallin/tini
Docker tini进程管理器 — Cloud Atlas: Discovery beta 文档
tini 容器init 是一个最小化的 init 系统,运行在容器内部,用于启动一个子进程,并等待进程退出时清理僵尸和执行信号转发。 这是一个替代庞大复杂的systemd体系的解决方案,已经集成到Docker 1.13中,并包含在Docker CE的所有版本。
Tini的优点:
SIGTERM 可以终止进程,不需要你明确安装一个信号处理器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记录宕机时堆栈信息 |
# 使用官方基础镜像
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,作为第一个启动的应用。