【初心者向け】Java/Spring Boot開発を加速!VS Code Dev Containersで始める、チーム開発環境構築ガイド

環境構築の悩みから解放されよう!

新しいプロジェクトに参加するたびに、環境構築で半日以上潰していませんか?
「私の環境では動くのに、なぜかあの人の環境では動かない…」といった、再現性の低いバグに時間を浪費していませんか?
本番環境と開発環境の差異で、デバッグに苦労していませんか?

これらの課題は、開発現場でよくある「あるある」です。

特にチーム開発では、メンバー間の開発環境の差異が、生産性低下やコミュニケーションコスト増加の大きな原因となります。

Spring Bootのようなモダンなフレームワークを使用しているにも関わらず、環境問題で開発が滞るのは避けたいものです。

この記事で得られること

本記事では、これらの課題を解決する「VS Code Dev Containers」に焦点を当てます。

Spring Boot 3.5.7とJava25を組み合わせた開発環境を例に、Dev Containersがチーム開発(Team Development)において一貫性のある開発環境(Development Environment)をどのように実現するかを、具体的な手順と実践的な活用術を交えて解説します。

環境構築の悩みを軽減し、Dev Containersを活用した効率的なチーム開発ワークフローの導入を支援します。


目次


対象読者

  • Spring Bootを用いたJava開発に携わっている方
  • チーム開発における開発環境の構築・管理に課題を感じている方
  • 新規メンバーのオンボーディングを効率化したい開発チームのリーダー
  • VS Code Dev Containersの導入を検討している、または基本を学びたい方
  • Dockerやコンテナ技術に興味があり、開発環境への応用を考えている方

1. 開発環境の課題とDev Containersがもたらす解決策

1-1. チーム開発でよくある環境問題

チーム開発において、開発環境の差異は一般的な課題です。
OSの違い、JDKのバージョン、依存ライブラリの競合など、些細な違いが大きなトラブルに発展することもあります。

これにより、以下のような課題が発生します。

  • オンボーディングコストの増大:
    • 新しいメンバーがプロジェクトに参加する際、環境構築に多大な時間と労力がかかる。
  • 「私の環境では動く」問題:
    • 特定の環境でのみ発生するバグの特定と解決が困難になる。
  • 生産性の低下:
    • 環境差異によるトラブルシューティングに時間を取られ、本来の開発業務に集中できない。

1-2. Dev Containersが解決する「私の環境では動く」問題

VS Code Dev Containersは、これらの課題に対する有効な解決策を提供します。
まるで全員が同じ仮想マシン上で作業しているかのように、環境差異による問題を根本から排除する強力なアプローチです。

開発環境をDockerコンテナ内にカプセル化することで、OSやローカル環境に依存しない、一貫性のある開発環境をチーム全体で共有できるようになります。

エンジニアがDev Containersを利用して開発を行う際の主要な要素とその関係性

上記の図は、エンジニアがDev Containersを利用して開発を行う際の主要な要素とその関係性を示しています。

  • エンジニア: ローカルマシンでVS Codeクライアントを操作します。
  • VS Code クライアント: エンジニアが直接操作するUI部分です。
  • VS Code サーバー: Dev Container内で動作し、VS Codeクライアントからの指示を受け取ります。ほとんどのVS Code拡張機能は、このサーバー上で実行されます。
  • Dev Container: 開発環境全体をカプセル化するコンテナです。Docker上で動作し、プロジェクトコードや開発に必要なツール(JDK, Maven, Gitなど)を含みます。
  • VS Code 拡張機能: VS Codeサーバー上で動作し、Dev Container内のプロジェクトコードやコンテナ内ツールを直接操作することで、コード補完、デバッグ、ビルドなどの開発作業をサポートします。

この図からわかるように、エンジニアはローカルのVS Codeクライアントを操作するだけで、その裏側ではVS Codeサーバーと拡張機能が連携し、Dev Container内の環境を直接操作することで、一貫性のある開発体験が提供されます。


2. VS Code Dev Containersの基本を理解する

Dev Containersは、VS Codeの拡張機能とDockerを組み合わせることで、開発環境をコンテナ内で実行する仕組みです。

