Django、django-allauthの環境をdocker composeで構築する

# 概要
- Docker compose で開発用の環境を構築します
- Djangoフレームワーク＋django-allauthパッケージをインストールします
- MySQLもインストールして、Djangoから使えるようにします

# 準備
- Dockerを使うので、Docker Desktop(Windows)などをインストールしておきます
- `requirement.txt` を作成します
```
Django~=5.0.6
django-allauth~= 0.63.2
requests
mysqlclient~=2.1.1
```


- `Dockerfile` を作成します
```
# Pythonの公式イメージを使用。バージョン3.12を指定。
FROM python:3.12

# 作業ディレクトリを設定
WORKDIR /app

# 必要なパッケージをインストール(vimを入れるかはお好みで)
RUN apt-get update && apt-get install -y \
    git \
    default-libmysqlclient-dev \
    build-essential \
    vim \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# 依存関係のあるPythonライブラリを記述したrequirements.txtをコンテナ内にコピー
COPY requirements.txt ./

# requirements.txtにリストされた依存関係をインストール
RUN pip install --no-cache-dir -r requirements.txt

# アプリケーションのソースコードをコンテナ内の作業ディレクトリにコピー
COPY . .

# ホストの5005番ポートをコンテナに公開
EXPOSE 5005

# デフォルトのシェルをbashに変更
SHELL ["/bin/bash", "-c"]

# コンテナが起動した際に実行されるコマンド
CMD ["bash"]
```

- `docker-comopse.yml` を作成します
```
services:
  web:
    build:
      context:
        ./
    volumes:
      - .:/app
    ports:
      - "5005:5005"
    tty: true
    depends_on:
      - db
    environment:
      DB_HOST: db
      DB_PASSWORD: mypassword123456

  db:
    image: mysql:8.3.0
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: dj01
      MYSQL_USER: dj01user
      MYSQL_PASSWORD: mypassword123456
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
```

- dockerコンテナをビルドして起動します
```
docker compose up -d --build
```

# Djangoプロジェクトの作成

- Dockerコンテナ内で、Djangoプロジェクトを作成します
```
docker exec -it django-fb-login-web-1 django-admin startproject dj_fb_login
```

- Djangoが自動起動するように、Dockerfileを書き換えます
```
--- a/Dockerfile
+++ b/Dockerfile
@@ -2,7 +2,7 @@
 FROM python:3.12

 # 作業ディレクトリを設定
-WORKDIR /app
+WORKDIR /app/dj_fb_login

 # 必要なパッケージをインストール
 RUN apt-get update && apt-get install -y \
@@ -26,6 +26,4 @@ EXPOSE 5000
 SHELL ["/bin/bash", "-c"]

 # コンテナが起動した際に実行されるコマンド
-CMD ["bash"]
+CMD python manage.py runserver 0.0.0.0:5005
```

- Dockerコンテナを停止して、再作成します
```
docker compose down
docker compose up -d --build
```

# MySQLへの接続設定

- MySQLを使えるように、`settings.py` にあるデータベースの設定を変更します
```
--- a/dj_fb_login/dj_fb_login/settings.py
+++ b/dj_fb_login/dj_fb_login/settings.py
@@ -75,8 +75,12 @@ WSGI_APPLICATION = "dj_fb_login.wsgi.application"

 DATABASES = {
     "default": {
-        "ENGINE": "django.db.backends.sqlite3",
-        "NAME": BASE_DIR / "db.sqlite3",
+        'ENGINE': 'django.db.backends.mysql',
+        'NAME': 'dj01',
+        'USER': 'dj01user',
+        'PASSWORD': 'admin1234',
+        'HOST': 'db',
+        'PORT': '3306',
     }
 }
```



- Dockerコンテナを停止して、再作成します
```
docker compose down
docker compose up -d --build
```







- DjangoのDBへのマイグレーションを行います
```
docker exec -it django-fb-login-web-1 python manage.py migrate
```

- Dockerコンテナを停止して、再作成します
```
docker compose down
docker compose up -d --build
```

# WEBブラウザで表示を確認

- WEBブラウザで、`http://localhost:5005/` にアクセスし、ロケットの画像が出ればOKです
```
The install worked successfully! Congratulations!
You are seeing this page because DEBUG=True is in your settings file and you have not configured any URLs.
```

- webサービスよりdbサービスが先に立ち上がってしまい、接続エラーになる場合は、DBのヘルスチェックを使って起動を確認します。docker-compose.ymlを修正して再起動します。
```

--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -10,7 +10,8 @@ services:
       - "5005:5005"
     tty: true
     depends_on:
-      - db
+      db:
+        condition: service_healthy
     environment:
       DB_HOST: db
       DB_PASSWORD: mypassword123456
@@ -25,7 +26,11 @@ services:
       MYSQL_PASSWORD: mypassword123456
       TZ: 'Asia/Tokyo'
     command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
-
+    healthcheck:
+          test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
+          interval: 20s
+          timeout: 10s
+          retries: 10

   phpmyadmin:
     image: phpmyadmin/phpmyadmin
```


# Djangoの管理者ユーザーの作成
```
docker exec -it django-fb-login-web-1 python manage.py createsuperuser
```
パスワードが短いと赤文字でメッセージが出ますが、バイパスできます。
```
Username (leave blank to use 'root'): admin
Email address: admin@example.com
Password:
Password (again):
The password is too similar to the username.
This password is too short. It must contain at least 8 characters.
This password is too common.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
```

# WEBブラウザで管理者ユーザーでログインできることを確認

- WEBブラウザで、`http://localhost:5005/admin` にアクセスし、上記で作成したIDとパスワードでログインできればOKです