Django Tutorial Part 0 --Docker-Compose で Django 3-4 と postgres 12 で composeexample プロジェクトを作って起動する
Tags: docker, django, postgres
Published: 2021-10-22 00:36:44


https://docs.docker.com/samples/django/

これの通りにやり、そのままでは動かなかった部分を修正し、解説した

rest5 というディレクトリを作り、その内部で作業した

=======

## Dockerfile を作る -- Docker 空間を作成して py3 を指定して requirements.txt から py モジュールをそこに入れる

```dockerfile
# syntax=docker/dockerfile:1
FROM python:3
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
```

python3 を使用するのを指定。
`/code/` という仮想ディレクトリを作る
そこに 現実のディレクトリにある `requirements.txt` をコピーして送る
`pip install` で `requirements.txt` を元に python module をインストールする
`/code/` の仮想ディレクトリから root にコピーして送る

という内容になっている

ここには問題はなかった。

=========

## requirements.txt を作成する -- 使う python ライブラリを指定するファイル

```py
Django>=3.0,<4.0
psycopg2-binary>=2.8
```

使う python モジュールとそれらのバージョンを指定する。
Django と psycopg2 を指定する

=======

## docker-compose.yml を作成する -- postgres を 12 に下げる

https://qiita.com/yuta-ushijima/items/d3d98177e1b28f736f04

docker-compose の volume などの書き方はこの記事がわかりやすかった

```yml
version: "3.9"
   
services:
  db:
    image: postgres:12
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
```

docker-compose の 3.9 バージョンを指定
db と web の 2 つのサービス(サーバー)を起動する

db をそのまま使うと問題がある。

https://support.kaspersky.com/us/15658

rails のサポートサイトを見ると

> We recommend that you use PostgreSQL version 11 or 12. 

postgres 11,12 を使えと描いてある。

公式では 指定がなかったが、12 より上だと Debinan と干渉し、

> SCRAM authentication requires libpq version 10 or above

このエラーが出る。

Debain はこちらでは動かせないので、 12 に下げる必要がある。（無指定だと 14 になる )

8000 をすでに他の作業で使っている場合は

```yml
    command: python manage.py runserver 0.0.0.0:7000
    ports:
      - "7000:7000"
```

これで 7000 で動かせる


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/09jcl7867izzdrx9imu7.png)

このように。

===========

## compose/db -- postgres を指定してデフォルトの data/db に postgres の postgresql/data を接続し、環境変数を設定する

https://pione30.hatenablog.com/entry/2020/07/28/235928

DB についてここに詳しく書かれていた

Volumes を使うと DB のデータを永続化できるらしい

db では　postgres のイメージを使用。バージョンは指定なし。
db では volumes という、ファイルシステムをマウントするものがある

https://qiita.com/teru0x1/items/db4b64144c8d8f3f5162#%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88

マウントとは、(仮想)ストレージの ファイルに使えるように接続すること。

これでローカルに作られる `./data/db` を
postgres の `var/lib/postgres/data` に接続する。

これで db/ というフォルダと中身が入る。
compose ファイルで postgres のバージョン変更などを行った際はこのフォルダは毎回削除する必要がある。

=======

## compose/web -- コマンドと使うライブラリフォルダと port 情報、使う db を指定して動かす。

build 先を root 直下に指定。
build コマンドを `python manage.py runserver` で 8000 に指定
Dockerfile で py ライブラリが入った `/code` を指定。
Docker の root 空間 の 8000 と Docker Web サーバー の 8000 を接続（要検証）
db の並列させたサーバーを依存先に指定。

=======

## docker-compose up run で django プロジェクトを作成する

Mac だと Docker アプリをインストールして起動していると
docker-compose コマンドが使える
アプリを起動していないと使えないので注意。

```py
sudo docker-compose run \
web django-admin startproject composeexample .
```

最後の `.` がないと整合性が取れなくなるので、非常に大切

`docker-compose` up run で `docker-compose.yml` web の command を実行する

これで動かすための Django のプロジェクトが作成される。