2-1. フォルダ構成と設定手順のサマリー

VS Code Dev Containersを導入する際の基本的なフォルダ構成と設定手順は以下の通りです。

.
├── .devcontainer/
   ├── devcontainer.json
   ├── Dockerfile
   └── docker-compose.yml (オプション)
└── (プロジェクトの他のファイルやフォルダ)
  1. .devcontainer フォルダの作成: プロジェクトのルートディレクトリに、Dev Containersの設定ファイルを格納するための.devcontainerフォルダを作成します。
  2. devcontainer.json の設定: このファイルは「開発環境の設計図」であり、コンテナの名前、ビルド方法(Dockerfileの指定)、ポートフォワーディング、VS Code拡張機能の自動インストールなどを定義します。
  3. Dockerfile の定義: コンテナイメージを構築するための「建設指示書」です。ベースイメージ(例: Java JDK)、必要なツールのインストール(例: Git, Maven)、ユーザー設定などを記述します。
  4. docker-compose.yml の活用(オプション): データベースなどの複数のサービスと連携する場合、docker-compose.ymlでそれらのサービスを定義し、devcontainer.jsonから参照することで、複雑な開発環境も一元的に管理できます。

これらの設定ファイルをプロジェクトのリポジトリに含めることで、チームメンバーはリポジトリをクローンするだけで、一貫性のある開発環境を迅速に構築し、すぐに開発を開始できます。


2-2. .devcontainerフォルダとdevcontainer.jsonの役割

.devcontainerフォルダには、コンテナ環境の定義、VS Codeの拡張機能の指定、ポートフォワーディングの設定など、開発環境に関する設定を記述します。


Dev Containersの設定ファイル

devcontainer.jsonは、Dev Containersの挙動を制御する中心的なファイルであり、言わば「開発環境の設計図」です。

.devcontainer/devcontainer.json

// .devcontainer/devcontainer.json
{
  "name": "Spring Boot Dev Container",
  "build": {
    "dockerfile": "Dockerfile",
    "context": ".."
  },
  "forwardPorts": [8080],
  "customizations": {
    "vscode": {
      "extensions": [
        "vscjava.vscode-java-pack",
        "vmware.vscode-boot-dev-pack",
        "redhat.vscode-yaml"
      ]
    }
  },
  "remoteUser": "vscode"
}

devcontainer.jsonの主要な設定項目は以下の通りです。

  • name: 開発コンテナの名前を定義します。VS CodeのUIに表示されるため、プロジェクトの内容が分かりやすい名前を設定しましょう。
  • build:
    • コンテナイメージのビルドに関する設定を行います。
    • dockerfile:
      • 使用するDockerfileのパスを指定します。
      • 通常は.devcontainer/Dockerfileを指定します。(補足を参照)
    • context:
      • Dockerfileのビルドコンテキストを指定します。
      • ..とすることで、プロジェクトのルートディレクトリをコンテキストとします。
  • forwardPorts:
    • コンテナ内で実行されるアプリケーションのポートを、ホストPCにフォワードする設定です。
    • Spring Bootアプリケーションが8080番ポートを使用する場合、[8080]と指定することで、ホストPCのブラウザからhttp://localhost:8080でアクセスできるようになります。
  • customizations.vscode.extensions:
    • コンテナ起動時に自動的にインストールされるVS Code拡張機能を指定します。チームメンバー全員が同じ拡張機能を使用することで、開発体験の一貫性を保ちます。
    • Java開発では「Java Extension Pack」や「Spring Boot Extension Pack」などが推奨されます。
  • remoteUser: コンテナ内で使用するユーザーを指定します。セキュリティの観点から、rootユーザーではなく、vscodeのような一般ユーザーを使用することが推奨されます。

これらの設定の詳細については、Dev Containersの公式ドキュメントを参照してください。


補足: .devcontainer/Dockerfile を使用する理由

