0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Docker Dev Container サンプル(Windows環境)

Last updated at Posted at 2025-08-06

お願い
本記事の内容に誤りや改善点がございましたら、コメント等でご指摘いただけますと幸いです。
なお、本記事は個人の学習記録として作成したものです。業務でご利用の際は、公式ドキュメントもあせてご確認ください。

1. はじめに

本記事では、Windows環境でWSLとDocker Dev Containerを使って、Java(Spring Boot)+MySQLの Dev Container(開発環境)を作る手順を紹介しています。

特に、VS CodeのDev Container機能を使い、「誰でも同じ環境で開発できるようにする」ことができたり、
環境構築の手間を減らしたり、チーム開発でもスムーズに動けるようにする方法をまとめています。

  • 対象読者
    • JavaやSpring Bootの開発経験はあるが、DockerやWSLの使用経験がない方
    • チームや複数プロジェクトでの開発環境管理に悩んでいる方
    • Dev Containerの実用例をコードベースで学びたい方
  • ゴール
    • DockerとDev Containerの概要と利点の理解
    • Java+MySQL構成のサンプルプロジェクトを用いた環境構築方法
    • Dev Containerを使った開発と、未使用の場合の違いの比較

2. Dockerとは?

Dockerとは、アプリケーションとその実行環境をひとまとめにした「コンテナ」という単位で管理・実行できる、軽量な仮想化技術です。
このコンテナは、アプリが動作するのに必要なOSやライブラリ、設定などをすべてパッケージ化しており、どこでも同じ環境を再現できます。

例えば、開発者のPCで動くものが、そのまま本番環境や別のマシン上でも同じように動作するため、「環境による不具合」を大幅に減らすことができます。

Dockerの裏側では、ホストOSのカーネルを共有しながらプロセスを隔離することで、仮想マシンよりも軽量かつ高速に環境を構築できます。

補足
前提知識が知りたい方は下記をご確認ください。
Dockerの利点、ほかの仮想化技術との違い
Docker(Docker Compose)基礎解説(概念・仕組み・メリット編)
WSL上でDockerを活用したJava(Spring Boot)とMySQLのコンテナ環境を構築する手順
Docker(Docker Compose)基礎解説(WindowsのWSLを使用した環境構築編)

3. Dev Containerとは

Dev Container(開発コンテナ)とは、Visual Studio CodeなどのコードエディタやIDE(※1)と連携して使用する、 開発専用のDockerコンテナ環境です。
同じ開発環境をチームや個人で再現・共有できる仕組みで、.devcontainer/ フォルダに設定ファイルを置くことで以下を実現します。

  • 必要なツールや依存を含んだ開発環境の構築
  • コードエディタやIDEのUIからコンテナに入り作業可能
  • ホスト環境に依存しない再現性の高い環境の提供

(※1):Dev Containerの機能を提供しているコードエディタやIDEはいくつかありますが、
本記事はVisual Studio Codeを使用する前提になっています。

4. Dev Containerの利点

利点 説明
✅ 環境構築の自動化 .devcontainer.jsonでコードエディタやIDEが開発環境を自動構築
✅ 環境の統一 チームメンバー全員が同じ開発環境を使用できる
✅ ホスト環境の汚染防止 開発ツールや依存関係がホストOSにインストールされない
✅ 開発ツールの事前インストール Gitやcurl、Javaなど必要なツールをDockerイメージに定義可能
✅ デバッガやLinterと統合可能 VS Codeの拡張と連携しコード補完・フォーマット・デバッグが可能
✅ 変更が即時コンテナに反映 ソースコードの変更がホストとコンテナでリアルタイム同期される(volumeマウント)
✅ CI/CD環境への応用が容易 コンテナベースなので本番やCI/CD環境と近い設定を使える

まだ活用には慣れていませんが、Dev Containerを使うことで次のように変わると考えています。

これまでは複数の案件を同時に進めるとき、ライブラリのバージョンや依存関係が混在して管理が難しかったと思います。
Dev Containerを利用すれば、リポジトリごとに依存関係を分離できるため、ほかの案件に影響を与えずに開発が進められます。

また、環境構築が自動化・簡単になることで、気軽に環境の初期化ができるようになるのも大きな利点だと思います。
不具合があればすぐ初期化できるというのは精神的な支えになります…笑

