DockerでDjango3+MySQL8の環境を構築する

#はじめに

初投稿です。
Dockerでdjango3+mysql8の環境を構築しようとした時に少しハマったので備忘録的な感じで書いていきます。
※dockerについては詳しく説明~~できません~~しません。

#環境
##### ローカル環境
- OS：macOS Big Sur
- Docker Desktop
 - docker version: 20.10.7
 - docker-compose version: 1.29.2

##### 作成する環境
- Django=3.2
- MySQL=8.0.13

#環境構築
## フォルダの作成
```console:console
mkdir docker-django-mysql8
cd docker-django-mysql8
touch Dockerfile docker-compose.yml requirements.txt
```

こんな感じのディレクトリ構成になります

```
docker-django-mysql8
   |-- Dockerfile
   |-- docker-compose.yml
   |-- requirements.txt
```

## 各ファイルの作成
####requirements.txt
まず、requirements.txtを作成します。
pip install したいパッケージを記載します。

```text:requirements.txt
Django==3.2 
mysqlclient==1.4.6
```

####Dockerfile
次にDockerを作成します。

```dockerfile:Dockerfile
# python3のイメージを指定
FROM python:3  　
# バッファリングを無効化
ENV PYTHONUNBUFFERED 1　
# 直下にcodeディレクトリを作成
RUN mkdir /code
# codeディレクトリに移動
WORKDIR /code
# codeディレクトリにrequirements.txtのコピーを配置
COPY requirements.txt /code/
# pipをupgradeしてrequirements.txtに記載したパッケージをインストールする
RUN pip install --upgrade pip && pip install -r requirements.txt
# docker-django-mysql8下のファイルをcodeディレクトリにコピー
COPY . /code/
```

####docker-compose.yml
最後にdocker-compose.ymlを作成します。
mysqlのイメージは提供されているものをそのまま使うためDockerfileを作成しません。

```yml:docker-compose.yml
version: '3'
services:
  web:
    container_name: docker-django
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    working_dir: /code
    ports:
      - 8000:8000
    volumes:
      - .:/code  #カレントディレクトリを/codeにマウント
    depends_on:
      - db
  db:
    container_name: docker-django-db
    image: mysql/mysql-server:8.0.13-1.1.8
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_DATABASE: django
      MYSQL_USER: django
      MYSQL_PASSWORD: django
      MYSQL_ROOT_PASSWORD: django
      TZ: 'Asia/Tokyo'
    #codeディレクトリの/var/lib/mysqlをカレントディレクトリにマウント
    volumes:
      - ./mysql:/var/lib/mysql 

```
必要なファイルの作成は以上でOKです

```yml:docker-compose.yml
command: --default-authentication-plugin=mysql_native_password
```
このコードですが、mysql8からはログイン認証パスワード方式がデフォルトで"caching_sha2_password"に変更されており、それを従来の方式である"mysql_native_password"にdocker-compose.ymlで変更するためものです。

##コンテナを立ち上げる
dockerfileとdocker-compose.ymlが作成できたのでそれを元にコンテナを作成します。

```
docker-compose run web django-admin.py startproject project .
```
最後に "." をつけることを忘れないでください。
また、"project" はプロジェクト名になりますので自由に変更してください。
このコマンドを実行するとdockerfileがあるディレクトリと同階層にファイルとディレクトリが作成されていると思います。
確認してみましょう。

```console:console
ls
docker-compose.yml   Dockerfile   manage.py   mysql   project   requirements.txt
```
以上のような構成になっていることが確認できると思います。
次に、project下にあるsettings.pyのDATABASESを変更します。

```python:project/settins.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',
        'USER': 'django',
        'PASSWORD': 'django',
        'HOST': 'db',
        'PORT': 3306,
    }
}
```
これで環境が構築できているはずです。
コンテナを立ち上げてみましょう。

```
docker-compose up
```
http://127.0.0.1:8000 にアクセスすると、Djangoのトップページが確認できると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614161/7103c14d-5b90-0018-5905-2360b906a568.png)

これで環境構築は終了です。

#最後に
最後まで見ていただきありがとうございました。
もし間違っている点などがあったら是非指摘していただきたいです。
問題ないようでしたらLGTMお願い致します。

また、この後のアプリの作成方法やもっと詳しく解説してほしい点など質問やお願いがありましたらお気軽にコメントお願い致します。
頑張って答えます。

ありがとうございました。

【参考】
http://hananohana.work/posts/docker_django_mysql/