はじめに
Docker (docker-compose)と Linux に標準で搭載されているシェルを組み合せて、
下記 概要に挙げた Django 環境を 1コマンドで即座に立ち上げるためのコードとその解説です.
本記事の内容は、Zenn で書籍として販売している内容と同一です.
Zenn でも書籍の内容は全て無料公開しています.
次の順でコードを作成してください.
動作するコードが作成できるように可能な限り注意を払って執筆しました.
・[01] Dockerとシェルを活用して、1コマンドで Django を立ち上げる
・[02] SQLite3 を PostgreSQL へ置き換える
・[03] Django アプリの立ち上げもさせる
・[04] jwilder/dockerize を使ってセットアップ処理を改良する
・[05] runserver を Gunicorn へ置き換える
・[06] "まっしろ"対策として Nginx を導入する
・本記事の内容
概要
今回は下図・下表の環境を構築する. (前章からの変更点は🔥である)
より具体的な変更点としては次である.
・キャッシュデータベースとして Redis を導入する.
概念図
図を簡単にするために、jwilder/dockerize の線は省略している.
コンテナ内の構成
項目 | 値 | 補足 |
---|---|---|
Python | バージョン3.8.3 |
python:3.8.3-slim-buster を使う |
Django | バージョン3.0.7 | |
Webサーバ | Nginx | 8000番ポートを使用する |
アプリサーバ | gunicorn | 53000番ポートを使用する. ただし、53000番ポートはホストには公開しない |
データベース | PostgreSQL 12.0 | ポートは次の通り ・ホスト側「53432」 ・コンテナ側「5432」 管理者アカウントは次の通り ・アカウント「 admin 」・パスワード「 admin 」 |
キャッシュ用データベース🔥 | Redis 6.2.2🔥 | ポートは次の通り ・ホスト側「53379」 ・コンテナ側「6379」🔥 |
settings.py | 次の定義を追加する ・ SESSION_ENGINE ・ CACHES
|
ホスト上の ./web/assets/settings.py が、コンテナ内に /usr/src/app/config/settings.py として配置される. |
Django admin ページ | 管理者アカウントは次の通り ・アカウント「 admin 」・パスワード「 admin 」 |
|
アプリケーション | アプリ名「shop」 | 各ユーザが使用したいアプリに置き換えてほしい |
コンテナ起動確認ツール | jwilder/dockerize |
セットアップコード
前章で作成したコードに対して、本記事の内容を適用してください.
web/assets/settings.py より、「DEBUG = True」と「DEBUG = False」の両パターンでセットアップできることを確認している.
ファイル構成
上記 GitHub からコードを取得してきた直後の構成である.
前章から変更が生じたファイルには🏷️を、新規作成については🆕を付与している.
.
|-- cachedb 🆕
| `-- Dockerfile 🆕
|-- db
| `-- Dockerfile
|-- docker-compose.yml 🏷️
|-- nginx
| |-- Dockerfile
| `-- conf.d
| `-- nginx.conf
|-- setupapp.sh ........... セットアップスクリプト
`-- web
|-- Dockerfile
`-- assets ............ コンテナへコピーされるデータ
|-- entrypoint.sh
|-- requirements.txt 🏷️
|-- sample
| `-- shop
| |-- admin.py
| `-- models.py
`-- settings.py 🏷️
解説
cachedb/Dockerfile
新規作成.
特筆すべき事項なし.
FROM redis:6.2.2-alpine
## プロキシサーバを使う場合
# ENV http_proxy="http://proxy.co.jp:8080"
# ENV https_proxy="http://proxy.co.jp:8080"
# 時刻を日本に合わせる
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
docker-compose.yml
・redis コンテナを新たに立ち上げる.
・永続ボリュームとしてホスト側に ./cachedb/data
を作成している
--- docker-compose.yml.ORIG
+++ docker-compose.yml
@@ -33,6 +33,18 @@
POSTGRES_USER: 'admin'
POSTGRES_PASSWORD: 'admin'
PGDATA: '/data'
+ depends_on:
+ - cachedb
+ cachedb:
+ build: ./cachedb
+ image: myredis622
+ container_name: myredis622
+ restart: always
+ ports:
+ - "53379:6379"
+ volumes:
+ - ./cachedb/data:/data
+ command: redis-server --appendonly yes
nginx:
build: ./nginx
image: mynginx0120
setupapp.sh
・redis によるキャッシュデータを削除する.
@@ -4,6 +4,7 @@
sudo rm -rf web/app
sudo rm -rf db/data
sudo rm -rf db/init
+sudo rm -rf cachedb/data
# docker-compose.yml で書かれたサービスのコンテナ、イメージ、ネットワークを削除する
docker-compose down --rmi all --volumes
web/assets/requirements.txt
・redis 関連のパッケージを追加登録する
--- web/assets/requirements.txt.ORIG
+++ web/assets/requirements.txt
@@ -5,3 +5,5 @@
psycopg2==2.8.5
psycopg2-binary==2.8.5
gunicorn==20.0.4
+django-redis==4.11.0
+redis==3.4.1
web/assets/settings.py
・SESSION_ENGINE と CACHES を追加する
・パラメータは こちらのサイト を参考にした
--- web/assets/settings.py.ORIG
+++ web/assets/settings.py
@@ -85,6 +85,17 @@
}
}
+SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
+
+CACHES = {
+ 'default': {
+ 'BACKEND': 'django_redis.cache.RedisCache',
+ 'LOCATION': 'redis://cachedb:6379/1',
+ 'OPTIONS': {
+ 'CLIENT_CLASS': 'django_redis.client.DefaultClient',
+ }
+ }
+}
# Password validation
# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators
セットアップ方法
次の通りコマンドを実行する.
$ ./setupapp.sh
セットアップ後
ファイル構成
$ tree . --charset=c -a -L 5
.
|-- cachedb
| |-- Dockerfile
| `-- data
| `-- appendonly.aof
|-- db
| |-- Dockerfile
| |-- data [error opening dir]
| `-- init
|-- docker-compose.yml
|-- nginx
| |-- Dockerfile
| `-- conf.d
| `-- nginx.conf
|-- setupapp.sh
`-- web
|-- Dockerfile
|-- app
| |-- .settings.py
| |-- config
| | |-- __init__.py
| | |-- asgi.py
| | |-- settings.py
| | |-- urls.py
| | `-- wsgi.py
| |-- entrypoint.sh
| |-- log
| | `-- gunicorn.log
| |-- manage.py
| |-- media
| |-- shop
| | |-- __init__.py
| | |-- admin.py
| | |-- apps.py
| | |-- migrations
| | | |-- 0001_initial.py
| | | `-- __init__.py
| | |-- models.py
| | |-- tests.py
| | `-- views.py
| `-- static
| `-- admin
| |-- css .... これより下層の表示は省略している
| |-- fonts .. これより下層の表示は省略している
| |-- img .... これより下層の表示は省略している
| `-- js ..... これより下層の表示は省略している
`-- assets
|-- entrypoint.sh
|-- requirements.txt
|-- sample
| `-- shop
| |-- admin.py
| `-- models.py
`-- settings.py
動作確認方法
次の点を確認すれば良い.
✔ Dockerコンテナが次のように起動していること
コンテナ「jwilder_dockerize
」は使い捨て型なので、Exit 2 は意図した結果であり問題無し.
$ docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------------------
jwilder_dockerize dockerize --help Exit 2
mydjango307 /usr/src/app/entrypoint.sh ... Up 53000/tcp
mynginx0120 /docker-entrypoint.sh ngin ... Up 0.0.0.0:8000->1337/tcp, 80/tcp
mypostgres12 docker-entrypoint.sh postgres Up 0.0.0.0:53432->5432/tcp
myredis622 docker-entrypoint.sh redis ... Up 0.0.0.0:53379->6379/tcp
✔ http://localhost:8000 にアクセスして次の画面が表示されること.
✔ http://localhost:8000/admin にアクセスして、アカウント「admin
」、パスワード「admin
」でログインできること.
✔ cachedb/data/appendonly.aof
が存在していること
以上.