2025-03-02
Java开发
0

目录

构建说明
跨平台构建
制作应用镜像
普通SpringBoot应用
复合型构建

构建说明

Java应用的基础运行环境很少变动且制作耗时较久,而应用本身代码开发会频繁改动,因此把制作其 Docker 镜像的步骤拆分为两次:

首先制作基础镜像(wucc-base)。

然后使用 wucc-base 作为基础镜像进行构建,加快应用的 docker 镜像构建与发布。

跨平台构建

docker buildx 支持在一台机器上构建出多种平台架构的镜像。推荐使用该能力进行跨平台的镜像构建。 例如,执行 docker buildx build 命令时加上 --platform=linux/arm64 参数即可构建出 arm64 架构镜像。这极大方便了那些没有arm64 架构机器却想构建 arm64 架构镜像的用户。

当前本项目仅支持构建 linux/amd64 和 linux/arm64 两种平台架构的镜像 buildx 的 builder driver 可以使用默认的 docker 类型, 若使用 docker-container 类型可以支持并行构建多种架构, 本文不再赘述, 有兴趣可以自行了解。参考 Docker Buildx | Docker Documentation

前提要求

以当前机器为 amd64 (x86_64)架构为例。需要开启 docker 的 buildx 特性,以及开启 Linux 的 QEMU 用户模式:

使用 WSL2 的 Windows 用户如果安装了最新的 DockerDesktop, 则这些前提要求已满足, 无需额外下述设置。

  1. 安装 docker buildx 客户端插件:

    docker 版本要求 >=19.03

    若已安装, 则跳过。详情参考 https://github.com/docker/buildx

  2. 开启 QEMU 的用户模式功能, 并安装其它平台的模拟器:

    Linux 内核要求 >=4.8

    使用 tonistiigi/binfmt 镜像可快速开启并安装模拟器,执行下面命令:

    shell
    docker run --privileged --rm tonistiigi/binfmt --install all

制作基础镜像

构建基础环境的 Dockerfile

