Skip to content

Docker

このセクションでは、Ktor Gradleプラグインを使用して、Dockerを利用したアプリケーションのパッケージ化、実行、デプロイを行う方法について説明します。

Ktorプラグインのインストール

Ktorプラグインをインストールするには、build.gradle.(kts)ファイルのpluginsブロックに追加します。

kotlin
plugins {
    id("io.ktor.plugin") version "3.3.3"
}

groovy
plugins {
    id "io.ktor.plugin" version "3.3.3"
}

Ktor GradleプラグインをKotlin Multiplatform Gradleプラグインと一緒に適用すると、Docker統合は自動的に無効になります。 これらを併用できるようにするには、以下の手順を行ってください:

  1. 上記のようにKtor Gradleプラグインを適用したJVM専用プロジェクトを作成します。
  2. そのJVM専用プロジェクトに、Kotlin Multiplatformプロジェクトを依存関係として追加します。

この回避策で問題が解決しない場合は、KTOR-8464にコメントを残してお知らせください。

プラグインタスク

プラグインをインストールすると、アプリケーションのパッケージ化、実行、デプロイのために以下のタスクが利用可能になります。

  • buildImage: プロジェクトのDockerイメージをtarボールとしてビルドします。このタスクは、buildディレクトリにjib-image.tarファイルを生成します。このイメージは、docker loadコマンドを使用してDockerデーモンにロードできます。
    Bash
    docker load < build/jib-image.tar
  • publishImageToLocalRegistry: プロジェクトのDockerイメージをビルドし、ローカルレジストリに公開します。
  • runDocker: プロジェクトのイメージをビルドしてDockerデーモンに送り、実行します。このタスクを実行するとKtorサーバーが起動し、デフォルトではhttp://0.0.0.0:8080で応答します。サーバーが別のポートを使用するように構成されている場合は、ポートマッピングを調整できます。
  • publishImage: プロジェクトのDockerイメージをビルドし、Docker HubGoogle Container Registryなどの外部レジストリに公開します。 このタスクでは、ktor.docker.externalRegistryプロパティを使用して外部レジストリを構成する必要があることに注意してください。

デフォルトでは、これらのタスクはktor-docker-imageという名前とlatestタグでイメージをビルドします。 これらの値は、プラグイン構成でカスタマイズできます。

Ktorプラグインの構成

Dockerタスクに関連するKtorプラグインの設定を構成するには、build.gradle.(kts)ファイルでktor.docker拡張を使用します。

kotlin
ktor {
    docker {
        // ...
    }
}

JREバージョン

jreVersionプロパティは、イメージで使用するJREバージョンを指定します。

kotlin
ktor {
    docker {
        jreVersion.set(JavaVersion.VERSION_17)
    }
}

イメージ名とタグ

イメージ名とタグをカスタマイズする必要がある場合は、それぞれlocalImageNameプロパティとimageTagプロパティを使用します。

kotlin
ktor {
    docker {
        localImageName.set("sample-docker-image")
        imageTag.set("0.0.1-preview")
    }
}

ポートマッピング

デフォルトでは、runDockerタスクはコンテナの8080ポートをDockerホストの8080ポートに公開します。 必要に応じて、portMappingsプロパティを使用してこれらのポートを変更できます。 これは、サーバーが別のポートを使用するように構成されている場合に役立ちます。

以下の例は、コンテナの8080ポートをDockerホストの80ポートにマッピングする方法を示しています。

kotlin
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レジストリを構成する方法を示しています。

kotlin
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タスクを実行する前にこれらの値を設定する必要があることに注意してください。

Bash
export DOCKER_HUB_USERNAME=yourHubUsername
export DOCKER_HUB_PASSWORD=yourHubPassword
Bash
setx DOCKER_HUB_USERNAME yourHubUsername
setx DOCKER_HUB_PASSWORD yourHubPassword

手動でのイメージ構成

必要に応じて、独自のDockerfileを用意してKtorアプリケーションを含むイメージを組み立てることもできます。

アプリケーションのパッケージ化

最初のステップとして、アプリケーションを依存関係とともにパッケージ化する必要があります。 例えば、これはFat JAR実行可能なJVMアプリケーションなどです。

Dockerイメージの準備

アプリケーションをDocker化するために、マルチステージビルドを使用します。

  1. まず、Gradle/Mavenの依存関係のキャッシュを設定します。このステップは任意ですが、ビルド全体の速度が向上するため推奨されます。
  2. 次に、gradle/mavenイメージを使用して、アプリケーションを含むFat JARを生成します。
  3. 最後に、生成された配布物を、JDKイメージに基づいて作成された環境で実行します。

プロジェクトのルートフォルダーに、以下の内容でDockerfileという名前のファイルを作成します。

Docker
Docker
# ステージ 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イメージをビルドしてタグを付けることです。

bash
docker build -t my-application .

最後に、イメージを起動します。

bash
docker run -p 8080:8080 my-application

これによりKtorサーバーが起動し、https://0.0.0.0:8080で応答します。