😺

IntelliJ IDEAとDockerで作るktor開発環境 (Windows)

2023/08/29に公開

概要

Windows上で、IntelliJ IDEAと、WSL上に構築したUbuntuのDockerを使って、ktor開発環境を構築します。

準備

おしながき

  • WSLへのUbuntuインストール
  • UbuntuへのDocker環境構築
  • WindowsへのDocker環境構築
  • IntelliJ IDEA環境構築
  • ktorプロジェクト作成 (Docker Compose使用)

環境一覧

今回環境構築する主なソフトウェアの執筆時のバージョンの一覧です。

名前 リビジョン 確認方法
Windows 11 22H2 設定アプリ → システム → バージョン情報
WSL 1.3.15.0 > wsl --version
Ubuntu 22.04.3 LTS $ lsb_release -a
IntelliJ IDEA 2023.2.1 JetBrains Toolbox
Docker Server (Linux) 24.0.5 $ docker --version
Chocolatey (Windows) 2.2.2 > choco --version
Docker Client (Windows) 24.0.5 > \ProgramData\chocolatey\bin\docker --version
Git Client (Windows) 2.42.0 > git --version

WSLへのUbuntuインストール

まず、Windows上にWSLをセットアップし、Ubuntuをインストールします。

WSLのセットアップ

DockerをLinux上で稼働させるため、WSL(Windows Subsystem for Linux)をインストールします。
"Windowsのその他の機能"設定アプリを起動し、Hyper-VとLinux用Windowsサブシステムが有効になっていなければ、有効にします。

WSLのアップデート

WSLを最新版に更新するために、コマンドプロンプトまたはPowerShellを管理者モードで起動します。
そして、wslの更新コマンドを実行します。

PowerShell(管理者モード)
> wsl --update
更新プログラムを確認しています。
Linux 用 Windows サブシステムを更新しています。

Windows Terminal

Windows Terminalがインストールされていない場合は、PowerShellやUbuntuのターミナル起動を簡単に行うためにWindows Terminalをインストールします。
Microsoft Storeアプリから、Windows Terminalをインストール、または、最新版への更新を行います。

Microsoft Storeアプリ --> アプリ --> Windows Terminalを検索 --> インストールまたは更新

Ubuntuインストール

Ubuntuをインストールするために、コマンドプロンプトまたはPowerShellを管理者モードで起動します。
そして、wslのインストールコマンドを実行します。

PowerShell(管理者モード)
> wsl --install Ubuntu-22.04

インストール途中、管理者となるUNIXユーザアカウントとパスワードを尋ねられますので入力します。

Ubuntu
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: <<<管理者UNIXユーザアカウント>>>
New password: *** (上記UNIXユーザアカウント用のパスワード)
Retype new password: *** (確認のためもう一度入力)

wsl.conf

インストールが完了した後、WSL上でUbuntuを起動するための設定ファイル(wsl.conf)を作成するために、Ubuntu内でエディタを起動します。

Ubuntu
$ sudo nano /etc/wsl.conf
[sudo] password for <<<管理者UNIXユーザアカウント>>>

sudoは、管理者権限でコマンドを実行するためのコマンドです。sudoを実行するとき、パスワード入力を求められる場合があります。
nanoは、Ubuntuに標準でインストールされているエディタです。

wsl.confの内容を、以下の通り入力します(<<<管理者UNIXユーザアカウント>>>は、先ほど実際に登録したUNIXユーザアカウントを入力します)。

/etc/wsl.conf
[boot]
systemd = true

[interop]
appendWindowsPath = false

[user]
default = <<<管理者UNIXユーザアカウント>>>
  • systemd(true): 起動時の最初のプロセスとしてsystemdというコマンドを実行させるためのものです。これが無いと、動作しないコマンドが多いため指定します。
  • appendWindowsPath(false): WSL内ではWindowsのコマンドを直接実行することができます。しかし、Ubuntu内でうっかりWindowsのコマンドを実行させると不便な場合もあるため、実行パスからWindowsのコマンドへのパスを取り除きます。
  • default(UNIXユーザアカウント): UbuntuにログインするときのデフォルトのUNIXユーザアカウントを指定します。このユーザアカウントは、インストール時にレジストリに書き込まれますが、バックアップ等でレジストリが消えたときに困るため、明示的に指定しておきます。

wsl.confの内容を反映させるために、Windows Terminalで開いているUbuntu端末を全て閉じます。

最新状態に更新

Ubuntu内のパッケージをいったん最新版に更新するために、以下のコマンドを実行します。

Ubuntu
$ sudo apt update
$ sudo apt upgrade

SSHサーバ

今回のテスト用環境では使用しないのですが、いろいろ便利なのでSSHサーバをインストールしておきます。

Ubuntu
$ sudo apt install openssh-server

UbuntuへのDocker環境構築

インストールしたUbuntu上にDocker環境を構築します。
Docker社公式マニュアルにしたがってインストールしていきます。

競合ソフトウェアを削除します

Ubuntu
$ sudo apt remove docker.io docker-doc docker-compose podman-docker containerd runc

Dockerをインストールするのに必要なソフトウェアをインストールします

Ubuntu
$ sudo apt install ca-certificates curl gnupg

Dockerリポジトリの正当性を確認するためのGPGを取得します

Ubuntu
$ sudo install -m 0755 -d /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ sudo chmod a+r /etc/apt/keyrings/docker.gpg

Dockerリポジトリをインストール用ソースに追加します

Ubuntu
$ echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu jammy stable" | sudo tee /etc/apt/sources.list.d/docker.list

Dockerリポジトリから、必要なソフトウェアをインストールします

Ubuntu
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli docker-ce-rootless-extras containerd.io docker-buildx-plugin docker-compose-plugin

