🙄

DevContainersでSpringBootアプリ開発 ~ Podman Desktop × VSCode × SpringBoot ~

2024/10/18に公開

本記事の主目的

近年、開発環境のセットアップにかかる時間や複雑さを軽減するための技術が数多く登場しています。その中でも、Visual Studio Code Dev Containers(以降DevContainersと呼称します)は、開発環境をコードとして定義し、チーム全体で一貫した環境を提供するための強力なツールです。本記事では、Podman DesktopとVisual Studio Code(VSCode)を活用し、Spring Bootアプリケーションの開発を簡潔かつ効率的に行う方法を紹介します。
Dockerに代わるコンテナランタイムとして注目されているPodmanを使用し(2024年9月時点)、かつ、ローカル環境やクラウド環境に依存しないDevContainersを利用した開発をイメージいただければと思います。

⚠️注意事項

本記事では、「Podman Desktop と Visual Studio Code(VSCode) を活用し、Spring Boot アプリケーションの開発を簡潔かつ効率的に行う方法」にフォーカスしています。そのため、以下の内容については基礎知識があることを前提とし、詳細な解説は他の記事や外部リソースに委ねる旨ご了承ください。

本記事のターゲット

  • コンテナ技術を利用した開発に関心があるバックエンドエンジニア
    • 特に、Docker以外のコンテナ技術(Podmanなど)に興味があり、効率的な開発環境の構築を目指している方
  • Spring Bootアプリケーションの開発に携わるJavaエンジニア
    • Spring Bootを使用したマイクロサービスやWebアプリケーションの開発者で、コンテナベースの環境を導入したい方
  • Visual Studio Codeを使っているフルスタック開発者
    • VSCodeを日常的に利用しているが、DevContainersの導入方法やその利便性をまだ把握していない方
  • 効率的な開発環境の自動化に興味がある開発者
    • 手作業での環境設定に悩んでおり、DevContainersを使って環境をコード化し、セットアップの自動化やチーム全体の一貫性を保ちたいと考えている方
  • Podman Desktopの導入を検討しているDevOpsエンジニア
    • コンテナベースのローカル開発環境をDockerからPodmanに移行する際の実用的な事例や知識を探している方

なぜ、DevContainers(Development Containers)で開発するのか

  • 一貫した開発環境を保証
    DevContainersを使用することで、開発環境をコードとして定義し、すべての開発者が同じ環境で作業できるようになります。これにより、環境依存のバグや「私の環境では動く」問題を回避でき、また特定のホストマシン(Mac/Windows等)に依存する設定や依存関係が排除され、チーム全体で一貫性のある開発体験が保証されます。
  • セットアップの自動化と迅速なオンボーディング
    開発環境のセットアップが自動化され、DevContainers内で必要なツールやライブラリが事前にインストールされるため、環境構築を行う際の時間を大幅に節約できます。数行の設定ファイルだけで、複雑な環境も迅速に構築可能です。
  • 複数の言語やフレームワークに対応した柔軟な環境
    DevContainersはさまざまなプログラミング言語やツールをコンテナベースで導入でき、異なる技術スタックを1つのプロジェクト内で効率的に使い分けることが可能です。コンテナごとに環境を分離して動作させるため、バックエンドにJavaのSpring Boot、フロントエンドにJavaScriptの開発環境といった組み合わせも柔軟に管理できます。この仕組みによって各技術の依存関係やバージョンの干渉を防ぐことができます。
  • ローカル環境への影響を最小限に抑える
    DevContainersはホストマシンとは完全に独立したコンテナ内で動作するため、既存のローカル環境の動作に極力影響与えることなく、複数のプロジェクトを安全に管理できます。例えば、あるプロジェクトでJava 8、別のプロジェクトでJava 17を使用する場合、それぞれに対応するコンテナを作成することで、ホストマシンに複数のJavaバージョンをインストールする必要がありません。これにより、同一マシン上で異なるバージョンの開発環境を分離して管理でき、ローカル環境に影響を与えずに複数のプロジェクトを並行して開発することが可能です。

開発環境構築と開発デモ

