Dev ContainerでSpring Boot開発環境を作ってみた VSCode+Docker+Gradle

Docker

こんにちは、ECF Tech ブログ
担当 Michiharu.Tです。

VS CodeでSpring Bootの環境を作りたかったので、基本的な環境構築に用いた手順を、備忘と記録を兼ねてまとめたいと思います。似たような環境を構築したいと考えている方の参考になれば幸いです。

対象読者

  • Dockerの基本操作(イメージ・コンテナ・docker composeなど)について一通りご存知の方
  • VS Codeを使っている方
  • Dev Containerをなんとなくご存じの方(※本記事ではDevContainer自体の説明は省略しています。)

プロジェクト構成

今回は、次のような環境構築を目指します。

プロジェクト構成

  • dbコンテナ:PostgreSQLを使用したDBサーバーとなります。
  • webコンテナ:アプリケーションを配置するコンテナです。Spring Bootの利用のためのJava動作環境と、Spring BootアプリケーションをビルドするためのGradleをインストールします。
  • smtp4devコンテナ:SMTPサーバーとなるコンテナです。smtp4devというツールを使用します。

プロジェクトのディレクトリ構成は簡単に次のとおりです。

├─.devcontainer
│   └devcontainer.json
├─steps
├─compose.yml
└─Dockerfile
  • .devcontainer/devcontainer.json
    VS CodeのDev Containers拡張機能が読み込む設定ファイルです。詳しくは後述します。
  • steps
    Spring Bootプロジェクト本体(ソースコード一式)を配置するディレクトリです。
  • compose.yml
    Docker Compose用のファイルです。
  • Dockerfile
    Webサーバー用のコンテナに関する設定ファイルです。

Dockerfile

まずは、Webサーバー用コンテナのベースとなる環境を定義するDockerfileです。

FROM eclipse-temurin:21

RUN apt-get update
RUN apt-get -y install curl
RUN apt-get -y install zip
RUN curl -s "https://get.sdkman.io" | bash
RUN bash -c 'source "/root/.sdkman/bin/sdkman-init.sh" && sdk install gradle'

WORKDIR /workspace/

各行の説明

ファイル内の各指示の説明です。

  • FROM eclipse-temurin:21
    ベースイメージとして、Eclipse Temurin(OpenJDKのディストリビューションの一つ)のJava 21版を指定しています。

  • RUN apt-get update / RUN apt-get -y install curl / RUN apt-get -y install zip
    パッケージリストを最新化したうえで、curlzipをインストールしています。どちらも、この後インストールするSDKMANの動作に必要なコマンドです。

  • RUN curl -s "https://get.sdkman.io" | bash
    SDKMAN(SDK Manager) をインストールしています。SDKMANは、Java・Gradle・Mavenといった、Java系開発でよく使うSDKのバージョンをコマンド一つで管理できるツールです。
    curlの内容は、SDKMANのマニュアルにのっとった指示ですので、詳しくは公式ドキュメントをご覧ください。以降も、SDKMANの詳細なコマンド等については、説明を割愛しています。

  • RUN bash -c 'source "/root/.sdkman/bin/sdkman-init.sh" && sdk install gradle'
    SDKMANの初期化スクリプトを読み込んだうえで、sdk install gradleコマンドを実行し、Gradleをインストールしています。sourceコマンドで初期化しないとsdkコマンド自体が使えないため、bash -cでまとめて1行のコマンドとして実行しています。

  • WORKDIR /workspace/
    以降の作業ディレクトリを/workspaceに指定しています。後述するcompose.ymlで、このパスにソースコード一式をマウントします。

compose.yml

続いてcompose.ymlです。DBサーバー、Webサーバー、SMTPサーバーの3つのコンテナの起動設定となります。

services:
  db:
    image: postgres:16
    container_name: boot_db
    restart: unless-stopped
    environment:
      POSTGRES_USER: devuser
      POSTGRES_PASSWORD: devpassword
      POSTGRES_DB: devdb
    volumes:
      - db_data_spring:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  web:
    build: .
    ports:
      - "8080:8080"
    volumes:
      - .:/workspace
    command: ["sleep","infinity"]

  smtp4dev:
    image: rnwood/smtp4dev:v3
    ports:
      - '5000:80'
      - '25:25'
      - '143:143'
    volumes:
      - smtp4dev-data:/smtp4dev
    environment:
      - ServerOptions__Urls=http://*:80
      - ServerOptions__HostName=smtp4dev

volumes:
  db_data_spring:
  smtp4dev-data:

コンテナごとの説明を記載します。

db(データベース)

