🌾

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"
}

ポイント:

  • dockerComposeFileservice で 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

参考リンク

Discussion