5. サンプルプロジェクト取得

前提
下記の記事で紹介しているプロジェクトをベースに解説していきます。
dockerの起動方法、サンプルアプリの解説をしているので、興味があればご確認ください。
Docker(Docker Compose)基礎解説(WindowsのWSLを使用した環境構築編)

下記のプロジェクトからプロジェクトを取得
GitHub:https://github.com/kawaJ1/Docker-Sample/tree/dev-container
Branch:dev-container

6. プロジェクト構成

Docker-Sample/
├── .devcontainer/             ← Dev Container 用設定(VS Code用)
│   ├── Dockerfile             ← Java 17 + bash の開発環境
│   ├── devcontainer.json      ← DevContainer設定(マウント、拡張機能など)
│   └── docker-compose.yml     ← Dev Container 用の Compose(dev + db)
│
├── docker-compose.yml         ← 本番用ビルド定義(Dev Container使用時(開発時)は使わない)
│
├── app/
│   ├── Dockerfile
│   └── mydockersample/
│       ├── pom.xml
│       └── src/
│           ├── main/
│           │   ├── java/
│           │   │   └── com/example/demo/
│           │   │       ├── MydockersampleApplication.java
│           │   │       ├── Message.java
│           │   │       ├── MessageRepository.java
│           │   │       ├── MessageService.java
│           │   │       └── MessageController.java
│           │   └── resources/
│           │       ├── templates/
│           │       │   └── index.html
│           │       └── application.properties
│           │
│           └── test/
│
└── db/
    └── init.sql

この構成のポイント

  • .devcontainer/ ディレクトリは 開発環境専用
  • .devcontainer/devcontainer.json によって VS Code が開発用コンテナを自動起動する。
  • .devcontainer/Dockerfile は JDK・Maven などを含む 開発向けイメージを定義。
  • app/Dockerfile本番向けの JAR 実行イメージをビルドするための定義。
  • 開発用と本番用で Dockerfile を分離することで、目的別に最適化された環境を用意できる。
  • CI/CD パイプラインでは app/Dockerfile を使って 本番用イメージをビルド&デプロイできる。
  • ローカル PC を汚さず、Maven のローカルリポジトリなどもコンテナ内に完結させられる。
  • docker-compose.yml を利用すれば、アプリ+DB の連携開発環境もコマンド一発で起動可能。

7. 各ファイルの解説

※元のプロジェクトからDev Containerを追加したところのみ解説します。

7-1. .devcontainer/ フォルダについて

.devcontainer/ フォルダは Visual Studio Code(VS Code) の Dev Container 機能専用の設定ファイルをまとめて置く場所 です。


7-2. .devcontainer/Dockerfile

# .devcontainer/Dockerfile

FROM mcr.microsoft.com/devcontainers/java:dev-17-jdk-bullseye
  • ベースイメージは Microsoft の Java 17 開発用イメージを利用
    Debian Bullseyeベースで JDK 17 が含まれているため、開発に必要なJava環境が整っています。
    maven, bashも含まれているので、基本的な開発は問題ないと思います。

7-3. .devcontainer/devcontainer.json

{
  "name": "Java Dev Container",
  "dockerComposeFile": "docker-compose.yml",
  "service": "dev",
  "workspaceFolder": "/workspace/app/mydockersample",
  "remoteUser": "vscode",
  "customizations": {
    "vscode": {
      "extensions": [
        "vscjava.vscode-java-pack",
        "pivotal.vscode-spring-boot",
        "eamodio.gitlens"
      ]
    }
  },
  "runServices": ["db"],
  "shutdownAction": "stopCompose"
}
  • VS CodeのDev Container設定ファイル

    • dockerComposeFileで開発用.devcontainer/docker-compose.ymlを指定し、
    • serviceには起動する開発用コンテナ名 dev を指定。
    • workspaceFolderでマウントされる作業ディレクトリを設定(Spring Bootアプリの場所)
    • customizations.vscode.extensionsで開発に便利なVS Code拡張を指定。
    • runServicesでMySQLコンテナ(db)も一緒に起動。
    • コンテナ停止時にはdocker-composeを停止する設定。

7-4. .devcontainer/docker-compose.yml

サンプルコードのためDBの接続情報をべた書きしています。
実際のリリース物を作る際は注意してください。

