🍣

Wsl2, DockerでDjangoの開発環境を構築!

2022/04/15に公開

環境

・Window 10
・Wsl2
・Docker version 20.10.13
・Docker Compose version v2.3.3
・Python 3
・Django Django>=3.0,<4.0
・Mysql 8.0

WSL2+Docker環境構築手順以下に参考してください。
https://zenn.dev/ttani/articles/wsl2-docker-setup

ディレクトリの構成

Django
   └── app
	├── docker-compose.yml
	├── mysql
	│   ├── Dockerfile
	│   └── my.cnf
	└── python
	    ├── Dockerfile
	    └── requirements.txt

ディレクトリの作成

<!-- プロジェクト用のディレクトリを作成(appディレクトリがdjangoプロジェクトのルートディレクトリ) -->
mkdir Django && cd Django
mkdir app && cd app

Django の設定

Dockerfileを作成する

mkdir python && cd python && touch Dockerfile

以下を入れる

# syntax=docker/dockerfile:1
FROM python:3
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/

# Expose ports.
EXPOSE 80
EXPOSE 443

python/requirement.txtを作成する

touch requirements.txt

以下を入れる

Django>=3.0,<4.0
mysqlclient
autopep8

docker-compose.yml への記述

touch docker-compose.yml

以下を入れる

services:
  db:
    build: ./mysql
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - db-store:/var/lib/mysql
    ports:
      - 3306:3306

  web:
    build: ./python
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    environment:
      - MYSQL_USER=django_user
      - MYSQL_DATABASE=django_local
      - MYSQL_PASSWORD=secret
      - MYSQL_ROOT_PASSWORD=secret
    depends_on:
      - db
volumes:
  db-store:

MySQL の設定

dockerfileを作成する

mkdir mysql && cd mysql && touch 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

my.cnfを作成する

touch 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

コンテナを起動 & ブラウザで確認

以下のコマンドを実行し、Docker サービスを構築する。

$ docker-compose build

もし以下のようなエラーが出た場合は

=> ERROR [app_app internal] load metadata for docker.io/library/python:3             
=> ERROR [app_db internal] load metadata for docker.io/library/mysql:8.0           
------
 > [app_app internal] load metadata for docker.io/library/python:3:
------
------
 > [app_db internal] load metadata for docker.io/library/mysql:8.0:
------
failed to solve: failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to authorize: rpc error: code = Unknown desc = failed to fetch anonymous token: Get "https://auth.docker.io/token?scope=repository%3Alibrary%2Fmysql%3Apull&service=registry.docker.io": net/http: TLS handshake timeout

解決方法2つがあります。

Docker Desktop → 設定 → Docker Engine

1. docker.io を insecure-registries に追加
{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "debug": false,
  "experimental": false,
  "features": {
    "buildkit": true
  },
  "insecure-registries": [
    "docker.io"
  ],
  "registry-mirrors": []
}
2. buildkit を false に設定
{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "debug": false,
  "experimental": false,
  "features": {
    "buildkit": false
  },
  "insecure-registries": [],
  "registry-mirrors": []
}

Save & Restart

Django プロジェクトの実行

docker-compose run web django-admin startproject django_app .

以下のコマンドを実行し、コンテナを立ち上げる。

docker-compose up -d

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

MySQL の設定

django_app/ 配下にある settings.py を編集します。

変更前

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 web ./manage.py migrate

これで Docker での Django + MySQLの開発環境構築は完了です。

Enjoy!!!

Discussion