Docker、Postgres、Redisキャッシュ、Redisメッセージキュー、Celeryを用いたDjangoの設定方法
By khoanc, at: 2024年9月12日21:58
Estimated Reading Time: __READING_TIME__ minutes


Docker、Postgres、Redisキャッシュ、Redisメッセージキュー、Celeryを用いたDjangoの設定方法:完全ガイド
スケーラブルなウェブアプリケーションを構築する開発者にとって、DockerをDjango、Postgres、Redis、Celeryと統合することは、効率的で堅牢な設定を提供します。
このガイドでは、DockerとDocker Composeを使用して、データベース、キャッシング、非同期タスク処理のニーズに対応するコンテナ化された開発環境を作成する手順を段階的に説明します。これは、こちらの以前のブログ記事 - Dockerを使用したPostgreSQLでのDjangoアプリの設定方法 - の高度なトピックです。
なぜこの設定なのか?
これらのテクノロジーを組み合わせることで、以下を実現できます。
- 強力なデータベース:Postgresは、信頼性が高く、機能豊富なリレーショナルデータベースです。
- 効率的なキャッシング:Redisは、データベースの負荷を軽減し、リクエスト処理を高速化します。
- 非同期処理:Celeryは、メール送信や画像処理などの長時間実行タスクを処理します。
- 移植性:Dockerは、すべての環境で一貫性を確保します。
前提条件
始める前に、以下のものがあることを確認してください。
ステップ1:プロジェクトディレクトリのセットアップ
明確性とスケーラビリティのためにプロジェクトを整理します。
django-docker-redis/
├── django_project/
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
├── celery_tasks/
ステップ2:Dockerfileの作成
Dockerfile
は、アプリケーションの環境を定義します。Djangoの最小限の設定を以下に示します。
# 軽量のPythonベースイメージを使用
FROM python:3.10-slim
# コンテナ内の作業ディレクトリを設定
WORKDIR /app
# 依存関係をコピーしてインストール
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
# アプリケーションコードをコンテナにコピー
COPY . /app/
# Django開発サーバーのポート8000を公開
EXPOSE 8000
# Djangoアプリを実行するコマンド
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
ステップ3:Docker Composeの設定
docker-compose.yml
ファイルは、複数のサービスを管理します。Django、Postgres、Redis、Celeryを定義する方法を以下に示します。
version: '3.8'
services:
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/app
ports:
- "8000:8000"
depends_on:
- db
- redis
db:
image: postgres:13
environment:
POSTGRES_USER: glinteco
POSTGRES_PASSWORD: glinteco
POSTGRES_DB: glinteco
redis:
image: redis:6
celery:
build: .
command: celery -A django_project worker --loglevel=info
depends_on:
- redis
- db
ステップ4:Django設定の更新
データベースの設定
settings.py
で、Postgresに接続するようにDATABASES
設定を更新します。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'glinteco',
'USER': 'glinteco',
'PASSWORD': 'glinteco',
'HOST': 'db',
'PORT': 5432,
}
}
Redisをキャッシュバックエンドとして設定
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': 'redis://redis:6379/1',
}
}
Redis用のCeleryの設定
CELERY_BROKER_URL = 'redis://redis:6379/0'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
ステップ5:Celeryタスクの作成とテスト
Celeryの設定を追加
Djangoプロジェクトにcelery.py
ファイルを作成します。
from celery import Celery
app = Celery('django_project')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
サンプルタスクの作成
アプリにtasks.py
を追加します。
from celery import shared_task
@shared_task
def add(x, y):
return x + y
ステップ6:コンテナのビルドと実行
イメージのビルド
docker-compose build
コンテナの起動
docker-compose up
マイグレーションの実行
docker-compose run web python manage.py migrate
Celeryタスクのテスト
Celeryシェルを使用してタスクをテストします。
docker-compose run celery celery -A django_project call tasks.add --args='[10, 20]'
ステップ7:設定のテスト
http://localhost:8000
でDjangoアプリにアクセスします。
- APIエンドポイントでRedisキャッシングをテストします。
- Celeryタスクが非同期に処理されることを確認します。
本番環境向けの拡張機能
この設定を本番環境対応にするには、以下を行います。
- 開発サーバーを
gunicorn
に置き換えます。
nginx
をリバースプロキシとして使用します。
Flower
を使用してCeleryタスクを監視します。
.env
ファイルを使用して機密情報を保護します。
結論
このガイドでは、DjangoをDocker、Postgres、Redisキャッシュ、Redisメッセージキュー、Celeryと共に設定する方法を説明しました。このアーキテクチャにより、アプリケーションは高トラフィックを処理し、パフォーマンスを最適化し、非同期タスクを効率的に管理できます。
さらに詳しく知るには: