見出し画像

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/ ディレクトリが作成されています。

ターミナルで確認しよう。

画像2

src/ 配下にDjangoのソースファイルが作成されています。


コンテナを再起動

以下のコマンドを実行し、コンテナ再起動します。

$ docker-compose restart

下記 URL にアクセスして Django のページが表示されれば、正常にインストールが完了です。

http://localhost:8000

画像3


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
👇
人気ブログランキング

それでは、また。

画像1

是非、感想をコメントや SNS でくださると嬉しいです。

Twitter: @digiangler
Instagram: @digi_angler

また、スキボタンを ”こっそり” 押したり、サポートしてくださるのも、とても嬉しいです。

"こっそり" Twitter からのリツイートでの感想もくださると嬉しいです。

よろしければサポートよろしくお願い致します。頂いたサポートはライターとしての活動費に使わせて頂きます❗m(_ _)mまた、感想のツイートやリクエスト、ぜひぜひお寄せください(*⌒▽⌒*)