1. 概述

本文将带你一步步了解如何在Docker容器中构建和运行Micronaut应用。我们将从项目创建到容器化部署全流程展开,包含所有关键配置和实操技巧。

Micronaut是一个现代的JVM框架,专为构建模块化、易测试的微服务和无服务器应用设计,内存占用极低。而Docker通过将应用及其依赖打包成标准化容器,彻底简化了跨环境部署的复杂性。

当Micronaut遇上Docker,这对组合能让你高效构建可扩展、高可用的现代化应用。

2. 前置要求

要顺利完成本教程,请确保以下工具就绪:

  • Java开发工具包(JDK): 推荐JDK 21以获得最佳性能和新特性支持。虽然Micronaut也支持JDK 17,但需调整版本参数。本文默认使用JDK 21(Micronaut官方推荐版本)
  • Micronaut: CLI工具非必需,也可通过网页创建项目。本文将同时演示两种方式
  • Gradle或Maven: 利用Micronaut内置的构建脚本自动化Docker镜像创建,无需额外安装
  • Docker: Docker需提前安装配置,确保容器化环境可用

本文重点在于容器化实践而非基础环境搭建,请确保上述工具已准备就绪

3. 搭建Micronaut应用

首先创建一个全新的Micronaut项目,可通过CLI工具、Micronaut Launch网站或兼容IDE(如IntelliJ IDEA)完成。

3.1. 使用CLI工具

通过Micronaut官方文档安装CLI(推荐使用SDKMAN!)。安装后执行:

mn create-app com.baeldung.micronautdocker

这将在com.baeldung.micronautdocker包下生成基础项目骨架。默认配置使用Java 21和Gradle构建工具

若需切换为Java 17或Maven,添加相应参数:

mn create-app com.baeldung.micronautdocker --jdk 17 --build maven

更多配置选项参考Micronaut CLI指南

3.2. 使用Micronaut Launch

**跳过本地安装?直接访问Micronaut Launch网站**。与CLI不同,网页版可直接下载完整项目文件夹,开箱即用。

3.3. 环境验证

项目创建后,启动应用验证环境:

Gradle启动命令:

./gradlew run

Maven启动命令:

./mvnw mn:run

通过浏览器访问http://localhost:8080或使用curl验证服务状态。

此步骤确保基础环境配置正确,验证通过后即可开始容器化改造。

4. 应用容器化改造

应用正常运行后,开始准备Docker容器化。要自动生成Docker镜像,需对构建工具进行配置。虽然Gradle和Maven都内置Docker支持,但自定义配置仍需手动调整。

本节将演示如何修改基础镜像、暴露端口、添加自定义指令及重命名镜像

4.1. Gradle容器化方案

通过Gradle任务修改Dockerfile配置:

tasks.named<MicronautDockerfile>("dockerfile") {
    baseImage.set("eclipse-temurin:21-jre-alpine")
    exposedPorts.set(arrayListOf(9090))
    instruction("RUN echo 'Hello world!'")
}

关键配置说明:

  • baseImage.set():修改基础镜像
  • exposedPorts.set():设置暴露端口
  • instruction():添加自定义指令(如示例中的echo)

修改镜像名称需捕获dockerBuild任务:

tasks.named<DockerBuildImage>("dockerBuild") {
    images.set(listOf("micronaut_docker_gradle"))
}

更多配置参考官方文档

4.2. Maven容器化方案

由于Micronaut Maven插件原生不支持Docker构建,我们使用Google的Jib插件,无需Dockerfile即可直接构建优化镜像。

首先在pom.xml的properties部分添加变量:

<properties>
    ...
    <docker.baseImage>eclipse-temurin:21-jre-alpine</docker.baseImage>
    <docker.exposedPort>9090</docker.exposedPort>
    <docker.imageName>micronaut_docker_maven</docker.imageName>
</properties>

然后在build/plugins中配置Jib插件:

<build>
    <plugins>
     ...
        <plugin>
            <groupId>com.google.cloud.tools</groupId>
            <artifactId>jib-maven-plugin</artifactId>
            <version>3.3.1</version>
            <configuration>
                <from>
                    <image>${docker.baseImage}</image>
                </from>
                <container>
                    <ports>
                        <port>${docker.exposedPort}</port>
                    </ports>
                    <entrypoint>
                        <shell>sh</shell>
                        <option>-c</option>
                        <arg>
                            java -cp /app/resources:/app/classes:/app/libs/* ${exec.mainClass}
                        </arg>
                    </entrypoint>
                </container>
                <to>
                    <image>${docker.imageName}</image>
                </to>
            </configuration>
        </plugin>
    </plugins>
</build>

⚠️ 注意:Jib不支持直接在Dockerfile中添加自定义指令。更多配置参考官方文档

5. 构建Docker镜像

应用打包完成后,开始构建、检查和运行Docker镜像。

Gradle构建命令:

./gradlew dockerBuild

Maven构建命令:

./mvnw jib:dockerBuild

构建完成后,通过以下命令验证镜像:

docker images

输出中应出现名为micronaut_docker_gradlemicronaut_docker_maven的镜像。这表明镜像已准备就绪

6. 运行容器

镜像构建成功后,启动容器:

Gradle启动命令:

docker run -p 9090:9090 micronaut_docker_gradle:latest

Maven启动命令:

docker run -p 9090:9090 micronaut_docker_maven:latest

此命令将容器9090端口映射到主机9090端口,通过http://localhost:9090即可访问应用

容器启动成功后,查看运行状态:

docker ps

输出中应包含名为micronaut_docker_gradlemicronaut_docker_maven的容器条目,显示其ID、状态和端口映射。

调试时查看容器日志:

docker logs <container_id>

至此,Micronaut应用已在Docker环境中成功部署运行。

7. 总结

本文完整演示了在Docker容器中构建和运行Micronaut应用的全流程。我们通过CLI和Micronaut Launch创建项目,配置Gradle和Maven自动化Docker镜像构建,并自定义了基础镜像、暴露端口和命名规则。最终成功构建并运行了容器化应用。

Micronaut的灵活性 + Docker的便携性 = 现代化微服务开发的黄金组合。这种集成不仅简化了工作流,更确保了跨环境一致性,是构建轻量级可扩展应用的理想方案。