DockerとVS Codeで作るJava開発環境(JDK11)— ローカルを汚さずに学習・実行まで

DockerとVS Codeで作るJava開発環境(JDK11)— ローカルを汚さずに学習・実行まで

Dockerで「ローカルを汚さない」Java開発をする

Javaの学習やちょっとした検証を始めるとき、地味に困るのが開発環境です。

  • PCにJDKを入れると、バージョン違いでハマる
  • 既存の開発環境と競合する
  • 別PCへ移したときに再構築が面倒

そこでおすすめなのが Dockerコンテナ内にJDKを用意して、VS Codeで編集するやり方です。
この方法なら「PC側はほぼ手を入れず」、コンテナを起動するだけで 同じJDK11環境をいつでも再現できます。

この記事では、VS Codeの Dev Containers を使って、JDK11(Temurin)でJavaをコンパイル・実行する最小構成を作ります。

ゴール

  • ローカルにJDKを入れずにJavaを実行できる
  • VS Codeで編集し、コンテナ内のJDK11で javac / java が使える
  • ディレクトリを丸ごとコピーしても同じ環境で動く

前提

  • Docker(Docker Engine / Docker Desktop のどちらでもOK)
  • VS Code
  • VS Code拡張:Dev Containers

プロジェクト構成

Javaのディレクトリは Maven/Gradle 風にしておくと、VS Code側の認識も安定しやすく、将来的な拡張もしやすいです。

java-docker-dev/
  ├─ src/
  │   └─ main/
  │       └─ java/
  │           └─ com/
  │               └─ example/
  │                   └─ Hello.java
  └─ .devcontainer/
      ├─ devcontainer.json
      └─ docker-compose.yml

HelloWorld(サンプル)

src/main/java/com/example/Hello.java

package com.example;

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello from Docker JDK 11!");
    }
}

Dev Containers 用の設定ファイルを作る

.devcontainer/docker-compose.yml

JDK11入りのイメージに Eclipse Temurin を使います。

services:
  java-dev:
    image: eclipse-temurin:11-jdk
    working_dir: /work
    volumes:
      - ..:/work
    command: sleep infinity

ポイントは2つです。

  • volumes: - ..:/work
    VS Codeで開いているプロジェクト(.devcontainer の1つ上)を、コンテナの /work にマウントします。
    つまり、ホスト側で編集したソースがそのままコンテナから見えます。
  • command: sleep infinity
    コンテナを“作業用に起動しっぱなし”にするための設定です。VS Codeがいつでも接続できます。

.devcontainer/devcontainer.json

{
  "name": "java11-dev",
  "dockerComposeFile": "docker-compose.yml",
  "service": "java-dev",
  "workspaceFolder": "/work",
  "customizations": {
    "vscode": {
      "extensions": [
        "ms-vscode-remote.remote-containers",
        "vscjava.vscode-java-pack"
      ]
    }
  }
}

devcontainer.json は、VS Code に対して

  • どのコンテナ(docker-compose / Dockerfile)を使うか

などを指示する“プロジェクト専用の設定”です。
このファイルがあると、VS Code の Reopen in Container で同じ環境を再現できます。

  • ワークスペースをコンテナ内のどこに置くか(例:/work
  • コンテナ内で自動的に入れる拡張機能
  • コンテナ内で適用したい VS Code 設定(任意)

たとえばこの記事で使ったように、

"customizations": {
"vscode": {
"extensions": ["vscjava.vscode-java-pack"]
}
}

これは “コンテナ内のVS Code環境”に拡張機能を入れる設定で、Java拡張(Java Pack)を入れておくことで、補完や定義ジャンプも効きやすくなります。

VS Codeでコンテナを開く

  1. VS Codeでプロジェクトフォルダ(例:java-docker-dev/)を開く
  2. コマンドパレットから
    Dev Containers: Reopen in Container
  3. しばらく待つと、VS Codeがコンテナ内に接続した状態になります

以降、VS Codeのターミナルはコンテナ内で動くので、java / javac はコンテナ側のものが使われます。

コンテナ内でコンパイル&実行

VS Codeのターミナルで以下を実行します。

javac -d out src/main/java/com/example/Hello.java
java -cp out com.example.Hello

成功すると次のように表示されます。

Hello from Docker JDK 11!

この方法のメリット

  • ローカルにJDKを入れなくていい(環境を汚さない)
  • JDKバージョンを固定できる(チームや別PCでも再現性が高い)
  • プロジェクトごとに環境を分けられる(JDK11/17/21の共存も簡単)
  • ディレクトリごとコピーすれば、ほぼ同じ手順で動く

おわりに

Javaの学習や検証のたびにローカル環境を整えるのは、意外とコストがかかります。
Docker + Dev Containersにしてしまえば、「環境構築」ではなく「コードを書く」ことに集中できます。

次のステップとして、Maven/Gradleをコンテナに組み込んだり、JUnitでテストを回す構成にするのもおすすめです。必要になったら、そこも同じ方針で拡張できます。