如何使用 Docker Compose 编排 Django Postgres Redis 服务?

文章导读
对于本地开发和测试环境,使用 Docker Compose 编排 Django、Postgres 和 Redis 是目前的标准做法,能通过一个配置文件统一管理服务依赖和网络,避免手动启动多个容器带来的配置不一致问题。
📋 目录
  1. A 命令速用版
  2. B 分步处理
  3. C 怎么验证是否生效
  4. D 常见坑
  5. E 参考来源
A A

对于本地开发和测试环境,使用 Docker Compose 编排 Django、Postgres 和 Redis 是目前的标准做法,能通过一个配置文件统一管理服务依赖和网络,避免手动启动多个容器带来的配置不一致问题。

先说结论:Docker Compose 适合将 Django 应用与数据库、缓存服务绑定部署,能显著降低环境搭建成本,但需注意敏感信息管理和健康检查配置。

  • 适合:本地开发环境、CI/CD 测试流程、微服务原型验证。
  • 先看:项目目录结构规划、Dockerfile 基础指令、服务依赖关系配置。
  • 建议:使用 .env 文件管理密码,为数据库配置健康检查,生产环境替换 runserver 为 gunicorn。

命令速用版

若已准备好配置文件,可直接使用以下命令启动 stack:

docker-compose up -d

首次初始化 Django 项目或数据库迁移:

docker-compose run web python manage.py migrate

查看服务运行日志:

docker-compose logs -f web

分步处理

1. 规划项目结构

在项目根目录下保持清晰的文件布局,通常包含 Docker 构建定义、编排配置、环境变量和代码目录:

my_django_app/
├── .env
├── .dockerignore
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
└── django_app/
    ├── manage.py
    └── django_app/

2. 准备依赖清单

requirements.txt中明确指定必要依赖,包括数据库驱动、缓存库及生产级服务器:

Django>=4.2
psycopg2-binary
redis
gunicorn

3. 管理环境变量

创建.env文件存储敏感信息,不要将其提交到版本控制:

DB_PASSWORD=secure_password_here
DJANGO_SECRET_KEY=your-secret-key

同时创建.dockerignore排除无关文件:

.env
__pycache__
*.pyc
.git

4. 编写 Dockerfile

基于具体版本的 Python 镜像构建应用环境,确保构建可复现:

如何使用 Docker Compose 编排 Django Postgres Redis 服务?
FROM python:3.11-slim
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install `--no-cache-dir` -r requirements.txt
COPY . /code/

5. 配置 docker-compose.yml

定义 Web、数据库和缓存三个服务,配置健康检查确保依赖就绪,并通过env_file加载环境变量:

version: '3.8'
services:
  db:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5
  redis:
    image: redis:7
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    env_file:
      - .env
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
volumes:
  postgres_data:

6. 修改 Django 设置

settings.py中,通过os.environ读取环境变量,避免硬编码敏感信息:

import os

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
        'PASSWORD': os.environ.get('DB_PASSWORD'),
    }
}

Redis 连接地址同理,HOST 应设置为redis,密码也建议从环境变量读取。

7. 启动服务

执行docker-compose up,Compose 会自动构建镜像并拉起所有容器。

注意:上述 command 使用 runserver 仅适用于开发环境。生产环境建议将 command 改为gunicorn django_app.wsgi:application `--bind` 0.0.0.0:8000

怎么验证是否生效

1. 检查容器状态

运行docker-compose ps,确认所有服务状态均为Up,且 db 服务健康检查通过。

2. 验证数据库连接

进入 Web 容器尝试连接数据库:

如何使用 Docker Compose 编排 Django Postgres Redis 服务?
docker-compose exec web python manage.py shell

在 Shell 中导入django.db若无报错,说明连接正常。

3. 验证 Redis 连接

查看应用日志,确认无 Redis 连接拒绝错误,或进入 Redis 容器执行redis-cli ping返回PONG

常见坑

1. 数据丢失风险

若未在 Compose 文件中配置volumes,容器重建后数据库数据会丢失。生产环境务必将数据卷挂载到宿主机。

2. 服务启动顺序

仅靠depends_on不能保证数据库完全就绪,必须配合healthcheckcondition: service_healthy,或在应用层增加重试机制。

3. 网络主机名混淆

Django 配置中的HOST必须是 Compose 定义的服务名,容器间通过内部 DNS 解析,不能使用127.0.0.1

4. 敏感信息泄露

切勿将.env文件或硬编码密码的settings.py提交到公共仓库,建议使用.gitignore忽略敏感文件。

5. 端口冲突

映射端口(如 8000)若被宿主机占用,启动会失败,可修改为其他端口如"8001:8000"

参考来源

  • Docker 官方文档:Define and run multi-container applications with Compose
  • Django 官方文档:Deploying Django with Docker
  • PostgreSQL Docker Hub 官方镜像说明
  • Redis 官方文档:Running Redis with Docker
  • Twelve-Factor App 方法论:配置存储建议