スポンサーリンク

Dockerとdocker-composeでDjango×MySQL×Nginx環境を構築する方法

Docker
スポンサーリンク

本記事の対象の方

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で環境構築したい場合は下記をご覧ください。

Docker×docker-composeでDjango×PostgreSQL×Nginx環境を構築する手順
Dockerとdocker-composeを使用しDjangoの開発環境構築手順を紹介しています。DBにはPostgreSQL、WebサーバーにはNginxを使用しています。Pythonは3.9.6、PostgreSQLは13.4、Nginxは1.20.1です。WindowsとMacどちらも構築可能です。
スポンサーリンク

Dockerfileリポジトリをクローン

Django環境を構築用のDockerfileなどをgithubにあげていますのでそれをまずはCloneします。
下記がgithubのリポジトリです。

E-handson/docker-django
Contribute to E-handson/docker-django development by creating an account on 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コンテナで作成したMySQLに接続する方法【コンソール、MySQL Workbench、VScode】
Dockerコンテナで作成したMySQLにアクセスする方法を解説しています。コンソールでコマンド実行での接続方法、MySQL Workbenchの設定方法、VScodeでの接続方法を解説しています。一から手順を説明しています。docker-composeで作成したLaravel環境のDBコンテナを例に解説しています。ポートフォワディングの追加が必要です。
スポンサーリンク

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コンテナで構成しています。

  1. appコンテナ – Python3.8.5をインストールしているコンテナ
  2. dbコンテナ – MySQL8.0をインストールしているコンテナ
  3. 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

コメント