对于本地开发和测试环境,使用 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 镜像构建应用环境,确保构建可复现:
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 exec web python manage.py shell在 Shell 中导入
django.db若无报错,说明连接正常。3. 验证 Redis 连接
查看应用日志,确认无 Redis 连接拒绝错误,或进入 Redis 容器执行
redis-cli ping返回PONG。常见坑
1. 数据丢失风险
若未在 Compose 文件中配置
volumes,容器重建后数据库数据会丢失。生产环境务必将数据卷挂载到宿主机。2. 服务启动顺序
仅靠
depends_on不能保证数据库完全就绪,必须配合healthcheck和condition: 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 方法论:配置存储建议