IntelliJ IDEAとDockerで作るktor開発環境 (Windows)
概要
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の更新コマンドを実行します。
> wsl --update
更新プログラムを確認しています。
Linux 用 Windows サブシステムを更新しています。
Windows Terminal
Windows Terminalがインストールされていない場合は、PowerShellやUbuntuのターミナル起動を簡単に行うためにWindows Terminalをインストールします。
Microsoft Storeアプリから、Windows Terminalをインストール、または、最新版への更新を行います。
Microsoft Storeアプリ --> アプリ --> Windows Terminalを検索 --> インストールまたは更新
Ubuntuインストール
Ubuntuをインストールするために、コマンドプロンプトまたはPowerShellを管理者モードで起動します。
そして、wslのインストールコマンドを実行します。
> wsl --install Ubuntu-22.04
インストール途中、管理者となるUNIXユーザアカウントとパスワードを尋ねられますので入力します。
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内でエディタを起動します。
$ sudo nano /etc/wsl.conf
[sudo] password for <<<管理者UNIXユーザアカウント>>>
sudo
は、管理者権限でコマンドを実行するためのコマンドです。sudo
を実行するとき、パスワード入力を求められる場合があります。
nano
は、Ubuntuに標準でインストールされているエディタです。
wsl.conf
の内容を、以下の通り入力します(<<<管理者UNIXユーザアカウント>>>は、先ほど実際に登録したUNIXユーザアカウントを入力します)。
[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内のパッケージをいったん最新版に更新するために、以下のコマンドを実行します。
$ sudo apt update
$ sudo apt upgrade
SSHサーバ
今回のテスト用環境では使用しないのですが、いろいろ便利なのでSSHサーバをインストールしておきます。
$ sudo apt install openssh-server
UbuntuへのDocker環境構築
インストールしたUbuntu上にDocker環境を構築します。
Docker社公式マニュアルにしたがってインストールしていきます。
競合ソフトウェアを削除します
$ sudo apt remove docker.io docker-doc docker-compose podman-docker containerd runc
Dockerをインストールするのに必要なソフトウェアをインストールします
$ sudo apt install ca-certificates curl gnupg
Dockerリポジトリの正当性を確認するためのGPGを取得します
$ 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リポジトリをインストール用ソースに追加します
$ 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リポジトリから、必要なソフトウェアをインストールします
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli docker-ce-rootless-extras containerd.io docker-buildx-plugin docker-compose-plugin
dockerグループへのユーザを追加します
$ sudo adduser $USER docker
$ sudo usermod -aG docker $USER
dockerグループへの追加を反映させるためにいったんコンソールを終了します
$ exit
WindowsへのDocker環境構築
Windows側にもDocker(クライアント)等の環境構築を行う必要があります。
Chocolatey
Windows用パッケージマネージャChocolateyをインストールします。
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を管理者モードで起動し、以下のコマンドを実行します。
> choco install docker-cli -y
git(CLI)
Chocolateyを使って、Windows用のgitコマンドをインストールします。
> choco install git -y
なお、最新版に更新する場合は、以下のコマンドを実行します。
> 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 . /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 /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