```py
sudo docker-compose run web django-admin startproject composeexample .                                                                                      
Password:                                                                                                                                                                                    
[+] Running 14/14                                                                                                                                                                            
 ⠿ db Pulled                                                                                                                                                                           23.9s 
   ⠿ a9eb63951c1c Pull complete                                                                                                                                                         8.1s 
   ⠿ 31b94a016ae6 Pull complete                                                                                                                                                         8.3s 
   ⠿ 03e007b8d405 Pull complete                                                                                                                                                         8.3s 
   ⠿ ba77da1e8ef6 Pull complete                                                                                                                                                         8.4s 
   ⠿ d76e0c23ff0f Pull complete                                                                                                                                                         8.7s 
   ⠿ b5a464f946a5 Pull complete                                                                                                                                                         8.7s 
   ⠿ 087b40f941ed Pull complete                                                                                                                                                         8.8s 
   ⠿ 5daeef133ea7 Pull complete                                                                                                                                                         8.8s 
   ⠿ 8aef96543a56 Pull complete                                                                                                                                                        18.9s 
   ⠿ d0828c098e6b Pull complete                                                                                                                                                        19.0s 
   ⠿ 2579e9abcb64 Pull complete                                                                                                                                                        19.0s 
   ⠿ 4b76875b094d Pull complete                                                                                                                                                        19.1s 
   ⠿ 590beec74550 Pull complete                                                                                                                                                        19.1s 
[+] Running 2/2                                                                                                                                                                              
 ⠿ Network dockerdjango_default  Created                                                                                                                                                0.0s 
 ⠿ Container dockerdjango-db-1   Created                                                                                                                                                0.1s 
[+] Running 1/1                                                                                                                                                                              
 ⠿ Container dockerdjango-db-1  Started                                                                                                                                                 0.4s 
[+] Building 46.2s (16/16) FINISHED                                                                                                                                                          
 => [internal] load build definition from Dockerfile
```

必要なイメージが pull されてコンテナが作られる

```py
ll
total 32
drwxr-xr-x   8 kaede0902  staff  256 Oct 22 09:29 ./
drwxr-xr-x  13 kaede0902  staff  416 Oct 21 21:28 ../
-rw-r--r--   1 kaede0902  staff  159 Oct 21 21:23 Dockerfile
drwxr-xr-x   7 kaede0902  staff  224 Oct 22 09:29 composeexample/
drwxr-xr-x   3 kaede0902  staff   96 Oct 22 09:28 data/
-rw-r--r--   1 kaede0902  staff  383 Oct 21 22:01 docker-compose.yml
-rwxr-xr-x   1 kaede0902  staff  670 Oct 22 09:29 manage.py*
-rw-r--r--   1 kaede0902  staff   39 Oct 21 21:46 requirements.txt
```

そしてローカルに

data/
manage.py
composeexample/

が作成される

この manage.py は今作成した Django プロジェクトに紐づいている。

compose ファイルを書き直した場合は、この 3 つは削除してまた

先ほどのコマンドで run する必要がある。

=====

## composeexamaple の中身を確認して setting.py に db を書く

init.py
asgi.py
settings.py
urls.py
wsgi.py

が入っているのを確認する

settings.py に このように書く

```py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}
```

backend は psql の エンジンを使う
HOST は db で PORT は 5432 を使う

これをしないと sqLite で動いてしまう

```py
dockerdjango-db-1   | 2021-12-05 08:16:21.191 UTC [1] LOG:  starting PostgreSQL 12.9 (Debian 12.9-1.pgdg110+1) on aarch64-unknown-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
dockerdjango-db-1   | 2021-12-05 08:16:21.196 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
dockerdjango-db-1   | 2021-12-05 08:16:21.196 UTC [1] LOG:  listening on IPv6 address "::", port 5432
dockerdjango-db-1   | 2021-12-05 08:16:21.201 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
```

こうやって。

======

## docker-compose up でサーバーを起動

```py
docker-compose up
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/igxysh5yuopt97984j3i.png)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cb23yfriphqadfaufje9.png)

これで docker-compose で Django アプリが Postgres を使って起動した。

=======


## まとめ

Docker-compose で　Django アプリを起動するにはこれらの手順を行う

### 1. requirements.txt という python のライブラリのリストを作る

Django などの依存ライブラリを記載する。

### 2. Dockerfile という Docker の設定ファイルを書く。

* python のバージョン指定
* requirements からのライブラリのインポート
* Docker での作業空間 `code/` の指定

これらを記載する

### 3. docker-compose.yml という DB サーバーと APP サーバーを立ち上げるマネージャーの設定ファイルを書く

* postgres のバージョン指定と保存場所、環境指定
* python のビルド場所とスタートコマンド、python の実行場所、ポートの指定。

これらを記載する

### 4. docker-compose run で アプリ のサーバーから django-admin を使って Django プロジェクトを作成する

```py
sudo docker-compose run web django-admin startproject composeexample .
```

### 5. プロジェクトの settings.py に DB サーバーの情報を記載して接続できるようにする

```py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}
```

### 6. docker-compose up で DB サーバーとアプリサーバーを同時に起動する

```py
docker-compose up
```