Docker で Django + MySQL + Nginx の環境構築をする
こんにちは、おおとろ(@digiangler)です。
Python の勉強をしていて、何かしらの Web アプリを Django というフレームワークを使って作成したい方向けの note になります。
今年から Docker で環境構築をするようになって、コンテナ型仮想化の方が従来のホスト型仮想化よりも圧倒的に動作が軽いですし、環境構築・環境の共有も簡単です。
ですので、プログラミング初学者の方にも Docker で開発環境を作成してみましょう。
自分の備忘録としても。
Docker とは
アプリケーションの実行環境を構築するためのツールです。
環境構築を進めるうえで、コンテナとイメージ、Docker Hub、Dockerfile を最低限理解しておけば、簡単な環境構築は進められます。
詳細については、ネットで調べればたくさん情報がありますので今回は省きます。
Django とは
Python で実装された Web アプリケーション・フレームワークです。
コンテンツ管理システムや Wiki からソーシャルネットワーク、ニュースサイトなど、高品質な Web アプリケーションを簡単に、少ないコードで作成することができます。
環境
私の環境はこんな感じです。
🖥 ローカル環境
✔ macOS Big Sur
✔ Docker 20.10.8
✔ docker-compose 1.29.2
✔ git 2.33.0
✔ github 2.14.2
🎯 作成する環境
✔ Python 3.9.5
✔ MySQL 8.0
✔ nginx 1.21.3
※ バージョンはインストール時の最新版となります。
ディレクトリ構成
Python、Nginx、MySQL で構成を分けておきます。
django-app
├── docker-compose.yml
├── mysql
│ ├── Dockerfile
│ └── my.cnf
├── nginx
│ ├── default.conf
│ └── uwsgi_params
└── python
├── Dockerfile
└── requirements.txt
appコンテナ(Python)
dbコンテナ(MySQL)
webコンテナ(Nginx)
Django の設定
python/Dockerfile の作成をします。
FROM python:3.9.5
ENV PYTHONUNBUFFERED 1
RUN mkdir /workspace
WORKDIR /workspace
ADD requirements.txt /workspace/
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
ADD . /workspace/
python/requirement.txt の作成をします。
Django==3.2.7
uwsgi==2.0.19
mysqlclient
autopep8
docker-compose.yml への記述
書き方は色々あるので、参考程度で。
詳細については、ネットで調べればたくさん情報がありますので今回は省きます。
version: "3.8"
services:
db:
build: ./docker/mysql
command: --default-authentication-plugin=mysql_native_password
volumes:
- db-store:/var/lib/mysql
web:
image: nginx:1.21.3-alpine
ports:
- 8000:8000
volumes:
- ./src:/workspace
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
- ./docker/nginx/uwsgi_params:/etc/nginx/uwsgi_params
working_dir: /workspace
depends_on:
- app
app:
build: ./docker/python
command: uwsgi --socket :8001 --module app.wsgi --py-autoreload 1 --logto /tmp/tmp.log
volumes:
- ./src:/workspace
expose:
- "8001"
depends_on:
- db
volumes:
db-store:
MySQL の設定
mysql/Dockerfile の作成をします。
FROM mysql:8.0
ENV MYSQL_DATABASE=django_local \
MYSQL_USER=django_user \
MYSQL_PASSWORD=secret \
MYSQL_ROOT_PASSWORD=secret \
TZ=Asia/Tokyo
COPY ./my.cnf /etc/mysql/conf.d/my.cnf
RUN chmod 644 /etc/mysql/conf.d/my.cnf
mysql/my.cnf の作成をします。
[mysqld]
default-authentication-plugin = mysql_native_password
character_set_server = utf8mb4
collation_server = utf8mb4_0900_ai_ci
# timezone
default-time-zone = SYSTEM
log_timestamps = SYSTEM
# Error Log
log-error = mysql-error.log
# Slow Query Log
slow_query_log = 1
slow_query_log_file = mysql-slow.log
long_query_time = 1.0
log_queries_not_using_indexes = 0
# General Log
general_log = 1
general_log_file = mysql-general.log
[mysql]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
Nginx の設定
nginx/uwsgi_params の作成をします。
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
nginx/default.conf の作成をします。
upstream django {
ip_hash;
server app:8001;
}
server {
listen 8000;
server_name 127.0.0.1;
charset utf-8;
location / {
uwsgi_pass django;
include /etc/nginx/uwsgi_params;
}
}
server_tokens off;
コンテナを起動 & ブラウザで確認
以下のコマンドを実行し、Docker サービスを構築する。
$ docker-compose build
以下のコマンドを実行し、コンテナを立ち上げる。
$ docker-compose up -d
これで Docker の立ち上げは完了です。
Django プロジェクトの実行
コンテナに Django をインストールする。
$ docker-compose exec app django-admin.py startproject app .
成功すると src/ ディレクトリが作成されています。
ターミナルで確認しよう。
src/ 配下にDjangoのソースファイルが作成されています。
コンテナを再起動
以下のコマンドを実行し、コンテナ再起動します。
$ docker-compose restart
下記 URL にアクセスして Django のページが表示されれば、正常にインストールが完了です。
MySQL の設定
src/app/ 配下にある settings.py を編集します。
デフォルトだと SQLite の設定になっています。これを MySQL の設定に変更します。
# 変更前
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
接続に成功していると migrate が実行されて MySQL に認証系などのテーブルが作成されます。
これで Docker での Django + MySQL + Nginx の開発環境構築は完了です。
ここから先は、それぞれカスタマイズして Django アプリを開発していきましょう。
最後まで、読んで頂きありがとうございました❗
読んだ証明として、1 日 1 回クリックをお願い致します m(_ _)m
👇
人気ブログランキング
それでは、また。
是非、感想をコメントや SNS でくださると嬉しいです。
Twitter: @digiangler
Instagram: @digi_angler
また、スキボタンを ”こっそり” 押したり、サポートしてくださるのも、とても嬉しいです。
"こっそり" Twitter からのリツイートでの感想もくださると嬉しいです。
よろしければサポートよろしくお願い致します。頂いたサポートはライターとしての活動費に使わせて頂きます❗m(_ _)mまた、感想のツイートやリクエスト、ぜひぜひお寄せください(*⌒▽⌒*)