运行时与 JVM 优化

为可执行 Fat-JAR 构建 Docker 容器镜像

你将创建什么

你将为一个打包为可执行 Uber-JAR(Fat-JAR) 的 Vert.x 应用程序构建容器镜像。

本实战指南主要包含以下核心 Dockerfile:

  1. docker-maven/Dockerfile:针对 Maven 用户;

  2. docker-gradle/Dockerfile:针对 Gradle 用户。

前置要求

  • 文本编辑器或 IDE

  • Docker 环境

使用 Maven

生成工程项目

首先,在 https://start.vertx.io 上生成工程:

  1. 构建工具选择 Maven;

  2. 将 artifactId 设置为 container-uber-jar;

  3. JDK 版本选择 JDK 11;

  4. 点击生成并将压缩包解压至本地目录。

或者,打开终端直接执行命令行下载:

curl -G https://start.vertx.io/starter.zip -d "artifactId=container-uber-jar" -d "jdkVersion=11" -d "buildTool=maven" --output container-uber-jar.zip
unzip container-uber-jar.zip

Dockerfile 解析

打开并检查 docker-maven/Dockerfile:

# 1st Docker build stage: build the project with Maven
FROM maven:3.9.9-eclipse-temurin-11 AS builder
WORKDIR /project
COPY . /project/
RUN mvn package -DskipTests -B

# 2nd Docker build stage: copy builder output and configure entry point
FROM eclipse-temurin:11
ENV APP_DIR=/application
ENV APP_FILE=container-uber-jar.jar

EXPOSE 8888

WORKDIR $APP_DIR
COPY --from=builder /project/target/*-fat.jar $APP_DIR/$APP_FILE

ENTRYPOINT ["sh", "-c"]
CMD ["exec java -jar $APP_FILE"]
1 使用 Eclipse Temurin 11 JRE 作为精简基础镜像
2 将构建生成的 Fat-JAR 复制进镜像的 /deployments/ 目录
3 暴露服务监听端口 8888
4 设置容器启动入口命令

构建容器镜像

首先通过 Maven 打包生成 Fat-JAR:

./mvnw clean package

接着构建 Docker 镜像:

docker build -t vertx-docker-maven -f docker-maven/Dockerfile .

运行容器

启动容器并映射端口:

docker run -d -p 8888:8888 --name my-vertx-app vertx-docker-maven

访问验证:

curl http://localhost:8888/

控制台将返回:Hello from Vert.x!。

使用 Gradle

生成工程项目

类似地,在终端通过命令行快速创建 Gradle 项目:

curl -G https://start.vertx.io/starter.zip -d "artifactId=container-uber-jar" -d "jdkVersion=11" -d "buildTool=gradle" --output container-uber-jar.zip
unzip container-uber-jar.zip

Dockerfile 解析

打开并检查 docker-gradle/Dockerfile:

# 1st Docker build stage: build the project with Gradle
FROM gradle:8.11.1-jdk11 AS builder
WORKDIR /project
COPY . /project/
RUN gradle assemble --no-daemon

# 2nd Docker build stage: copy builder output and configure entry point
FROM eclipse-temurin:11
ENV APP_DIR=/application
ENV APP_FILE=container-uber-jar.jar

EXPOSE 8888

WORKDIR $APP_DIR
COPY --from=builder /project/build/libs/*-fat.jar $APP_DIR/$APP_FILE

ENTRYPOINT ["sh", "-c"]
CMD ["exec java -jar $APP_FILE"]

构建与运行

./gradlew clean assemble
docker build -t vertx-docker-gradle -f docker-gradle/Dockerfile .
docker run -d -p 8888:8888 --name my-vertx-app-gradle vertx-docker-gradle
curl http://localhost:8888/

总结

本文档展示了:

  1. 如何将 Vert.x 独立应用构建为 Uber-JAR;

  2. 针对 Maven 与 Gradle 分别编写轻量高效的 Dockerfile;

  3. 构建、启动与测试 Docker 容器中的 Vert.x 实例。