このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Docker超入門:開発環境コンテナ:Django+MySQL①

🐳 開発環境コンテナ:Django+MySQL①

今回は Docker Compose を使って、Django+MySQLの開発環境コンテナを構築していきます。
 この構成は「Webアプリ(Django)」+「データベース(MySQL)」という、王道のセットアップです!

記事は2部構成になっています👇

🐍 Djangoとは?

Django(ジャンゴ)は、Pythonで書かれた人気の高いWebアプリケーションフレームワークです。
「フルスタック型」と呼ばれるタイプで、Webアプリに必要な機能がすべてそろっています。

特徴説明
フルスタック構成認証、管理画面、テンプレートなどを標準で装備。
高速開発最小限のコードで動くWebアプリをすぐ作れる。
MTVアーキテクチャModel(データ構造)、Template(見た目)、View(処理)を分離して開発しやすい。

Django公式サイトはこちら:
🔗 https://www.djangoproject.com/

🐬 MySQLとは?

MySQLは、世界中で最も利用されているオープンソースのデータベースです。
WordPressやYouTubeなど、多くの有名サービスでも採用されています。

特徴説明
高速・軽量大規模なデータ処理でも安定した性能。
オープンソース無料で利用でき、商用利用もOK。
高い信頼性Oracle社のサポートにより継続的に更新。

MySQL公式サイトはこちら:
🔗 https://www.mysql.com/jp/

⚙️ Djangoコンテナの作成

ここからは、DjangoとMySQLのコンテナをDocker Composeで構築していきます。
「compose.yaml」を作成して、DjangoとMySQLコンテナを作成します。

 今回はDocker Hub上に新しいDjangoイメージがなかったため、Pythonベースの独自イメージを作成します。

DjangoはPythonで動作するため、Pythonイメージをベースにして必要なライブラリを追加します👇

手順コマンド内容
pip install DjangoDjangoをインストール
pip install mysqlclientMySQL接続用ライブラリをインストール

この2つを自動的に導入する オリジナルDockerイメージ を作成していきます。

🧹 作業前のクリーンアップ

古いコンテナや未使用のイメージが残っていると、思わぬトラブルの原因になります。
まずはDocker環境を整理して、スッキリした状態から始めましょう。

docker system prune -a --volumes
コマンド説明
docker system prune不要なコンテナやネットワーク、キャッシュを削除します。
-aすべての未使用イメージを含めて削除します。
--volumes未使用のボリュームも削除します。

💬 ワンポイント

「思い切ってリセットしたいとき」に便利です。
ただし、必要なイメージも消える可能性があるので注意してくださいね。

実行結果

PS C:\Users\joeac> docker system prune -a --volumes
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all anonymous volumes not used by at least one container
  - all images without at least one container associated to them
  - all build cache

Are you sure you want to continue? [y/N] y

📁 作業用ディレクトリを作成しよう

Docker Composeを使うには、compose.yaml があるディレクトリで作業する必要があります。
まずはプロジェクト用フォルダを作って、そこに移動します。

cd desktop/docker
mkdir django2
cd django2

実行結果

PS C:\Users\joeac> cd desktop/docker
PS C:\Users\joeac\Desktop\docker> mkdir django2

    Directory: C:\Users\joeac\Desktop\docker

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2025/10/18    22:19                django2

PS C:\Users\joeac\Desktop\docker> cd django2
PS C:\Users\joeac\Desktop\docker\django2>

このディレクトリに、Dockerfilecompose.yaml を作成していきます。

🧱 Dockerfileの作成

VSCodeを開いて、新しく Dockerfile を作りましょう。

code Dockerfile

以下の内容を入力して保存します👇

FROM python:3.10
WORKDIR /code
ADD requirements.txt /code
RUN pip install -r requirements.txt
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
指定項目説明
FROM python:3.10Python 3.10の公式イメージをベースにする。
WORKDIR /code作業ディレクトリを /code に設定。
ADD requirements.txt /code依存関係リストをコンテナにコピー。
RUN pip install -r requirements.txtDjangoやMySQLライブラリをインストール。
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]Django開発サーバーを起動。

💬 ポイント

requirements.txt に必要なライブラリをまとめておくと、後で環境を再現しやすくなります。

📦 requirements.txt の作成

次に、Pythonで使うライブラリをまとめた requirements.txt を作成します。

code requirements.txt

内容は以下の通りです👇

Django==4.0.2
mysqlclient
ライブラリ説明
DjangoWebアプリケーションフレームワーク。
mysqlclientPythonからMySQLへ接続するためのライブラリ。

⚙️ compose.yaml の作成

次に、DjangoとMySQLを一緒に動かすための compose.yaml を作ります。

ここでは、Docker Composeを使って Django+MySQL の開発環境を構築します。
 特にコンテナ間の連携を安定させるために重要なhealthcheckdepends_oncommand の3つの設定を詳しく解説します。

code compose.yaml

以下のように編集して保存します👇

version: "3.9"

services:
  mysql:
    image: mysql:8.0
    container_name: mysql_container
    environment:
      MYSQL_ROOT_PASSWORD: root-pass
      MYSQL_DATABASE: test-db
      MYSQL_USER: test-user
      MYSQL_PASSWORD: test-pass
    volumes:
      - db-data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 5s
      timeout: 3s
      retries: 5
      start_period: 5s

  django:
    build: .
    container_name: django_container
    depends_on:
      mysql:
        condition: service_healthy
    ports:
      - "8000:8000"
    volumes:
      - ./:/code
    command: >
      python manage.py runserver 0.0.0.0:8000

