Django × MySQL × Dockerでチュートリアルをしてみる

## はじめに
友人とこれからのアプリ開発について話したり、ハッカソンでオススメを聞いたり、ネットに転がっている教材をみて...
**Django**
に決定されたので、環境構築をしてチュートリアルをしてみようと思います。

## 参考にしたURL

https://book-reviews.blog/build-django-mysql-environment-with-docker-compose/

https://docs.djangoproject.com/ja/5.0/intro/tutorial01/

## 本記事の前提条件

- windows10
- Dockerインストール済み
- VScode

## さっそく環境構築

**0 - 環境構築したいフォルダをVScodeで開く**
**1 -  `Dockerfile`　`requirements.txt`　`docker-compose.yml`を作成する**
**2 -  `Dockerfile`を編集する**

```dockerfile
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
```
**3 - `requirements.txt`を編集する**

```bash
Django>=3.0,<4.0
psycopg2
mysqlclient
```
**4 - `docker-compose.yml`を編集する**

```bash
version: '3'

services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: 'django'
      MYSQL_PASSWORD: 'django'
      MYSQL_DATABASE: 'django'
    ports:
      - 3306:3306
    volumes:
      - mysql:/var/lib/mysql
  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    links:
      - db

volumes:
  mysql:
    driver: local
```

**5 - imageをbuildする**

VScode上で **Ctrl + @** を押し、ターミナルを開きます

```bash
docker compose build
```

**6 - コンテナを定義する**

```bash
docker compose run web django-admin.py startproject <プロジェクトの名前> .
```
**7 - コンテナを起動する**

```bash
docker compose up
```
VScodeの ターミナル にある+ボタンを押して新しくターミナルを作る
一度、以下のコマンドでコンテナを閉じる

```bash
docker compose down
```

**8 - **setteings.py**をMySQLの設定に変更する**

以下のように変更
```bash
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',
        'USER': 'django',
        'PASSWORD': 'django',
        'HOST': 'db',
        'PORT': 3306,
    }
}
```

**9 - データベースをマイグレーションする**

VScodeの **ターミナル** にある`+ボタン`を押して新しくターミナルを作り以下を入力する

```bash
docker-compose exec web python manage.py migrate
```

**10 -　再度imageをbuildし、コンテナを立ち上げる**

VScode上で **Ctrl + @** を押し、ターミナルを開きます

```bash
docker compose build
```
```bash
docker compose up
```

http://localhost:8000/

![last.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989040/c09e7e04-6c79-e3c0-8348-38b34644f6c3.png)

## Djangoのチュートリアルをしてみる

ここからはこちらに入る

https://docs.djangoproject.com/ja/5.0/intro/tutorial01/#creating-the-polls-app

**0 - Pollsフォルダを作る**

現状の立ち上がっているコンテナを確認する

```bash
docker container ls
```
<details><summary>実行結果</summary>

```bash
CONTAINER ID   IMAGE                     COMMAND        
           CREATED          STATUS          PORTS
NAMES
c4adc638d485   docker-django-mysql-web   "python3 manage.py r…"   58 minutes ago   Up 58 minutes   0.0.0.0:8000->8000/tcp              docker-django-mysql-web-1

949ac86dac2d   mysql:5.7                 "docker-entrypoint.s…"   59 minutes ago   Up 59 minutes   0.0.0.0:3306->3306/tcp, 33060/tcp   docker-django-mysql-db-1 
```
</details>

**1 - コマンドを実行する時**

私の場合は`docker-django-mysql-web-1`にDjangoが入っているので、こちらのコンテナにアクセスし、pollsフォルダを作成する

:::note warn
今回は、pollsフォルダを作成していますが、それ以外のコマンドを実行する時も、コンテナに入ってから実行してください
:::

```bash
docker exec -it docker-django-mysql-web-1 /bin/bash

root@c4adc638d485:/code# python manage.py startapp polls

root@c4adc638d485:/code# exit
exit
```

**ここからはチュートリアルに従ってください。**

:::note warn
開いているチュートリアルのページが終わったら次は、こちらからチュートリアルを続けてください

https://docs.djangoproject.com/ja/5.0/intro/tutorial02/#creating-models

チュートリアルでは、`mysite/settings.py`などがありますが、
**6 - コンテナを定義する**
ここで設定したプロジェクトの名前が当たっており`<プロジェクトの名前>/settings.py`になっていると思います
:::