version: '3.8'

services:
  db:
    image: mysql:8.0
    container_name: db
    environment:
      MYSQL_DATABASE: sampledb
      MYSQL_USER: user
      MYSQL_PASSWORD: pass
      MYSQL_ROOT_PASSWORD: rootpass
    ports:
      - "3307:3306"
    volumes:
      - db_data:/var/lib/mysql
      - ../db/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
    networks:
      - app-network
  dev:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ..:/workspace:cached
    command: sleep infinity
    depends_on:
      - db
    networks:
      - app-network

volumes:
  db_data:

networks:
  app-network:
  • MySQLコンテナ(db)

    • mysql:8.0公式イメージを使用し、環境変数で初期DBとユーザ設定。
    • ポート3307をホストに公開。
    • ../db/init.sqlを起動時に読み込むことで初期データを投入。
  • 開発用コンテナ(dev)

    • .devcontainer/DockerfileからビルドされるJDK開発環境。
    • ホストの親ディレクトリ(リポジトリ全体)を /workspace にバインドマウント(高速キャッシュ付き)。
    • 起動時は sleep infinity でプロセスを持続し、VS Codeからのアタッチ待ち状態に。
    • MySQLコンテナ(db)に依存。
    • 同じネットワークに接続し、コンテナ間通信可能に設定。

8. Dev Containerの有無による違い比較表

項目 Dev Container あり Dev Container なし
開発環境の操作性 VS Codeからの操作感はほぼ同じ。(Dev Container上で開発) -
開発環境の再現性 .devcontainer.json + Dockerfile で統一 各自のローカル環境に依存
開発対象のコンテナ VS Code が dev コンテナに接続 ローカルで VS Code 起動し、外部としてコンテナに接続
開発環境への依存関係管理 コンテナ内にJava, Maven, Spring拡張を構築可能 ローカルPCにインストールして、各自で管理
拡張機能のインストール先 コンテナ内(例: Spring Boot拡張) ローカルPCにインストールして、各自で管理
OS・パス依存の問題 コンテナ内のLinuxベース環境で統一される WindowsやMacなどホストOSにより差異が出る
CI/CD との親和性 本番環境と近い状態で開発できる ローカル特有の差異が出る可能性あり

9. Dev Containerで起動-ビルドまで実行

(1). VS Codeでプロジェクトを開く
プロジェクト直下に .devcontainer/devcontainer.json があると、VS Codeが自動的に検知します。

(2). 「Reopen in Container」を選択
コマンドパレット(Ctrl+Shift+P)で「Dev Containers: Reopen in Container」を実行。
または、VS Code下部に表示されるボタンをクリックして、「Reopen in Container」を実行。

(3). 開発コンテナが自動でビルド・起動される
.devcontainer/Dockerfiledevcontainer.json の設定に基づいて、Docker上に開発用コンテナが立ち上がります。

(4). コンテナ内の環境で作業開始
VS Codeがコンテナ内にアタッチ(接続)され、その中でコード編集、ビルド、デバッグが可能になります。

(5). コンテナ内でアプリケーションをビルド&jar実行
VSCodeのterminalで下記のコマンドを実行してビルドとアプリの起動を行う。

./mvnw clean install
java -jar target/mydockersample-0.0.1-SNAPSHOT.jar

「BUILD SUCCESS」になれば完了

補足
mavenを使用
./mvnw : Maven Wrapperを使用(環境構築の簡略化。環境の統一のため)
clean : ルートディレクトリのtargetディレクトリ(ビルド成果物が置かれる場所)を削除
install : ローカルリポジトリにビルド成果物を登録

(6). アプリを動かす
http://localhost:8081」にアクセスしてweb画面を起動。
「Show Message」を押下してメッセージが出れば成功。

10. まとめ

この記事では、Docker Dev Containerを使って、Windows環境でJava (Spring Boot) とMySQLの開発環境を作る方法を紹介しました。

Dev Containerのすごいところは、誰でも全く同じ環境をサクッと作れる点です。

  • 新しいメンバーがチームに入っても、環境構築でつまずくことがなくなります。
  • PCに余計なソフトを入れずに済むので、いつもクリーンな状態を保てます。
  • 複数のプロジェクトを同時に進めても、バージョンの違いでトラブルになる心配がありません。
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?