Docker 部署 Django 项目指南
项目概述
本指南将介绍如何使用 Docker 和 Docker Compose 部署一个基于 Django + PostgreSQL + Redis 的后端服务。通过容器化部署,我们可以实现环境一致性、快速部署和便捷的服务编排。
项目结构
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
├── .env
├── .dockerignore
└── your_project/
├── manage.py
├── your_project/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── apps/
配置文件
1. Dockerfile
# 使用官方 Python 镜像作为基础镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 设置环境变量
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# 安装系统依赖
RUN apt-get update && apt-get install -y \
postgresql-client \
&& rm -rf /var/lib/apt/lists/*
# 安装项目依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制项目文件
COPY . .
# 暴露端口
EXPOSE 8000
# 启动命令
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "your_project.wsgi:application"]
2. docker-compose.yml
version: '3.8'
services:
web:
build: .
command: gunicorn --bind 0.0.0.0:8000 your_project.wsgi:application
volumes:
- .:/app
- static_volume:/app/static
- media_volume:/app/media
expose:
- 8000
environment:
- DJANGO_SETTINGS_MODULE=your_project.settings
- DATABASE_URL=postgres://postgres:postgres@db:5432/postgres
- REDIS_URL=redis://redis:6379/0
depends_on:
- db
- redis
networks:
- backend_network
restart: unless-stopped
db:
image: postgres:13
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
networks:
- backend_network
restart: unless-stopped
redis:
image: redis:6-alpine
volumes:
- redis_data:/data
networks:
- backend_network
restart: unless-stopped
nginx:
image: nginx:1.21-alpine
volumes:
- static_volume:/app/static
- media_volume:/app/media
- ./nginx.conf:/etc/nginx/conf.d/default.conf
ports:
- "80:80"
depends_on:
- web
networks:
- backend_network
restart: unless-stopped
volumes:
postgres_data:
redis_data:
static_volume:
media_volume:
networks:
backend_network:
driver: bridge
3. requirements.txt
Django>=3.2,<4.0
gunicorn>=20.1.0
psycopg2-binary>=2.9.1
redis>=4.0.0
dj-database-url>=0.5.0
django-redis>=5.0.0
4. .env
DJANGO_SETTINGS_MODULE=your_project.settings
DATABASE_URL=postgres://postgres:postgres@db:5432/postgres
REDIS_URL=redis://redis:6379/0
DJANGO_SECRET_KEY=your-secret-key-here
DJANGO_DEBUG=0
5. nginx.conf
upstream django {
server web:8000;
}
server {
listen 80;
server_name localhost;
location /static/ {
alias /app/static/;
}
location /media/ {
alias /app/media/;
}
location / {
proxy_pass http://django;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
部署步骤
准备项目文件
确保项目目录中包含所有必要的配置文件:
- Dockerfile
- docker-compose.yml
- requirements.txt
- .env
- nginx.conf
构建和启动服务
# 构建镜像并启动服务 docker-compose up -d --build # 查看服务状态 docker-compose ps
数据库迁移
# 执行数据库迁移 docker-compose exec web python manage.py migrate # 创建超级用户 docker-compose exec web python manage.py createsuperuser
收集静态文件
docker-compose exec web python manage.py collectstatic --noinput
常用操作命令
# 启动所有服务
docker-compose up -d
# 停止所有服务
docker-compose down
# 查看服务日志
docker-compose logs -f
# 重启特定服务
docker-compose restart web
# 进入容器执行命令
docker-compose exec web bash
注意事项
安全性考虑
- 生产环境中修改默认的数据库密码
- 使用环境变量管理敏感信息
- 确保
.env
文件不被提交到版本控制系统
性能优化
- 根据服务器配置调整 Gunicorn 的工作进程数
- 配置 Redis 缓存策略
- 优化 PostgreSQL 配置参数
数据备份
- 定期备份 PostgreSQL 数据
- 配置数据卷备份策略
扩展性
- 服务可以根据需求横向扩展
- 使用 Docker Swarm 或 Kubernetes 进行容器编排
故障排查
检查容器状态
docker-compose ps
查看容器日志
docker-compose logs -f [service_name]
检查网络连接
docker network inspect backend_network
总结
通过 Docker 和 Docker Compose 部署 Django 项目,我们实现了:
- 环境隔离和一致性
- 服务编排和管理
- 简化的部署和扩展流程
- 便捷的开发和调试体验
合理配置各个服务,注意安全性和性能优化,可以构建一个稳定可靠的生产环境。根据实际需求调整配置参数,确保系统的最佳性能。