Docker
コード例: deployment-ktor-plugin
このセクションでは、Ktor Gradleプラグインを使用して、Dockerを利用したアプリケーションのパッケージ化、実行、デプロイを行う方法について説明します。
Ktorプラグインのインストール
Ktorプラグインをインストールするには、build.gradle.(kts)ファイルのpluginsブロックに追加します。
plugins {
id("io.ktor.plugin") version "3.3.3"
}plugins {
id "io.ktor.plugin" version "3.3.3"
}Ktor GradleプラグインをKotlin Multiplatform Gradleプラグインと一緒に適用すると、Docker統合は自動的に無効になります。 これらを併用できるようにするには、以下の手順を行ってください:
- 上記のようにKtor Gradleプラグインを適用したJVM専用プロジェクトを作成します。
- そのJVM専用プロジェクトに、Kotlin Multiplatformプロジェクトを依存関係として追加します。
この回避策で問題が解決しない場合は、KTOR-8464にコメントを残してお知らせください。
プラグインタスク
プラグインをインストールすると、アプリケーションのパッケージ化、実行、デプロイのために以下のタスクが利用可能になります。
buildImage: プロジェクトのDockerイメージをtarボールとしてビルドします。このタスクは、buildディレクトリにjib-image.tarファイルを生成します。このイメージは、docker loadコマンドを使用してDockerデーモンにロードできます。Bashdocker load < build/jib-image.tarpublishImageToLocalRegistry: プロジェクトのDockerイメージをビルドし、ローカルレジストリに公開します。runDocker: プロジェクトのイメージをビルドしてDockerデーモンに送り、実行します。このタスクを実行するとKtorサーバーが起動し、デフォルトではhttp://0.0.0.0:8080で応答します。サーバーが別のポートを使用するように構成されている場合は、ポートマッピングを調整できます。publishImage: プロジェクトのDockerイメージをビルドし、Docker HubやGoogle Container Registryなどの外部レジストリに公開します。 このタスクでは、ktor.docker.externalRegistryプロパティを使用して外部レジストリを構成する必要があることに注意してください。
デフォルトでは、これらのタスクはktor-docker-imageという名前とlatestタグでイメージをビルドします。 これらの値は、プラグイン構成でカスタマイズできます。
Ktorプラグインの構成
Dockerタスクに関連するKtorプラグインの設定を構成するには、build.gradle.(kts)ファイルでktor.docker拡張を使用します。
ktor {
docker {
// ...
}
}JREバージョン
jreVersionプロパティは、イメージで使用するJREバージョンを指定します。
ktor {
docker {
jreVersion.set(JavaVersion.VERSION_17)
}
}イメージ名とタグ
イメージ名とタグをカスタマイズする必要がある場合は、それぞれlocalImageNameプロパティとimageTagプロパティを使用します。
ktor {
docker {
localImageName.set("sample-docker-image")
imageTag.set("0.0.1-preview")
}
}ポートマッピング
デフォルトでは、runDockerタスクはコンテナの8080ポートをDockerホストの8080ポートに公開します。 必要に応じて、portMappingsプロパティを使用してこれらのポートを変更できます。 これは、サーバーが別のポートを使用するように構成されている場合に役立ちます。
以下の例は、コンテナの8080ポートをDockerホストの80ポートにマッピングする方法を示しています。
ktor {
docker {
portMappings.set(listOf(
io.ktor.plugin.features.DockerPortMapping(
80,
8080,
io.ktor.plugin.features.DockerPortMappingProtocol.TCP
)
))
}
}この場合、http://0.0.0.0:80でサーバーにアクセスできます。
外部レジストリ
publishImageタスクを使用してプロジェクトのDockerイメージを外部レジストリに公開する前に、ktor.docker.externalRegistryプロパティを使用して外部レジストリを構成する必要があります。このプロパティは、必要なレジストリタイプの構成を提供するDockerImageRegistryインスタンスを受け取ります。
DockerImageRegistry.dockerHub: Docker Hub用のDockerImageRegistryを作成します。DockerImageRegistry.googleContainerRegistry: Google Container Registry用のDockerImageRegistryを作成します。
以下の例は、Docker Hubレジストリを構成する方法を示しています。
ktor {
docker {
externalRegistry.set(
io.ktor.plugin.features.DockerImageRegistry.dockerHub(
appName = provider { "ktor-app" },
username = providers.environmentVariable("DOCKER_HUB_USERNAME"),
password = providers.environmentVariable("DOCKER_HUB_PASSWORD")
)
)
}
}Docker Hubのユーザー名とパスワードは環境変数から取得されるため、publishImageタスクを実行する前にこれらの値を設定する必要があることに注意してください。
export DOCKER_HUB_USERNAME=yourHubUsername
export DOCKER_HUB_PASSWORD=yourHubPasswordsetx DOCKER_HUB_USERNAME yourHubUsername
setx DOCKER_HUB_PASSWORD yourHubPassword手動でのイメージ構成
必要に応じて、独自のDockerfileを用意してKtorアプリケーションを含むイメージを組み立てることもできます。
アプリケーションのパッケージ化
最初のステップとして、アプリケーションを依存関係とともにパッケージ化する必要があります。 例えば、これはFat JARや実行可能なJVMアプリケーションなどです。
Dockerイメージの準備
アプリケーションをDocker化するために、マルチステージビルドを使用します。
- まず、Gradle/Mavenの依存関係のキャッシュを設定します。このステップは任意ですが、ビルド全体の速度が向上するため推奨されます。
- 次に、
gradle/mavenイメージを使用して、アプリケーションを含むFat JARを生成します。 - 最後に、生成された配布物を、JDKイメージに基づいて作成された環境で実行します。
プロジェクトのルートフォルダーに、以下の内容でDockerfileという名前のファイルを作成します。
# ステージ 1: Mavenの依存関係をキャッシュする
FROM maven:3.8-amazoncorretto-21 AS cache
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
# ステージ 2: アプリケーションのビルド
FROM maven:3.8-amazoncorretto-21 AS build
WORKDIR /app
COPY --from=cache /root/.m2 /root/.m2
COPY . .
RUN mvn clean package
# ステージ 3: 実行用イメージの作成
FROM amazoncorretto:21-slim AS runtime
EXPOSE 8080
WORKDIR /app
COPY --from=build /app/target/*-with-dependencies.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]最初のステージでは、ビルド関連ファイルに変更があった場合にのみ依存関係が再ダウンロードされるようにします。最初のステージを使用しない場合、または他のステージで依存関係がキャッシュされない場合、ビルドのたびに依存関係がインストールされます。
第2ステージでは、Fat JARがビルドされます。なお、Gradleはデフォルトでshadowおよびboot JARもサポートしています。
ビルドの第3ステージは、以下のように動作します。
- 使用するイメージを指定します。
- 公開するポートを指定します(これは自動的にポートを公開するものではなく、コンテナの実行時に行われます)。
- ビルド出力の内容をフォルダーにコピーします。
- アプリケーションを実行します(
ENTRYPOINT)。
TIP
この例ではAmazon CorrettoのDockerイメージを使用していますが、以下のような他の適切な代替イメージに置き換えることもできます。
Dockerイメージのビルドと実行
次のステップは、Dockerイメージをビルドしてタグを付けることです。
docker build -t my-application .最後に、イメージを起動します。
docker run -p 8080:8080 my-applicationこれによりKtorサーバーが起動し、https://0.0.0.0:8080で応答します。
