本記事の対象の方
docker-composeでDjango環境を構築をしたい方
最短でDjangoアプリ開発をしたい方向けに記事を書いていますのでDocker構成などをしっかり学びたい方向けではありません。
とはいえ、多少構成の説明はしたいと思いますので知りたい方だけ記事の後半を御覧いただければと思います。
ローカルで用意する環境
- Docker 20.10
- docker-compose 1.27.4
- git 2.25
※バージョンはインストール時の最新版ですので現在の最新版とは差異があるかもしれません
Dockerとdocker-composeをインストールされていない方
Macの方
まずは下記公式サイトからDocker Desktopをインストールしてください
ターミナルを起動後、下記コマンドでDockerとdocker-composeのバージョンを確認してみましょう。確認できたらOKです。
$ docker --version
Docker version 20.10.1, build 831ebea
$ docker-compose --version
docker-compose version 1.27.4, build 40524192
※gitについてはMacは最初から入っていると思いますが最新版にしたい場合は各自でお願いいたします。
Windowsの方
MacよりDocker環境の構築がややこしいので記事にまとめております。
下記を御覧ください。
gitについては下記コマンドでインストールできます。
$ sudo apt-get install git
docker-composeで構築する環境
- Django 3.1 (Python 3.8.5)
- MySQL 8.0
- Nginx 1.18
PostgreSQLで環境構築したい場合は下記をご覧ください。

Dockerfileリポジトリをクローン
Django環境を構築用のDockerfileなどをgithubにあげていますのでそれをまずはCloneします。
下記がgithubのリポジトリです。
まずはターミナルを起動してください。
下記コマンドを実行します。
$ git clone https://github.com/E-handson/docker-django.git
cloneに成功したら「docker-django」ディレクトリが作成されます。
作成されたディレクトリに移動しましょう。下記コマンドを実行します。
$ cd docker-django
docker-django配下にはdocker-compose.ymlがあると思います。
docker-composeコマンドはdocker-compose.ymlがあるディレクトリ直下で実行できます。
Dockerサービスの立ち上げ
まずはDockerサービスを構築するために下記コマンドを実行します。
$ docker-compose build
次にDockerサービスを起動するために下記コマンドを実行します。
$ docker-compose up
サービスが立ち上がったかを確認するコマンドがありますので実行してみましょう。
$ docker-compose ps Name Command State Ports --------------------------------------------------------------------------------------------- docker-django_app_1 uwsgi --socket :8001 --mod ... Up 8001/tcp docker-django_db_1 docker-entrypoint.sh --def ... Up 3306/tcp, 33060/tcp docker-django_web_1 /docker-entrypoint.sh ngin ... Up 80/tcp, 0.0.0.0:8000->8000/tcp
Nameがコンテナ名になります。
docker-django_app_1 → Pythonが入っているコンテナ
docker-django_db_1 → MySQLが入っているコンテナ
docker-django_web_1 → Nginxが入っているコンテナ
Stateという列がUpになっていたらそのコンテナが起動しているということになります。
これでDockerの立ち上げは完了です。
Djangoのインストール
appコンテナにDjangoをインストール
下記コマンドを実行します。
$ docker-compose exec app django-admin.py startproject app .
成功するとsrcディレクトリが作成されています。llコマンドで確認してみましょう。
$ ll drwxrwxr-x 8 user user 4096 Dec 24 01:43 .git/ -rw-rw-r-- 1 user user 486 Dec 24 01:43 README.md drwxrwxr-x 5 user user 4096 Dec 24 01:43 docker/ -rw-rw-r-- 1 user user 719 Dec 24 01:43 docker-compose.yml drwxr-xr-x 3 root root 4096 Dec 24 01:46 src/
一番下のsrc配下にDjangoのソースファイルが作成されています。
では実際にブラウザで確認してみましょう。一度Docker環境をリスタートさせます。
$ docker-compose restart
その後、下記URLにアクセスしてみてください。
Djangoのウェルカムページが表示されれば正常にインストールが完了しています!
http://localhost:8000/
MySQLの設定
src/app/配下にあるsettings.pyを編集していきます。
76行目あたりに下記の編集前の記述があるかと思います。そこを編集後のように修正してください
編集前
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } }
編集後
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'django_local', 'USER': 'django_user', 'PASSWORD': 'secret', 'HOST': 'db', 'POST': 3306 } }
下記コマンドを実行します。
$ docker-compose exec app ./manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
:
:
接続に成功しているとmigrateが実行されてMySQLに認証系などのテーブルが作成されます。
これで開発環境構築は完了です!
ちなみにdockerで構築したMySQLに外部から接続する方法を下記で紹介していますので参考にしてみてください。

Docker構成の説明
ここからはDocker構成の説明になります。興味のある方だけ御覧いただければと思います
リポジトリ構成
まずは今回使用したリポジトリ構成を紹介します。
docker-django ├── docker-compose.yml ├── docker │ ├── mysql │ │ ├── Dockerfile │ │ └── my.cnf │ ├── nginx │ │ ├── default.conf │ │ └── uwsgi_params │ └── python │ ├── Dockerfile │ └── requirements.txt └── src
./srcディレクトリはgit cloneした段階では存在していません。
Djangoをインストールした後に作成されます。
コンテナの構成
「docker-compose ps」で確認した通り今回は3コンテナで構成しています。
- appコンテナ – Python3.8.5をインストールしているコンテナ
- dbコンテナ – MySQL8.0をインストールしているコンテナ
- webコンテナ – Nginx1.18をインストールしているコンテナ
appコンテナ
実際にDjangoをインストールしているのもこのコンテナです。
appコンテナの/workspace配下にインストールしたDjangoのソースはローカルのsrc/配下にマウントされています。
平たく言えば同期しているということですね。
そのため./src配下のファイルを編集すると実際にDjangoを動かしている/workspace配下のソースにも反映されるということになります。
編集する場合は./src配下を修正してももちろん良いですがおすすめはVS codeを使用してコンテナ側の/workspace配下を修正する方法です。
詳細は下記ブログに記載していますので興味がある方は御覧ください。
またrequirements.txtにpipでインストールしたいパッケージを記述することでbuildしなおした際にコンテナにインストールされます。
dbコンテナ
「MySQLの設定」の手順の際にMySQLに接続をしましたが、先ほどの接続先はこのコンテナのMySQLになります。
下記設定でユーザーとDBをbuild時に作成しています。
DB名:django_local DBユーザー:django_user password:secret
webコンテナ
ローカル側のdefault.confに設定を記述しています。
そのファイルをコンテナ側にマウント(同期)しています。
またUWSGIの設定もwebコンテナにマウント(同期)しています。
おまけ
docker-composeコマンドの紹介
$ docker-compose up #コンテナの起動 $ docker-compose stop #コンテナの停止 $ docker-compose restart #コンテナの停止 $ docker-compose exec app bash #appコンテナのコンソールにアクセス $ docker-compose exec db bash #dbコンテナのコンソールにアクセス $ docker-compose exec web ash #webコンテナのコンソールにアクセス
$ docker-compose exec app ./manage.py migrate #マイグレーション実行 $ docker-compose exec app ./manage.py makemigrations #マイグレーション作成
上記2つはdocker-compose exec app bashでコンソールにアクセスしてから下記コマンドでも可能です。
$ docker-compose exec app bash #コンテナのコンソールアクセス後 root@ec0d92329eda:/workspace# ./manage.py migrate root@ec0d92329eda:/workspace# ./manage.py makemigrations
コメント