💻 ホストマシン情報

  • MacBook Air (Apple M1チップ、Sonoma 14.5)
    • VSCode バージョン: 1.93.1 (Universal)
    • Podman Desktop バージョン: 12.0 (1.12.0)
    • Git バージョン: 2.41.0

各ツールのインストール方法については割愛します(公式ドキュメント参照)。
本記事内で紹介する環境構築を再現する際は、各ツール・VSCode拡張機能・ベースイメージについて利用ライセンスや規約を事前にご確認ください。(例として、2024年9月時点で「Podman Desktop」は無料で商用利用が可能です)

⚙️ 環境構築 - 方針整理

アプリケーション

  • サンプルアプリケーションは Mavenプロジェクト として実行(Gradleプロジェクトでも可)

コンテナ

ベースイメージの選定というテーマについては別記事で整理する予定です。

  • アプリケーションのリソースは bind mount を使用(≠ volume mount)

⚙️ 環境構築 〜準備〜

  1. ホストマシン側でリポジトリをクローン

    • git clone コマンドでアプリケーションプロジェクトをクローンします。
  2. プロジェクトのルートディレクトリに .devcontainer フォルダを作成

    • gs-spring-boot プロジェクト内に .devcontainer ディレクトリを作成し、その中に devcontainer.jsonDockerfile を配置します。
    • このディレクトリは、開発環境を再現するための設定を含んでおり、プロジェクトに共通の環境をチーム全体で簡単に共有できるようになります。
    • 今回のサンプルプロジェクトには .devcontainer が存在しないため、新規で作成します。
gs-spring-boot/
├── 〜 (省略)
├── initial/
└── .devcontainer/   # 開発環境を定義するディレクトリ
    ├── devcontainer.json  # DevContainers設定ファイル:VSCodeの拡張機能や環境設定を記述
    └── Dockerfile         # コンテナのビルド手順を定義するファイル
Dockerfile
# ベースイメージにOpenJDK 17を指定 ※必要に応じてカスタマイズ可
FROM openjdk:17-jdk-slim-buster

# 必要なパッケージをインストール ※必要に応じてカスタマイズ可
RUN apt-get update && apt-get install -y \
    git \      # バージョン管理ツール
    vim \      # テキストエディタ
    wget \     # ファイル取得ツール
    curl && \  # HTTPリクエストツール
    apt-get clean  # 不要なキャッシュの削除

# JAVA_HOME 環境変数を設定
ENV JAVA_HOME=/usr/local/openjdk-17
ENV PATH=$JAVA_HOME/bin:$PATH

# コンテナ内で作業するディレクトリを指定
WORKDIR /app

# デフォルトで実行されるコマンドを指定 ※必要に応じてカスタマイズ可
CMD ["bash"]
devcontainer.json
{
    "name": "sample",  // 開発環境の名前
    "image": "docker.io/library/sample:latest",  // 使用するDockerイメージ

    "customizations": {
        "vscode": {
            // VSCodeで使用する拡張機能のリスト ※コメントにデモ時のインストールバージョン記載
            "extensions": [
                "redhat.java",  // Java開発向けの拡張機能:Language Support for Java(TM) by Red Hat v1.35.0
                "redhat.vscode-yaml",  // YAMLファイル用拡張機能:YAML v1.15.0
                "vmware.vscode-boot-dev-pack",  // Spring Boot関連ツールのパック:Spring Boot Extension Pack v0.2.1
                "vmware.vscode-spring-boot",  // Spring Bootの統合支援拡張機能:Spring Boot Tools v1.57.0
                "vscjava.vscode-spring-boot-dashboard",  // Spring Boot Dashboard拡張機能:Spring Boot Dashboard v0.14.0
                "vscjava.vscode-spring-initializr",  // Spring Initializrからプロジェクトを作成する拡張機能:Spring Initializr Java Support v0.11.2
                "vscjava.vscode-maven",  // Mavenのサポート拡張機能:Maven for Java v0.44.0
                "vscjava.vscode-gradle",  // Gradleのサポート拡張機能:Gradle for Java v3.16.4
                "vscjava.vscode-java-debug",  // Javaデバッグサポート:Debugger for Java v0.58.0
                "vscjava.vscode-java-dependency",  // Javaの依存関係管理:Project Manager for Java v0.24.0
                "vscjava.vscode-java-pack",  // Java用のツールセット:Extension Pack for Java v0.29.0
                "vscjava.vscode-java-test"  // Javaのテスト支援拡張機能:Test Runner for Java v0.42.0
            ]
        }
    },
    "workspaceFolder": "/app"  // コンテナ内でのワークスペースディレクトリ
}

