https://docs.docker.com/samples/django/
これの通りにやり、そのままでは動かなかった部分を修正し、解説した
rest5 というディレクトリを作り、その内部で作業した
=======
Dockerfile を作る -- Docker 空間を作成して py3 を指定して requirements.txt から py モジュールをそこに入れる
# 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 ライブラリを指定するファイル
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 などの書き方はこの記事がわかりやすかった
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 をすでに他の作業で使っている場合は
command: python manage.py runserver 0.0.0.0:7000
ports:
- "7000:7000"
これで 7000 で動かせる
このように。
===========
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 コマンドが使える
アプリを起動していないと使えないので注意。
sudo docker-compose run \
web django-admin startproject composeexample .
最後の .
がないと整合性が取れなくなるので、非常に大切
docker-compose
up run で docker-compose.yml
web の command を実行する
これで動かすための Django のプロジェクトが作成される。
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 されてコンテナが作られる
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 に このように書く
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'db',
'PORT': 5432,
}
}
backend は psql の エンジンを使う
HOST は db で PORT は 5432 を使う
これをしないと sqLite で動いてしまう
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 でサーバーを起動
docker-compose up
これで 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 プロジェクトを作成する
sudo docker-compose run web django-admin startproject composeexample .
5. プロジェクトの settings.py に DB サーバーの情報を記載して接続できるようにする
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'db',
'PORT': 5432,
}
}
6. docker-compose up で DB サーバーとアプリサーバーを同時に起動する
docker-compose up
Top comments (0)