プロジェクトのルートディレクトリにDockerfileが存在する場合でも、Dev Containersでは通常、開発環境専用のDockerfile.devcontainerフォルダ内に配置します。これは、開発環境と本番環境の目的と要件を明確に分離するためのベストプラクティスです。

  • 開発環境用Dockerfile: 開発に必要なツール(Git, Maven, デバッグツールなど)や特定のVS Code拡張機能の依存関係を含み、開発者の生産性を最大化します。
  • 本番環境用Dockerfile: アプリケーションのデプロイに必要な最小限のランタイムとコードのみを含み、イメージサイズの最適化とセキュリティを重視します。

このように役割を分けることで、それぞれの環境を独立して管理・最適化し、チーム開発における環境差異の問題を解消し、一貫性のある開発体験を提供します。


2-3. Dockerfileでコンテナ環境を定義する

devcontainer.jsonで指定するDockerfileは、開発環境となるコンテナイメージを構築するための指示書であり、言わば「開発環境の建設指示書」です。

ここでは、Java25のJDKをインストールし、Spring Bootアプリケーションのビルドに必要なツールなどを設定します。


コンテナ環境の定義

.devcontainer/Dockerfile

# .devcontainer/Dockerfile
# ベースイメージとしてJava25のJDKを使用
FROM eclipse-temurin:25-jdk-jammy

