【Docker】入門：Djangoのコンテナを作成

# はじめに
UdemyでDockerの学習を進めている最中で、途中経過をアウトプットしたいと考えています。
今回は、DjangoをDockerで実行したいと思います。

# 環境
- Windows10
- Docker version 24.0.6
- VScode
- Git Bash

# 参考にしたサイト
https://docs.docker.jp/compose/django.html

# プロジェクトのコンポーネントを定義
- プロジェクト用のディレクトリを作成します
```Terminal
mkdir composeexample
```
```
cd composeexample
```

- プロジェクトディレクトリの```Dockerfile```を新規作成し、次の内容を加えます。
```Dockerfile
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install --upgrade pip && \
    pip install -r requirements.txt
ADD . /code/
```

- プロジェクト・ディレクトリに```requirements.txt```を生成し、必要なソフトウェアを記載します。
```
Django
psycopg2
```

- プロジェクト・ディレクトリに```docker-compose.yml```を生成し、以下の設定を追加します。
```docker-compose.yml
version: '3'

services:
  db:
    image: postgres
    environment:
      POSTGRES_DB: postgres
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
```

# Djangoプロジェクトの生成
```terminal
docker-compose run web django-admin startproject composeexample .
```
※私の環境だと、参考サイトに記載のある```docker-compose run web django-admin.py startproject composeexample .```を実行すると
```
Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "django-admin.py": executable file not found in $PATH: unknown
time="2023-10-09T07:53:04+09:00" level=error msg="error waiting for container: "
```
というエラーが出ました。
コンテナ内のPATHで実行可能ファイル "django-admin.py" を見つけることができないため、コンテナが起動できないと言っているので、```.py```をなくしたらいけました

- 成されたファイルの所有者を以下のようにして変更します。
```Terminal
chown -R $USER:$USER .
```

- ```ls -l``` コマンドで権限が更新されているかを確認します。
```terminal
ls -l
```

```
$ ls -l
total 11
drwxr-xr-x 1 [user name] 197121   0 Oct  9 07:54 composeexample/
-rw-r--r-- 1 [user name] 197121 223 Oct  9 07:50 docker-compose.yml
-rw-r--r-- 1 [user name] 197121 149 Oct  9 07:47 Dockerfile
-rwxr-xr-x 1 [user name] 197121 670 Oct  9 07:54 manage.py*
-rw-r--r-- 1 [user name] 197121  16 Oct  9 07:48 requirements.txt
```

# データベースへの接続設定
-  ```settings.py```の```DATABASE=...```の部分を以下のように書き換えます。
```python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'db',
        'PASSWORD': 'postgres',
        'PORT': 5432,
    }
}
```
- プロジェクトのトップ・ディレクトリにおいてコマンド ```docker-compose up -d``` を実行します。
```
docker-compose up -d
```

- ```docker-compose exec web bash```でコンテナに入ります。
```terminal
docker-compose exec web bash
```
- ```python manage.py migrate```を実行します。
```terminal
python manage.py migrate
```
- superuserを登録します。
```terminal
python manage.py createsuperuser
```
http://localhost:8000/ にアクセスし、ロケットが飛んだら成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610435/f19ed852-2b1e-3dda-81f6-5768545fb288.png)

http://localhost:8000/admin で作成したsuperuserで管理者画面にログインできることも確認します。

# POSTGRESQLコンテナに入ってみる
- ```docker-compose exec db bash```でコンテナに入ります。
```terminal
docker-compose exec db bash
```
- 以下のコマンドでログインします。
```terminal
psql -h localhost -U postgres -d postgres
```
- \dtでテーブルを確認してみます。
```terminal
postgres=# \dt
                   List of relations
 Schema |            Name            | Type  |  Owner
--------+----------------------------+-------+----------
 public | auth_group                 | table | postgres
 public | auth_group_permissions     | table | postgres
 public | auth_permission            | table | postgres
 public | auth_user                  | table | postgres
 public | auth_user_groups           | table | postgres
 public | auth_user_user_permissions | table | postgres
 public | django_admin_log           | table | postgres
 public | django_content_type        | table | postgres
 public | django_migrations          | table | postgres
 public | django_session             | table | postgres
```
djangoのテーブルが作成されていました！


```terminal
postgres=# SELECT * FROM auth_user;
 id |                                         password                                         |          last_login           | is_superuser | username | first_name | last_name | email | is_staff | is_active |          date_joined   

----+----+-------------------------------+-----+-------+----+---+--+---+----+-------------------------------
  1 |pass| 2023-10-09 13:23:24.426382+00 | t   | admin |    |   |  | t | t  | 2023-10-09 13:23:06.695555+00
(1 row)
```
super userも登録されているようです。