volumes:   # 👈 services: と同じ階層に置く(ここが重要)
  db-data:

この設定では、
MySQLコンテナ → Djangoコンテナ」の順で確実に起動し、
MySQLが正常に稼働したことを確認してからDjangoを起動するようになっています。
その鍵を握るのが healthcheckdepends_on の連携です。

🩺 healthcheck とは?

healthcheck は、コンテナの内部状態を自動的に確認するための機能です。
単にコンテナが“起動している”だけでなく、“アプリが実際に動作可能か”を監視します。

 DjangoとMySQLを連携させる際、MySQLの起動が完全に完了する前にDjangoが接続を試みると失敗します。
そのため、healthcheck によって「MySQLが応答可能な状態かどうか」を定期的にチェックします。

🧠 設定内容の詳細解説
healthcheck:
  test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
  interval: 5s
  timeout: 3s
  retries: 5
  start_period: 5s
項目説明
testヘルスチェックで実行するコマンド。MySQLに ping を送って応答を確認します。
intervalチェックの間隔(5秒ごとに実行)。
timeout応答が返るまでの待ち時間。3秒以内に応答がなければ失敗とみなします。
retries失敗を何回繰り返したら「不健康」と判断するか。ここでは5回。
start_period初回起動時の猶予期間。MySQLが立ち上がるまで5秒待ってからチェックを開始。

💡 ポイント

 mysqladmin ping はMySQLサーバに軽い通信を行い、「mysqld is alive」という応答が返ってくれば正常です。
これが失敗した場合、Composeは「このコンテナはまだ健康状態ではない」と判断します。

🔗 depends_on とは?

depends_on は、コンテナの起動順序依存関係を指定する設定です。
 DjangoがMySQLに依存しているため、MySQLが「起動してから」Djangoを起動させる必要があります。

Composeの旧仕様(v2以前)では、
「MySQLコンテナの起動完了=Django起動OK」と判断されていましたが、
実際にはMySQLが応答可能(healthy)になるまで数秒かかることがあります。

この問題を解決するために、
depends_oncondition: service_healthy を追加します。

🧠 設定内容の詳細解説
depends_on:
  mysql:
    condition: service_healthy
項目説明
depends_onDjangoが依存するサービスを定義します。
mysql依存対象のサービス名(MySQLコンテナ)。
condition: service_healthyMySQLコンテナが healthy 状態になるまで待機。

💡 ポイント

service_healthyhealthcheck の結果と連動します。
MySQLがまだ「unhealthy」の場合、Djangoの起動は待機状態となります。
これにより、Djangoが「接続エラー」で落ちることを防ぎます。

🔁 動作の流れ

ステップコンテナ状態説明
MySQLstarting起動中。healthcheck開始まで待機。
MySQLhealthy応答確認済み。「mysqld is alive」応答あり。
DjangostartingMySQLがhealthyになった時点で起動開始。
Djangorunning正常稼働。DB接続成功。

💬 command とは?

command は、コンテナ起動時に実行されるコマンドの上書き設定です。
 Dockerfile内で CMD を定義していても、Composeファイルの command に記述した内容が優先されます。

Djangoの場合、開発用サーバを起動するために以下を指定します。

command: >
  python manage.py runserver 0.0.0.0:8000
コマンド要素説明
python manage.pyDjangoプロジェクトの管理コマンドを実行するツール。
runserverDjangoの開発用Webサーバを起動するサブコマンド。
0.0.0.0:8000コンテナ内の全てのネットワークインターフェースでポート8000を待ち受け。

💡 補足

これを指定することで、ホスト(WindowsやMac)から
http://localhost:8000 にアクセスしてDjangoを確認できます。

🖥️ 動作の仕組み

コンテナが起動すると、次の流れで処理されます。

  1. MySQLコンテナが healthcheck で監視される。
  2. MySQLが healthy 状態になる。
  3. Djangoコンテナが起動(depends_on により制御)
  4. Djangoが python manage.py runserver 0.0.0.0:8000 を実行
  5. ブラウザから localhost:8000 にアクセスするとDjangoのTOPページが表示

✅ 要約

設定項目役割主な効果
healthcheckMySQLの動作状態を定期確認DBが完全に起動するまでの待機制御
depends_onDjangoとMySQLの起動順序制御Django起動をMySQLの健康状態に連動
commandDjangoサーバの起動コマンド指定ブラウザから即アクセス可能にする。

これら3つを組み合わせることで、
MySQLが確実に起動→Djangoが安全に接続→Webサーバが正常動作
という安定した開発環境が構築できます。

✅ まとめ

ここまでで、以下の準備が完了しました👇

ステップ内容
Docker環境をクリーンアップ
プロジェクトディレクトリを作成
Django用 Dockerfile を作成
依存関係ファイル requirements.txt を準備
Django+MySQL の compose.yaml を定義

この続きは「開発環境コンテナ:Django+MySQL②」で、
Djangoプロジェクトを実際に作成して、Djangoコンテナを作成して接続していきます。