Docker
コード例: deployment-ktor-plugin
このセクションでは、Ktor Gradle プラグイン を使って、Docker を用いてアプリケーションをパッケージ化、実行、デプロイする方法を説明します。
Ktorプラグインのインストール
Ktorプラグインをインストールするには、build.gradle.(kts)
ファイルのplugins
ブロックに追加します。
plugins {
id("io.ktor.plugin") version "3.2.3"
}
plugins {
id "io.ktor.plugin" version "3.2.3"
}
Kotlin Multiplatform Gradle プラグインと Ktor Gradle プラグインを一緒に適用すると、Docker の統合は自動的に無効になります。 それらを一緒に使用するには:
- 上記のように Ktor Gradle プラグインを適用した JVM 専用プロジェクトを作成します。
- その JVM 専用プロジェクトに Kotlin Multiplatform プロジェクトを依存関係として追加します。
この回避策で問題が解決しない場合は、KTOR-8464 にコメントを残してご連絡ください。
プラグインタスク
プラグインをインストールすると、アプリケーションのパッケージ化、実行、デプロイに以下のタスクが利用可能になります。
buildImage
: プロジェクトのDockerイメージをtarballとしてビルドします。このタスクはbuild
ディレクトリにjib-image.tar
ファイルを生成します。このイメージは、docker loadコマンドを使用してDockerデーモンにロードできます。Bashdocker load < build/jib-image.tar
publishImageToLocalRegistry
: プロジェクトの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
コンテナポートを8080
Dockerホストポートに公開します。 必要に応じて、portMappings
プロパティを使用してこれらのポートを変更できます。 これは、サーバーが別のポートを使用するように構成されている場合に役立つことがあります。
以下の例は、8080
コンテナポートを80
Dockerホストポートにマッピングする方法を示しています。
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=yourHubPassword
setx DOCKER_HUB_USERNAME yourHubUsername
setx DOCKER_HUB_PASSWORD yourHubPassword
手動イメージ構成
必要に応じて、独自のDockerfile
を提供してKtorアプリケーションを含むイメージを組み立てることができます。
アプリケーションのパッケージ化
最初のステップとして、アプリケーションをその依存関係と共にパッケージ化する必要があります。 例えば、これはfat JARまたは実行可能なJVMアプリケーションである場合があります。
Dockerイメージの準備
アプリケーションをDocker化するには、マルチステージビルドを使用します。
- まず、Gradle/Mavenの依存関係のキャッシュを設定します。このステップは任意ですが、ビルド全体の速度が向上するため推奨されます。
- 次に、
gradle
/maven
イメージを使用して、アプリケーションを含むfat JARを生成します。 - 最後に、生成されたディストリビューションは、JDKイメージに基づいて作成された環境で実行されます。
プロジェクトのルートフォルダーに、Dockerfile
という名前のファイルを作成し、以下の内容を記述します。
# Stage 1: Cache Maven dependencies
FROM maven:3.8-amazoncorretto-21 AS cache
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
# Stage 2: Build Application
FROM maven:3.8-amazoncorretto-21 AS build
WORKDIR /app
COPY --from=cache /root/.m2 /root/.m2
COPY . .
RUN mvn clean package
# Stage 3: Create the Runtime Image
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 JARとboot JARもサポートしていることに注意してください。
ビルドの3番目のステージは次のように機能します。
- 使用するイメージを示します。
- 公開するポートを指定します(これは、コンテナの実行時に行われるポートの自動公開ではありません)。
- ビルド出力からフォルダにコンテンツをコピーします。
- アプリケーションを実行します(
ENTRYPOINT
)。
TIP
この例ではAmazon Corretto Docker Imageを使用していますが、以下のようないくつかの適切な代替イメージと置き換えることができます。
Dockerイメージのビルドと実行
次のステップは、Dockerイメージをビルドしてタグ付けすることです。
docker build -t my-application .
最後に、イメージを起動します。
docker run -p 8080:8080 my-application
これにより、Ktorサーバーが起動し、https://0.0.0.0:8080
に応答します。