⚙️ 環境構築 〜Podman Desktopを活用したイメージビルドとコンテナ起動〜

  • Podman Desktop上で開発環境のイメージビルドとコンテナ起動を実施します。
    podman コマンドを利用して実行することも可能
  1. Podman Desktop の images タブに移動し、「Build」を選択します。

  2. 以下の設定を行い、ビルドを実施します。

  3. ビルドが完了すると、以下のようにログが表示されます。

  4. images タブで、先ほど作成したイメージの「実行ボタン」を選択します。

  5. 以下の設定を行い、コンテナを作成します。

    • Volume(bind) については、ホストマシン側のパスを左側の入力エリアに、コンテナ側のパスを右側の入力エリアに入力してください。
  6. コンテナが作成され、起動状態であることを Containers タブで確認します。

⚙️ 環境構築 〜VSCode:設定とリモートコンテナ接続〜

VSCode でリモートコンテナに接続するための環境を構築します。

1. 必要な拡張機能のインストール

まず、VSCode にリモートコンテナ接続に必要な拡張機能をインストールします。

  • 拡張機能名: Dev Containers
  • 拡張機能ID: ms-vscode-remote.remote-containers
  • 機能:
    • この拡張機能を使うと、VSCode で DevContainers を使用してリモートコンテナに接続し、コンテナ内で開発ができます。
    • devcontainer.json ファイルに基づいて、指定された Docker イメージを使ってコンテナ環境を自動的に構築してくれます。

2. Podman を Docker Path に設定

  • Podman コマンドを利用するために、Docker Path を "Podman" に変更します。
    VSCode の設定画面で、「Docker Path」を検索し、以下のように設定します。

  • 以下は Podman の設定画面です。

3. リモートコンテナに接続

Podman の設定が完了したら、次はリモートコンテナに接続します。

  • リモートコンテナ接続手順


  • リモートコンテナ接続(VSCODE新規ウィンドウ)、拡張機能のインストールが完了した状態
     ※リモートコンテナへの初回接続では、VSCODEの拡張機能のインストールに少々時間を要します。

🛠️ 開発 〜アプリケーションの起動・実行〜

アプリケーションの起動と実行の手順について説明します。

1. /app 配下のソースファイルを開く

まず、プロジェクトの /app フォルダにあるソースファイルを開きます。

2. Spring Dashboard からアプリケーションを起動する

次に、Spring Dashboard から /initial アプリケーションを起動します。
※もし Spring Dashboard 上にアプリケーションが表示されない場合は、Maven プロジェクトとして認識されていない可能性があります。VSCODE の通知(NOTIFICATION)に警告が表示されている場合、そのプロジェクトを Maven として認識するオプションを選択してください。

3. アプリケーションの起動完了

アプリケーションの起動が完了すると、以下のようなメッセージが表示されます。

4. アプリケーションの実行

最後に、起動したアプリケーションを実行します。

🛠️ 開発 〜アプリケーションの修正・実行〜

アプリケーションの応答内容を修正し再起動後、アプリケーションを実行します。

💡 Tip: Spring Boot開発ではLiveReload( Spring Boot DevToolsライブラリ)を利用すると、コードを変更を検知し自動的に再コンパイル・再起動が行われ、変更が即座にアプリケーションに反映され効率的な開発が実現できます。

最後に

最後までご覧いただきありがとうございました。
この記事を通じて、少しでも学びや新しい発見があれば幸いです。
今後は以下テーマで記事を予定してます。

  • 画面表示を伴う開発方法
    ホストマシンからコンテナアプリケーションにアクセスする際の手順や、ポートフォワーディングを利用した通信方法を詳しく解説します。

  • DB(MySQL、PostgreSQL)、Redis等との通信
    各データベースやRedisを個々のコンテナとして起動し、Podmanネットワーク内でのコンテナ間通信を実現する方法を紹介します。

Discussion