Skip to content

Docker JRE基础镜像构建

Docker JRE基础镜像构建是指在运维流程中,为了支持Java应用的容器化部署,定制并制作一个包含Java运行环境(JRE)的基础镜像(Base Image)的过程^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。

在实际的微服务架构中(例如基于Dubbo的服务),直接将庞大的JDK或不可控的在线环境放入生产镜像是不规范的[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。通过构建一个标准化的JRE基础镜像,可以确保所有业务镜像拥有一致的运行时环境,并集成必要的运维工具(如监控Agent)[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。

构建目标与特性

构建JRE基础镜像的核心目标是创建一个轻量、统一且包含监控能力的运行环境^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。该镜像通常需要包含以下关键组件:

  • JRE环境:作为业务代码运行的基石,通常基于特定的版本,例如 JRE 8u112^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
  • 时区配置:为了避免容器内时区与宿主机不一致导致的问题,通常在构建阶段就将时区设置为 Asia/Shanghai^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
  • 监控集成:集成 Prometheus JMX Exporter,以便暴露 JVM 的监控指标^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
  • 启动脚本:预设一个通用的入口脚本(entrypoint.sh),用于动态加载 JAR 包和配置 Java Agent^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。

Dockerfile 解析

以下是一个典型的 base/jre8:8u112 镜像构建示例^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]:

FROM harbor.od.com/public/jre:8u112
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
    echo 'Asia/Shanghai' >/etc/timezone
ADD config.yml /opt/prom/config.yml
ADD jmx_javaagent-0.3.1.jar /opt/prom/
WORKDIR /opt/project_dir
ADD entrypoint.sh /entrypoint.sh
CMD ["/entrypoint.sh"]

核心指令说明:

  • FROM:指定基础镜像来源。
  • RUN:执行 Shell 命令。此处将上海时区文件复制到系统本地时间位置,并写入时区配置文件^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
  • ADD:将宿主机的文件添加到镜像中。这里主要添加了 JMX 监控配置和 Java Agent jar包^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
  • WORKDIR:设置工作目录,后续应用 JAR 包会被放置在此目录下^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。
  • CMD:指定容器启动时的默认执行命令^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。

配置与脚本细节

1. 监控配置

监控 Agent (jmx_prometheus_javaagent) 需要一个配置文件来定义采集规则^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。

config.yml^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]:

---
rules:
  - pattern: '.*'
这里的配置表示采集所有匹配的 JMX 指标。

2. 启动脚本

启动脚本负责构建 Java 启动命令。它利用环境变量来动态决定加载哪个 JAR 包以及暴露哪个端口^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。

entrypoint.sh^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]:

#!/bin/sh
M_OPTS="-Duser.timezone=Asia/Shanghai -javaagent:/opt/prom/jmx_javaagent-0.3.1.jar=$(hostname -i):${M_PORT:-"12346"}:/opt/prom/config.yml"
C_OPTS=${C_OPTS}
JAR_BALL=${JAR_BALL}
exec java -jar ${M_OPTS} ${C_OPTS} ${JAR_BALL}

脚本逻辑: * M_OPTS:定义 JVM 启动参数,包括时区设置和 JMX Agent 的启动参数。其中 IP 地址通过 hostname -i 获取,端口默认为 12346^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。 * JAR_BALL:引用传递给容器的环境变量,指定要运行的 JAR 文件名^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。 * exec:使用 exec 启动 Java 进程,确保 Java 进程作为 PID 1 运行,从而接收信号(如 SIGTERM)。

构建与交付流程

在准备好上述文件后,可以使用 Docker 命令进行构建和推送^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。

  1. 构建镜像
    docker build . -t harbor.od.com/base/jre8:8u112
    
  2. 推送至仓库
    docker push harbor.od.com/base/jre8:8u112
    
    构建完成后,镜像会被推送到 Harbor 仓库的 base 项目下^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。

此镜像随后会被用作业务镜像(如 dubbo-demo-service)的 FROM 基础,实现了底层环境的一致性交付^[400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md]。

Sources

  • 400-devops__06-Kubernetes__k8s-paas__05.K8S结合CI&CD持续交付和集中管理配置.md