【初心者】Docker+Django+MySQLで環境構築

Webアプリケーション開発のPF制作の為
その土台となる環境構築をやりましたので投稿します。

既に何人もの人が記事を投稿しているとは思いますが
忘れないために投稿します。


# 概要

Dockerのコンテナ技術を用いて、DjangoとMySQLを起動させます。
初心者が入門書と公式ドキュメント、その他ネット記事を読んで完成させました。
抜けている部分や間違っている部分があるかもしれません。
もし間違っている部分がありましたら、コメントいただけますと幸いです。
躓いた所はなるべく書いていきます。


筆者環境とスタート地点
・windows10 Home
・WSL2導入済
・Docker導入済
・VisualStudioCode導入済(主にこちらのターミナル上で操作しています)

上記にも書いた通りDockerの導入部分は省略し
dockerが使えるという状態からのスタートです。


## 手順

**１.空のディレクトリを用意し、その中に3つのファイルを作成。**



```
ディレクトリ(任意の名前)
├─Dockerfile
├─requirements.txt
└─compose.yaml
```

こんな感じです。とりあえずなのでデスクトップ上に作成しました。
それぞれ中身をVScodeで書いていきます。

・Dockerfile
```
FROM python:3.10
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code
RUN pip install -r requirements.txt
COPY . /code/
```
Dockerfileはイメージを作成するものです。
このイメージを元にコンテナが作られます。
ちなみにちゃんと「Dockerfile」と書かないと手順2でエラーくらいます。

・requirements.txt
```
Django
mysqlclient
```
DjangoとMySQLをインストールしてね！と上記テキストファイルに書きます。
ちなみにバージョンは指定しなくてもいけます。

・compose.yaml
```
version: "3"
services:
 web:
   container_name: "任意の名前"
   build: .
   command: python manage.py runserver 0.0.0.0:8000
   working_dir: /code
   ports:
     - 8000:8000
   volumes:
     - .:/code
   depends_on:
     - db
 db:
    container_name: "任意の名前(上記の任意の名前とは被らないように)"
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: 任意のパスワード
      MYSQL_DATABASE: 任意のデータベース名
      MYSQL_USER: 任意のユーザー名
      MYSQL_PASSWORD: 任意のパスワード
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci

volumes:
  db-data:
```
複数のコンテナを作成するときに使うのがこのcomposeファイルです。
任意の部分は、わかりやすい文字にしときましょう。


**2.Djangoプロジェクトの作成**

djangoのプロジェクトを作成します。
ターミナル内で、実行するディレクトリまで移動した上で

```bash:terminal
docker compose run --rm web django-admin startproject (プロジェクト名) .
```

プロジェクト名は任意の名前で大丈夫です。
入力しエンターを押すと、ディレクトリ内にプロジェクトが作成されます。

```
ディレクトリ(任意の名前)
├─プロジェクトフォルダ(プロジェクト名)
│　　　　　├─__init__.py
│　　　　　├─asgi.py
│　　　　　├─settings.py
│　　　　　├─urls.py　　　　　　　　
│　　　　　└─wsgi.py
├─Dockerfile
├─requirements.txt
├─compose.yaml
└─manage.py

```

プロジェクトフォルダに4つのファイルとその上の階層でmanage.pyが作られました。


**3.settings.pyの書き換え**
DjangoではDBのデフォルトがsqLiteに設定してあるので、
こちらをMySQLへ変えましょう。
settings.py内のテキストをVScodeで開きます↓

```python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
```
この部分をcompose.yamlで設定したNAMEやUSERで追記、書き換えしていきます。

```python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '名前',
        'USER':'名前',
        'PASSWORD':'パスワード',
        'HOST':'db',
        'PORT':'3306'
    }
}
```

**4.ターミナルでcomposeコマンドを実行**
最後のコマンドです。

```bash:terminal
docker-compose up -d
```

実行が始まり完了！
そして
http://127.0.0.1:8000/
へアクセスすると

![スクリーンショット 2023-01-24 144502.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2854762/983a98f1-7373-d2a4-2364-05b5db764868.png)



無事動いていることが確認できました。


## まとめ
・最初は任意の名前を設定する部分すら不明だった
・1つ進んでは1つ止まって、という作業をひたすらしていた(打ち間違いミスですぐ止まります)
・失敗しても大丈夫や！精神で何度か失敗してやり直しを繰り返すうちに成功できます

多分漏れている部分もありますがこんな感じです。
ここからアプリを作ることができるはずです。


参考

https://docs.docker.jp/compose/django.html



https://zenn.dev/agepan/articles/docker-article-001


https://qiita.com/bakupen/items/f23ce3d2325b4491a2dd

https://qiita.com/sugurutakahashi12345/items/6d68e6bb9163961a8d4d


書籍「Docker&仮想サーバー完全入門」

https://book.impress.co.jp/books/1121101138



読んでいただきありがとうございました。
PF作成編も徐々に投稿していきます。