Skip to content

Docker

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

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

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

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

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

Kotlin Multiplatform Gradle プラグインと Ktor Gradle プラグインを一緒に適用すると、Docker の統合は自動的に無効になります。 それらを一緒に使用するには:

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

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

プラグインタスク

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

  • buildImage: プロジェクトのDockerイメージをtarballとしてビルドします。このタスクは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コンテナポートを8080Dockerホストポートに公開します。 必要に応じて、portMappingsプロパティを使用してこれらのポートを変更できます。 これは、サーバーが別のポートを使用するように構成されている場合に役立つことがあります。

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

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

bash
docker build -t my-application .

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

bash
docker run -p 8080:8080 my-application

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