# 必要なツールをインストール
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
    && apt-get -y install --no-install-recommends git maven sudo \
    && apt-get clean && rm -rf /var/lib/apt/lists/*
# apt-get update: パッケージリストを更新
# export DEBIAN_FRONTEND=noninteractive: 対話的なプロンプトを抑制
# apt-get -y install --no-install-recommends git maven: gitとMavenをインストール
# apt-get clean && rm -rf /var/lib/apt/lists/*: 不要ファイル削除イメージサイズを削減

# ユーザーの作成
ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID
RUN groupadd --gid ${USER_GID} ${USERNAME} \
    && useradd -s /bin/bash -u ${USER_UID} -g ${USER_GID} -m ${USERNAME}
RUN echo "${USERNAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USERNAME} \
    && chmod 0440 /etc/sudoers.d/${USERNAME}

# 以降のコマンドはこのユーザーで実行
USER ${USERNAME}

# 作業ディレクトリを設定
WORKDIR /workspaces/spring-boot-app

補足: ベースイメージの選択 (jammy vs noble)

Dockerfileでeclipse-temurin:25-jdk-jammyを使用しているのは、安定性と長期サポートを重視しているためです。

  • eclipse-temurin: 商用利用可能な安定したOpenJDKビルド。
  • 25-jdk: 記事のテーマであるJava 25に対応。
  • jammy: Ubuntu 22.04 LTS (Long Term Support) をベースOSとしており、長期的な安定稼働と広範なコミュニティサポートが期待できます。LTSリリースに関する詳細は、Ubuntuの公式リリースサイクル情報を参照してください。

一方、eclipse-temurin:25-jdk-noble(Ubuntu 24.04 LTSベース)も技術的には使用可能であり、より新しいパッケージや機能を利用できるメリットがあります。
しかし、比較的新しいリリースの場合は安定性の確認や既存ライブラリとの互換性検証が必要となる場合があります。安定性を最優先する場合はjammyが堅実な選択肢となります。


2-4. 必須拡張機能の自動インストール設定

devcontainer.jsoncustomizations.vscode.extensionsセクションに、プロジェクトで推奨されるVS Code拡張機能(例: Java Extension Pack, Spring Boot Extension Pack)を指定することで、コンテナ起動時に自動的にインストールされます。

これにより、メンバー全員が同じ開発体験を享受できます。

上記のDockerfileでJava25をベースイメージとして使用することで、最新のJava環境をコンテナ内に構築できます。

また、MavenやGradleといったビルドツールもインストールすることで、Spring Bootプロジェクトのビルド・実行に必要な環境が整います。


補足: customizations.vscode.extensions のExtension IDの探し方

customizations.vscode.extensions に設定する拡張機能のIDは、VS Codeの拡張機能ビュー(Marketplace)から確認できます。

  1. VS Codeの拡張機能ビューを開き、目的の拡張機能を検索します。
  2. 拡張機能の詳細ページを開き、スクロールして「Marketplace」項目グループ内の「Identifier」に記載されている文字列(例: vscjava.vscode-java-pack)を確認します。

このIDをdevcontainer.jsonextensions配列に追加することで、Dev Container起動時に自動的に拡張機能がインストールされます。


2-5. Dev Containerの起動と基本的な操作

Dev Containerの設定が完了したら、実際に起動して開発を開始しましょう。


Dev Containerの起動手順

  1. VS Codeでプロジェクトを開く: まず、ローカルマシンでVS Codeを起動し、Dev Containerを設定したプロジェクトのルートフォルダを開きます。
  2. コンテナで再開: VS Codeの右下隅に表示されるポップアップ(”Folder contains a Dev Container configuration files. Reopen in Container?”)をクリックするか、コマンドパレット(Ctrl+Shift+P または Cmd+Shift+P)を開き、「Dev Containers: Reopen in Container」または「Dev Containers: Open Folder in Container」を選択します。
  3. 初回ビルドと起動: 初回起動時には、Dockerfileに基づいてDockerイメージがビルドされ、その後コンテナが起動します。このプロセスには数分かかる場合があります。2回目以降は、イメージがキャッシュされているため、より迅速に起動します。
  4. 接続完了: コンテナが正常に起動すると、VS Codeの左下隅のステータスバーに「Dev Container: Spring Boot Dev Container」のような表示がされ、コンテナに接続されていることが確認できます。

Dev Containerでの基本的な操作

Dev Containerに接続されたVS Codeでは、ローカル環境とほぼ同じ感覚で開発作業が行えます。

  • ターミナル: VS Codeの統合ターミナルを開くと、コンテナ内のシェルが起動します。ここでjava -versionmvn -versionなどのコマンドを実行し、コンテナ内の環境を確認できます。
  • ファイルの編集: プロジェクト内のファイルを編集・保存すると、変更はコンテナ内のファイルシステムに反映されます。
  • アプリケーションの実行: Spring Bootアプリケーションをビルド・実行するには、ターミナルで./mvnw spring-boot:runなどのコマンドを実行します。
  • ポートフォワーディング: devcontainer.jsonで設定したforwardPorts(例: 8080)により、コンテナ内で起動したSpring Bootアプリケーションには、ローカルマシンのブラウザからhttp://localhost:8080でアクセスできます。
  • 拡張機能の利用: devcontainer.jsonで指定した拡張機能は自動的にインストールされており、コード補完、デバッグ、Linterなどの機能がすぐに利用できます。

これで、Dev Containerを活用した一貫性のある開発環境での作業を開始できます。


Dev Containerからローカル環境に戻る手順

Dev Containerでの作業を終え、ローカル環境に戻りたい場合は、以下の手順を実行します。

  1. リモート接続を閉じる:
    • VS Codeの左下隅にある緑色のリモートインジケーターをクリックします。
    • コマンドパレット(Ctrl+Shift+P または Cmd+Shift+P)を開き、「Close Remote Connection`」を選択します。
    • これにより、VS Codeはローカル環境に戻り、Dev Containerとの接続が切断されます。コンテナ自体は通常、バックグラウンドで実行され続けます。
  2. ローカルでフォルダを開き直す(オプション):
    • もし、Dev Containerで開いていたプロジェクトをローカル環境で再度開きたい場合は、コマンドパレットから「File: Open Folder...」を選択し、ローカルのプロジェクトフォルダを開き直します。
  3. Dev Containerの停止/削除(オプション):
    • Dev Containerが不要になった場合は、リソースを解放するために停止または削除することを検討してください。
    • 停止: Docker DesktopのGUIから該当するコンテナを停止するか、ターミナルでdocker stop <container_name_or_id>を実行します。
    • 削除: Docker DesktopのGUIから該当するコンテナを削除するか、ターミナルでdocker rm <container_name_or_id>を実行します。イメージも不要であればdocker rmi <image_name_or_id>で削除できます。

これらの手順で、Dev Containerからスムーズにローカル環境に戻り、必要に応じてリソースを管理できます。


3. 複数サービス連携も簡単!Docker ComposeとDev Containers

実際のアプリケーション開発では、データベースやメッセージキューなど、複数のミドルウェアと連携することがあります。Dev Containersは、Docker Composeと組み合わせることで、これらのサービスを含んだ複雑な開発環境も簡単に構築できます。


データベースやミドルウェアとの連携方法

docker-compose.ymlファイルに、Spring Bootアプリケーションコンテナと、連携するデータベース(例: PostgreSQL)やその他のミドルウェアサービスを定義します。

# .devcontainer/docker-compose.yml
version: '3.8'
services:
  app:
    build:
      context: ..
      dockerfile: .devcontainer/Dockerfile
    volumes:
      - ../:/workspaces/spring-boot-app
    ports:
      - "8080:8080"
    depends_on:
      - db
  db:
    image: postgres:138
    environment:
      POSTGRES_DB: spring_db
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    ports:
      - "5432:5432"

Compose Specificationの詳細は、公式ドキュメントを参照してください。


docker-compose.ymlを活用した複雑な環境構築

devcontainer.jsonからdocker-compose.ymlを参照することで、VS Codeはこれらのサービスをまとめて起動し、Spring Bootアプリケーションがデータベースに接続できる状態を自動的に構築します。

以下に、docker-compose.ymlを参照するdevcontainer.jsonのサンプルコードを示します。

// .devcontainer/devcontainer.json
{
  "name": "Spring Boot Dev Container",
  "dockerComposeFile": "docker-compose.yml",
  "service": "app",
  "workspaceFolder": "/workspaces/spring-boot-app",
  "forwardPorts": [8080, 5432],
  "customizations": {
    "vscode": {
      "extensions": [
        "vscjava.vscode-java-pack",
        "vmware.vscode-boot-dev-pack",
        "redhat.vscode-yaml"
      ]
    }
  },
  "remoteUser": "vscode"
}

4. チーム開発でDev Containersを最大限に活用する


設定の共有とバージョン管理で一貫性を保つ

.devcontainerフォルダはプロジェクトのリポジトリに含めることで、開発環境の設定自体もコードとしてバージョン管理できます。

これにより、チームメンバーはリポジトリをクローンするだけで、すぐに開発を開始できます。


新規メンバーのオンボーディングを劇的に効率化

新しいメンバーは、複雑な環境構築手順を学ぶことなく、VS CodeとDockerがインストールされていれば、すぐにプロジェクトの開発に参加できます。

これにより、オンボーディングにかかる時間を短縮し、早期の戦力化に貢献します。

私自身も、かつては環境構築のトラブルシューティングに多くの時間を費やしていましたが、Dev Containersを導入してからは、その悩みが解消されました。


まとめ:Dev Containersで開発ワークフローを革新し、チームの生産性を最大化する

本記事では、Spring Boot 3.5.7とJava25を用いたモダンなWebアプリケーション開発における、VS Code Dev Containersの導入と活用法を詳細に解説しました。

  • Dev Containersの基本的な概念とフォルダ構成
  • devcontainer.jsonDockerfileによる環境定義
  • Docker Composeを活用した複数サービス連携
  • チーム開発におけるDev Containersの最大限の活用戦略

Dev Containersは、開発環境を一貫性のあるコンテナとして標準化することで、新規メンバーのオンボーディングを劇的に効率化し、開発者一人ひとりの生産性向上に貢献します。

Dev Containersの導入は、開発ワークフロー最適化の第一歩です。この一貫性のある開発環境をCI/CDパイプラインと連携させ、本番運用へとシームレスに繋げることで、開発プロセス全体の品質と効率は飛躍的に向上します。

この記事が役に立ったら、ぜひSNSでシェアしてください!
また、記事に関するご意見やご質問があれば、ぜひコメント欄にお寄せください。編集部が丁寧にお答えします!


免責事項

本記事は、VS Code Dev Containersおよび関連技術に関する一般的な情報提供を目的としています。
記載されている情報には細心の注意を払っておりますが、その正確性、完全性、有用性について保証するものではありません。
本記事の内容に基づいて生じたいかなる損害についても、筆者および公開元は一切の責任を負いかねます。
技術情報は常に変化するため、ご自身の責任において最新の情報を確認し、適用してください。


SNSでもご購読できます。

コメントを残す

*