Docker与Kotlin:从零开始的应用程序容器化

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Docker与Kotlin:从零开始的应用程序容器化



容器化已成为现代开发的事实标准。它解决了"在我机器上能运行"的问题,并简化了CI/CD。在本文中,我们将探讨如何利用Docker高效地对Kotlin应用程序进行容器化——从创建简单的Dockerfile到生产环境优化和编排。



1. 基础:Kotlin应用程序的Dockerfile



容器化的核心是Dockerfile。对于编译为JVM字节码的Kotlin应用程序,我们使用多阶段构建(multi-stage build)。这可以将构建环境与运行环境分离,从而减小最终镜像的大小。



考虑一个使用Gradle的典型Kotlin应用程序(build.gradle.kts文件已简化):



// build.gradle.ktsplugins {    kotlin("jvm") version "1.9.0"    application    id("com.google.cloud.tools.jib") version "3.4.0" // 可选}

application { mainClass.set("com.example.MainKt")}


创建一个包含两个阶段的Dockerfile:



# 阶段1:构建FROM gradle:8.5-jdk21 AS builderWORKDIR /appCOPY build.gradle.kts settings.gradle.kts ./COPY gradle ./gradleCOPY src ./srcRUN gradle build --no-daemon

# 阶段2:运行FROM eclipse-temurin:21-jre-alpineWORKDIR /appCOPY --from=builder /app/build/libs/my-app-*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]


构建和运行命令:

docker build -t my-kotlin-app .docker run -p 8080:8080 my-kotlin-app


建议:

  • 使用eclipse-temurin(OpenJDK)代替完整的JDK——镜像更小。
  • 缓存依赖:先复制build.gradle.kts,再复制src。
  • 对于Spring Boot应用程序,可以使用layers进行增量构建。


2. 使用Jib和Gradle进行优化



手动编写Dockerfile是经典做法,但有些工具可以自动化这一过程。Jib(来自Google)与Maven/Gradle集成,无需Docker守护进程即可构建优化的Docker镜像。



在build.gradle.kts中添加Jib插件:



plugins {    id("com.google.cloud.tools.jib") version "3.4.0"}

jib { from { image = "eclipse-temurin:21-jre-alpine" } to { image = "my-registry/my-kotlin-app:latest" } container { ports = listOf("8080") jvmFlags = listOf("-Xms512m", "-Xmx1024m") }}


一条命令构建:

./gradlew jibDockerBuild


Jib的优势:

  • 自动分层(依赖、资源、类)。
  • 无需Dockerfile。
  • 无需Docker守护进程即可运行——非常适合CI/CD。


Kotlin应用程序示例(简单的HTTP服务器):



// src/main/kotlin/com/example/Main.ktpackage com.example

import com.sun.net.httpserver.HttpServerimport java.net.InetSocketAddress

fun main() { val server = HttpServer.create(InetSocketAddress(8080), 0) server.createContext("/") { exchange -> val response = "Hello from Kotlin in Docker!" exchange.sendResponseHeaders(200, response.length.toLong()) exchange.responseBody.write(response.toByteArray()) exchange.close() } server.start() println("Server started on port 8080")}


3. Docker Compose:多容器应用程序



实际项目很少只包含一个服务。Docker Compose允许你描述并启动多个容器(例如,应用程序 + 数据库 + Redis)。



为Kotlin应用程序和PostgreSQL创建docker-compose.yml:

博客

书籍推荐