dockerグループへのユーザを追加します

Ubuntu
$ sudo adduser $USER docker
$ sudo usermod -aG docker $USER

dockerグループへの追加を反映させるためにいったんコンソールを終了します

Ubuntu
$ exit

WindowsへのDocker環境構築

Windows側にもDocker(クライアント)等の環境構築を行う必要があります。

Chocolatey

Windows用パッケージマネージャChocolateyをインストールします。

PowerShellを管理者モードで起動し、以下のコマンドを実行します。

PowerShell(管理者モード)
> Set-ExecutionPolicy Bypass -Scope Process -Force;
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

インストールが完了したら、いったん、PowerShell(管理者モード)を閉じます。

Docker(CLI)

Chocolateyを使って、Windows用のdockerコマンドをインストールします。

PowerShellを管理者モードで起動し、以下のコマンドを実行します。

PowerShell(管理者モード)
> choco install docker-cli -y

git(CLI)

Chocolateyを使って、Windows用のgitコマンドをインストールします。

PowerShell(管理者モード)
> choco install git -y

なお、最新版に更新する場合は、以下のコマンドを実行します。

PowerShell(管理者モード)
> choco upgrade all

IntelliJ IDEA環境構築

IntelliJ IDEAをインストールします。インストールは、JetBrains Toolbox経由で行うことにします。

インストール

まず、JetBrains Toolboxをインストールします。

インストール後、JetBrains Toolboxを起動し、"入手可能"プルダウンメニューから、IntelliJ IDEA Ultimateを探します。
そして、その右側にあるアクションメニューから、"入手可能バージョン"を選択します。

バージョン内から、2023.2の最新バージョンを選び、インストールします。

インストール途中、"Install JetBrains ETW Host Service"をインストールするか聞かれた場合は、"Apply"をクリックします。

起動

JetBrains ToolboxからIntelliJ IDEAを起動します。初回起動時にUSER AGREEMENTが表示されますので、"Continue"をクリックします。

また、IntelliJ IDEAのライセンスがあれば、ライセンス登録を行います。

設定

IntelliJ IDEAの基本設定を行います。

* プラグイン

設定 --> プラグイン

"Japanese Language Pack / 日本語言語パック"をインストールします。

* 接続するDocker Engineの設定

設定 --> ビルド、実行、デプロイ --> Docker --> (追加)
設定
名前 (好きな名前)
Dockerデーモンへの接続方法 WSL
WSL Ubuntu-22.04

* Docker CLIのパス指定

設定 --> ビルド、実行、デプロイ --> Docker --> ツール
設定
Docker実行可能ファイル C:\ProgramData\chocolatey\bin\docker.exe
Docker Compose 実行可能ファイル C:\ProgramData\chocolatey\bin\docker.exe

* Gitのパス指定

設定 --> バージョン管理 --> Git
設定
Git実行可能ファイルへのパス C:\Program Files\Git\cmd\git.exe

* ファイルエンコーディング

設定 --> エディター --> ファイルエンコーディング
設定
UTF-8ファイルの作成 BOM無し

ktorプロジェクト作成 (Docker Compose使用)

ktorだけを使用する場合、最初からktorジェネレータを使ってプロジェクトを作成すれば良いのですが、他のコンテナ(DBやWebProxy等)を同時に使うことを考えて、Docker composeを使ったプロジェクトを作成することにします。

空プロジェクト

まず、空のプロジェクトを作成します。

ktorモジュール

プロジェクトのルートモジュールで右クリックするか、または、メニューからktorの新規モジュールを追加します。

新規モジュールの名前は、空プロジェクトのときに作成したモジュール名とは別の名前にします。(この図の例ではappserver)

Dockerfile

追加したktorモジュールのビルドと実行を行うDockerfileを作成します。ktorモジュールで右クリックし、新規ファイルとしてDockerfileを作成します。

Dockerfileの実装例は、以下の通りです。

なお、gradleにjdk20を指定すると、IntelliJ IDEAのデバッガーが対応していないためエラーになります。また、実行用JDKとして、ここではeclipse-temurinを使用しています。

起動オプションにあるagentlib:jdwp=...は、IntelliJ IDEAからデバグを行うために必要な設定です。

FROM gradle:8-jdk11-alpine AS build
COPY --chown=gradle:gradle . /home/gradle/src
WORKDIR /home/gradle/src
RUN gradle buildFatJar --no-daemon

FROM eclipse-temurin:17
EXPOSE 8080:8080
EXPOSE 5005:5005
RUN mkdir /app
COPY --from=build /home/gradle/src/build/libs/*.jar /app/appserver.jar
ENTRYPOINT ["java","-jar", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005","/app/appserver.jar"]

docker compose

ルートモジュールに、Docker compose用のファイルとしてcompose.ymlを作成します。

services:
  app-server:
    hostname: app_server
    build:
      context: appserver
      dockerfile: ./Dockerfile
    networks:
      - private_net
    ports:
      - "8080:8080"
      - "5005:5005"

networks:
  private_net:

Docker compose用の実行構成を追加します。

リモートJVMデバッグ

IntelliJ IDEAから、Dockerコンテナ内のプログラムをデバグするために、リモートJVMデバッグの仕組みを使用します。

実行構成として、リモートJVMデバッグを追加します。

設定
名前 (好きな名前)
デバッグモード リモートJVMにアタッチ
トランスポート ソケット
ホスト localhost
ポート 5005
使用するモジュールのクラスパス (作成したktorモジュールを指定)
起動前 別の構成を実行(Docker compose用の実行構成を指定)

この実行構成でデバッグを実行すれば、作成したktorアプリケーションのデバッグを行うことができます。

変更履歴

日時 内容
2023/08/23 初版

Discussion