postgres:16イメージを使った、PostgreSQLのコンテナです。

  • environmentで、ユーザー名・パスワード・データベース名を指定しています(開発用の簡易な値です)。
  • volumesで、db_data_springという名前付きボリュームにデータを永続化し、コンテナを作り直してもデータが消えないようにしています。
  • portsで、ホスト側の5432番ポートをコンテナの5432番ポートに割り当てています。これにより、DBクライアントツールなどからホスト経由で直接接続できます

web(アプリケーション本体)

Spring Bootアプリケーションを動かすためのコンテナです。

  • build: .で、先ほどのDockerfileをもとにイメージをビルドします。ビルドしたイメージを元にコンテナを起動します。
  • portsで、Spring Bootのデフォルトポートである8080番を公開しています。ホスト側のブラウザから、Webアプリにアクセスできるようになります。
  • volumesで、カレントディレクトリを丸ごとコンテナの/workspaceにマウントしています。これにより、ホスト側(VS Code)でのソースコード編集が、そのままコンテナ内に反映されます。
  • command: ["sleep","infinity"]で、コンテナ起動時にアプリケーションを自動実行せず、コンテナを起動したまま待機させています。

    command部分でSpring Bootの起動命令を設定し、コンテナ起動時にアプリケーションを起動する方法もありますが、今回はやや手探りなところもありましたので、コンテナにログインし、ターミナル上でGradleの命令実行をするなど、コマンドを自由に実行できる構成を取っています。

smtp4dev(メール送信確認用)

rnwood/smtp4devは、開発中のメール送信処理を確認するための疑似SMTPサーバーです。今回のアプリでは、サインアップなどの処理時にメールを送信する仕組みがあるため、本サーバーを立ち上げています。送受信確認のUIがWebアプリとして提供されており、ブラウザで確認できます。開発用途に最適です。

  • portsで、ブラウザ確認用(5000→80)、SMTP用(25→25)、IMAP用(143→143)の3つのポートを公開しています。
  • volumesで、受信したメールなどのデータをsmtp4dev-dataボリュームに永続化しています。
  • environmentは環境変数です。コンテナ内部のWebserverの待ち受けURLとホスト名を指定しています。

volumes

ファイル末尾のvolumes部分です。dbsmtp4devがそれぞれ使用する名前付きボリューム(db_data_springsmtp4dev-data)を宣言しています。これにより、DBサーバーやSMTPサーバーで生成されたデータを永続化できるようにしています。

Dev Containerの設定

Dev Containerの利用に必要なdevcontainer.jsonの内容は、次のとおりです。

{
    "name": "stepsjava",
    "dockerComposeFile": "../compose.yml",
    "service": "web",
    "workspaceFolder": "/workspace",
    "customizations": {
        "vscode": {
            "extensions": [
                "anthropic.claude-code"
            ]
        }
    }
}

devcontainer.jsonは、VS CodeのDev Containers拡張機能で利用する設定ファイルです。Dev Containerを利用することでVS Codeをコンテナに接続できます。コンテナ内の操作を、まるでローカル環境のように利用できる便利なツールです。Dev Containerについては、また別の機会にご紹介できればと思います。

各項目の説明

  • name
    Dev Containerの名前です。VS Code上に表示される名称として使われます。
  • dockerComposeFile
    使用するcompose.ymlのパスを指定します。.devcontainerフォルダから見て1つ上の階層にあるcompose.ymlを参照するため、../compose.ymlとしています。
  • service
    compose.ymlで定義した複数のサービスのうち、VS Codeが接続する対象のサービス名を指定します。ここではwebサービス用のコンテナに接続します。
  • workspaceFolder
    コンテナ内でVS Codeが開くワークスペースのパスです。
  • customizations.vscode.extensions
    コンテナ作成時に、自動的にインストールするVS Code拡張機能を指定できます。ここでは、Claude Codeの拡張機能(anthropic.claude-code)を導入するようにしています。

動作確認

設定ができたので、Dev Containerで起動してみましょう。

VS Codeで該当プロジェクトを開き、F1キーを押下します。画面上部でコマンドが選べますので、「Dev Containers: Reopen in Container」をクリックします。

コンテナで再開

しばらくすると、VS Codeが Dev Containerモードで開きます。画面左下に次のような表示が出ます。

コンテナ起動チェック

VS Codeのターミナルを見ると、コンテナに接続されていることがわかります。

コンテナ内ターミナル

おわりに

最後までお読みいただき、ありがとうございます。今回は、VS CodeとDevContainerを使って、Spring Boot開発環境を構築してみました。セキュリティ面や実運用面を考慮するとやや物足りない部分もあるかと思いますが、参考になりましたら幸いです。

タイトルとURLをコピーしました