VS Code Dev Containerで始める Java 開発 (Corretto 21 最小構成)
1. はじめに
ローカルで環境構築すると、JDK のバージョン違いやツール不足で「動く/動かない」が人によって変わりがちです。Dev Container を使うと、開発環境をコードとして共有でき、誰が開いても同じ状態を再現できます。本記事では Hello World が動く最小構成 を題材に、仕組みと設定ポイントを学びます。
2. Dev Container とは
VS Code の拡張機能 (Dev Containers) が、Docker コンテナ内に開発環境を作り、VS Code をその中へ「接続(attach)」します。これにより:
- みんな同じ OS / ツール / JDK を使える
- ローカル環境を汚さない
- セットアップ手順が自動化 (依存インストールなど)
従来の「README を読みつつ手作業インストール」と比べて、再現性とオンボーディング速度が向上します。
3. 技術選定 (Corretto 21 / 最小構成)
今回は Amazon Corretto 21 (LTS) を選びました。理由:
- 無料 & 長期サポート (LTS)
- OpenJDK 互換なので一般的な Java アプリがそのまま動く
- セキュリティアップデートが定期提供される
あえて Maven / Gradle などビルドツールは外し、Java のコンパイル~実行の基本を最短で確認できる形にしています。
4. 構成ファイル一覧
Infra/Docker/DevContainer/Java 配下に以下を配置します (言語ごとにディレクトリを分ける想定):
Infra/Docker/DevContainer/Java/
.devcontainer/devcontainer.json # VS Code Dev Container 設定 (Java 用)
compose.yaml # コンテナ起動定義 (単一サービス java)
src/HelloWorld.java # 動作確認用の Java プログラム
bin/ # コンパイル成果物 (postCreateCommand で生成)
README.md # Java コンテナの利用手順
5. devcontainer.json 解説
devcontainer.json は VS Code に「このディレクトリをこういうコンテナで開いてね」と伝える設定ファイルです。
最小抜粋例:
{
"name": "java-corretto21-dev",
"dockerComposeFile": ["../compose.yaml"],
"service": "java",
"workspaceFolder": "/workspace",
"customizations": {
"vscode": {
"settings": {
"java.configuration.runtimes": [
{
"name": "JavaSE-21",
"path": "/usr/lib/jvm/java-21-amazon-corretto",
"default": true
}
]
},
"extensions": ["vscjava.vscode-java-pack"]
}
},
"postCreateCommand": "mkdir -p bin && javac -d bin src/HelloWorld.java"
}
ポイント:
-
dockerComposeFileとserviceで compose のどのサービスを使うか指定 -
workspaceFolderは VS Code が繋ぐルートパス -
customizations.vscode.extensionsで Java 拡張セットを自動導入 -
postCreateCommandで初回コンパイルを自動化 (人の手順抜け防止)
6. compose.yaml 解説
コンテナをどのイメージでどう起動するかを定義。抜粋:
services:
java:
image: public.ecr.aws/amazoncorretto/amazoncorretto:21-al2023
command: ["sleep", "infinity"]
volumes:
- .:/workspace:cached
working_dir: /workspace
説明:
-
image: Corretto 21 の公式ベースイメージ(AWS Public ECR 参照)。 -
volumes: 現在のディレクトリ(DevContainer 用ディレクトリのみ)を/workspaceにマウント。 -
command: ["sleep", "infinity"]: コンテナがすぐ終了しないように待機。これがないと VS Code 接続後に瞬時に停止するイメージもあるため、開発体験が悪化します。
なぜ sleep infinity なのか
CPU をほとんど使わず、コンテナを "生かす" 最も単純な方法です。代替案: tail -f /dev/null もほぼ同じ意味。
7. HelloWorld.java
最小の Java プログラム。
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
javac でコンパイルし生成クラスを java で実行します。
8. docker compose up が不要な理由
VS Code の「Dev Containers: Reopen in Container」を実行すると、拡張機能が内部的に docker compose を呼び出してサービス起動〜接続まで自動で行います。手動で docker compose up してしまうと:
- 二重起動や名前衝突のリスク
- VS Code が再接続時に挙動混乱 (再利用/再作成の選択が発生)
どうしても手動確認したい場合の例 (任意):
docker compose -f compose.yaml up -d
# 停止
docker compose -f compose.yaml down
9. 既存コンテナがある場合の挙動
既に同サービスが起動中で VS Code から「Reopen in Container」を行うと:
- 既存コンテナへアタッチされるか
- 再ビルド/再作成を促される
安定させるコツ:
# 稼働中コンテナ一覧
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"
# 手動起動を整理
docker compose -f compose.yaml down
設定を変更したら VS Code の「Rebuild Container」で再反映できます。
10. まとめ
本記事では Dev Container を使い:
- Java (Corretto 21) の統一開発環境を用意
- 最小ファイルで Hello World 動作確認
- keep-alive コマンドの意義と再現性向上のコツ
を学びました。最初はシンプルにし、必要になった段階で Maven/Gradle や DB サービスを compose に追加していくのが安全です。
11. 付録
主要コマンド一覧
# Dev Container 起動 (VS Code コマンドパレット)
Dev Containers: Reopen in Container
# 手動ビルド (任意)
mkdir -p bin
javac -d bin src/HelloWorld.java
java -cp bin HelloWorld
# コンテナ確認/停止
docker ps
docker compose -f compose.yaml down
参考リンク
- VS Code Dev Containers Docs: https://code.visualstudio.com/docs/devcontainers/containers
- Amazon Corretto: https://aws.amazon.com/corretto/
- Docker Compose: https://docs.docker.com/compose/
Discussion