Dockerfile
FROM ubuntu:24.04 RUN sed -i 's@//.*archive.ubuntu.com@//mirrors.aliyun.com@g' /etc/apt/sources.list.d/ubuntu.sources &&\ sed -i 's@//security.ubuntu.com@//mirrors.aliyun.com@g' /etc/apt/sources.list.d/ubuntu.sources &&\ sed -i 's@//ports.ubuntu.com@//mirrors.aliyun.com@g' /etc/apt/sources.list.d/ubuntu.sources &&\ apt-get update &&\ export DEBIAN_FRONTEND=noninteractive &&\ apt-get install -y --no-install-recommends openjdk-8-jre tzdata locales xfonts-utils fontconfig &&\ echo 'Asia/Shanghai' > /etc/timezone &&\ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\ localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8 &&\ locale-gen zh_CN.UTF-8 &&\ apt-get install -y --no-install-recommends ttf-mscorefonts-installer &&\ apt-get install -y --no-install-recommends ttf-wqy-microhei ttf-wqy-zenhei xfonts-wqy &&\ apt-get autoremove -y &&\ apt-get clean &&\ rm -rf /var/lib/apt/lists/* # 内置一些常用的中文字体,避免普遍性乱码 ADD fonts/* /usr/share/fonts/chinese/ RUN cd /usr/share/fonts/chinese &&\ # 安装字体 mkfontscale &&\ mkfontdir &&\ fc-cache -fv ENV LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8

代码总结

这段Dockerfile代码用于构建一个基于Ubuntu 24.04的Docker镜像,该镜像配置了中文环境并安装了必要的软件和字体,以支持文件在线预览功能。下面是对每一段代码的详细解析:

概括性总结

  1. 基础镜像选择:使用Ubuntu 24.04作为基础镜像。
  2. 更新软件源:将默认的Ubuntu软件源替换为阿里云的镜像源,以提高下载速度和稳定性。
  3. 安装必要的软件包:包括Java运行环境、时区设置、本地化支持、无GUI的LibreOffice(用于文档处理)以及中文字体。
  4. 设置中文环境:配置系统时区为亚洲/上海,并生成中文语言环境。
  5. 添加和配置中文字体:将自定义的中文字体添加到系统中,并更新字体缓存。
  6. 环境变量设置:设置系统的语言和区域环境变量为中文。

详细总结

shell
FROM ubuntu:24.04

指定使用Ubuntu 24.04版本作为基础镜像。

shell
RUN sed -i 's@//.*archive.ubuntu.com@//mirrors.aliyun.com@g' /etc/apt/sources.list.d/ubuntu.sources &&\ sed -i 's@//security.ubuntu.com@//mirrors.aliyun.com@g' /etc/apt/sources.list.d/ubuntu.sources &&\ sed -i 's@//ports.ubuntu.com@//mirrors.aliyun.com@g' /etc/apt/sources.list.d/ubuntu.sources &&\ apt-get update &&\ export DEBIAN_FRONTEND=noninteractive &&\ apt-get install -y --no-install-recommends openjdk-8-jre tzdata locales xfonts-utils fontconfig libreoffice-nogui &&\ echo 'Asia/Shanghai' > /etc/timezone &&\ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\ localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8 &&\ locale-gen zh_CN.UTF-8 &&\ apt-get install -y --no-install-recommends ttf-mscorefonts-installer &&\ apt-get install -y --no-install-recommends ttf-wqy-microhei ttf-wqy-zenhei xfonts-wqy &&\ apt-get autoremove -y &&\ apt-get clean &&\ rm -rf /var/lib/apt/lists/*
  • sed命令: 修改/etc/apt/sources.list.d/ubuntu.sources文件,将默认的Ubuntu软件源地址替换为阿里云的镜像源地址,以提高软件包下载速度。

  • apt-get update: 更新软件包列表。

  • export DEBIAN_FRONTEND=noninteractive: 设置非交互模式,避免在安装软件时出现交互提示。

  • apt-get install: 安装必要的软件包,包括:

  • openjdk-8-jre:Java运行环境。
  • tzdata:时区数据包。
  • locales:本地化支持。
  • xfonts-utils、fontconfig:字体配置工具。
  • libreoffice-nogui:无GUI的LibreOffice,用于处理文档。
  • 时区设置: 将系统时区设置为亚洲/上海,并创建符号链接以同步系统时间。
  • localedef和locale-gen: 生成中文(中国)的UTF-8语言环境。
  • 安装字体: 安装微软核心字体以及文泉驿的中文字体,以支持中文显示。
  • apt-get autoremove和apt-get clean: 清除不再需要的软件包和缓存,减小镜像大小。
shell
ADD fonts/* /usr/share/fonts/chinese/

作用: 将本地的fonts目录中的所有字体文件添加到镜像中的/usr/share/fonts/chinese/目录下。

shell
RUN cd /usr/share/fonts/chinese &&\ # 安装字体 mkfontscale &&\ mkfontdir &&\ fc-cache -fv
  • mkfontscale和mkfontdir: 生成字体目录的索引文件,以便系统能够识别和使用这些字体。
  • fc-cache -fv: 刷新字体缓存,确保新添加的字体可以立即使用。
shell
ENV LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8

这行内容设置了环境变量。将语言环境变量设置为中文简体(zh_CN),字符编码为 UTF-8。

这样的设置通常用于确保程序在特定的语言和字符编码环境下运行。

执行如下命令即可构建基础镜像:

这里镜像 tag 以 1.0.0 为例,本项目所维护的 Dockerfile 文件考虑了跨平台兼容性。 如果你需要用到 arm64 架构镜像, 则在arm64 架构机器上同样执行下面的构建命令即可

shell
docker build --tag wucc/wucc-base:1.0.0 .

现在就可以愉快地开始构建了,构建命令示例:

shell
docker buildx build --platform=linux/amd64,linux/arm64 -t wucc/wucc-base:1.0.0 .

导出镜像为离线文件

shell
docker save -o wucc-base-1.0.0.tar wucc/wucc-base:1.0.0

私有化部署,将 .tar 文件传输到目标服务器后加载:

shell
docker load -i wucc-base-1.0.0.tar

制作应用镜像

在应用程序开发过程中,根据其运行环境的不同,可能会构建出仅包含应用程序自身的实例,或是集成了数据库与Redis缓存机制的复合型架构。接下来,将总结在不同架构下的Docker构建。

普通SpringBoot应用

代码总结

Dockerfile 文件代码

Dockerfile
# 应用镜像Dockerfile FROM wucc/wucc-base:1.0.0 # 设置工作目录 WORKDIR /app # 复制Spring Boot应用包(注意:需要提前构建好fat jar) COPY target/your-springboot-app.jar ./app.jar # 暴露端口(根据实际应用端口修改) EXPOSE 8080 # 设置JVM参数(根据需求调整) ENV JAVA_OPTS="-Xmx512m -Xms256m -Dfile.encoding=UTF-8" # 启动命令(使用exec形式避免信号问题) CMD exec java $JAVA_OPTS -jar app.jar

构建应用镜像

shell
docker build -t your-app:1.0.0 .

运行容器

shell
docker run -d -p 8080:8080 --name your-app your-app:1.0.0

导出镜像为离线文件

shell
docker save -o your-app.tar wucc/your-app:1.0.0

私有化部署,将 .tar 文件传输到目标服务器后加载:

shell
docker load -i your-app.tar

复合型构建

本文作者:wucc

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-SA 许可协议。转载请注明出处!