一、引言:为何选择Docker部署Django?
在单机环境下开发Django项目时,开发者常面临环境配置复杂、依赖管理混乱等问题。Docker作为一种轻量级容器化技术,能够将应用及其依赖环境打包成独立的容器,实现”一次构建,到处运行”的便利性。通过Docker部署Django项目,可以:
- 隔离开发环境,避免依赖冲突
- 简化部署流程,提升交付效率
- 方便跨平台迁移,保持环境一致性
- 快速扩展服务,支持横向扩容
二、环境准备:安装Docker基础组件
1. 安装Docker引擎
在Linux系统(以Ubuntu为例)上安装Docker:
# 更新软件包索引sudo apt-get update# 安装依赖包sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common# 添加Docker官方GPG密钥curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -# 添加Docker APT仓库sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"# 安装Docker CEsudo apt-get updatesudo apt-get install docker-ce docker-ce-cli containerd.io# 验证安装sudo docker run hello-world
2. 配置Docker用户组
为避免每次使用docker命令都需要sudo权限,将当前用户加入docker组:
sudo usermod -aG docker $USERnewgrp docker # 立即生效
三、Django项目准备:基础结构搭建
1. 创建Django项目
mkdir django_docker_democd django_docker_demopython3 -m venv venvsource venv/bin/activatepip install djangodjango-admin startproject myprojectcd myproject
2. 创建测试应用
python manage.py startapp myapp
3. 配置基本设置
修改myproject/settings.py,确保允许所有主机访问:
ALLOWED_HOSTS = ['*']
四、Dockerfile编写:构建Django镜像
在项目根目录创建Dockerfile文件:
# 使用官方Python基础镜像FROM python:3.9-slim# 设置环境变量ENV PYTHONDONTWRITEBYTECODE 1ENV PYTHONUNBUFFERED 1# 创建工作目录WORKDIR /app# 安装系统依赖RUN apt-get update && apt-get install -y --no-install-recommends \netcat \&& rm -rf /var/lib/apt/lists/*# 复制依赖文件并安装COPY requirements.txt .RUN pip install --no-cache-dir -r requirements.txt# 复制项目文件COPY . .# 暴露端口EXPOSE 8000# 定义启动命令CMD ["sh", "-c", "python manage.py migrate && python manage.py runserver 0.0.0.0:8000"]
关键点说明:
- 基础镜像选择:使用
python:3.9-slim既保证功能完整又减少镜像体积 - 环境变量设置:
PYTHONDONTWRITEBYTECODE:禁止生成.pyc文件PYTHONUNBUFFERED:使Python输出直接发送到终端而不缓冲
- 依赖管理:先复制
requirements.txt单独安装依赖,利用Docker层缓存机制提高构建效率 - 工作目录:所有操作在
/app目录下进行,保持容器内文件结构清晰
五、构建与运行Django容器
1. 创建requirements.txt
pip freeze > requirements.txt
2. 构建Docker镜像
docker build -t django-app .
3. 运行容器
docker run -d -p 8000:8000 --name mydjango django-app
4. 验证运行
访问http://localhost:8000,应看到Django欢迎页面
六、进阶配置:优化Docker部署
1. 使用docker-compose管理多容器
创建docker-compose.yml文件:
version: '3.8'services:web:build: .command: sh -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000"volumes:- .:/appports:- "8000:8000"environment:- DEBUG=1
启动服务:
docker-compose up -d
2. 分离生产环境配置
创建.env.prod文件:
DEBUG=0SECRET_KEY=your-secret-keyALLOWED_HOSTS=.example.com
修改docker-compose.yml:
environment:- DEBUG=${DEBUG}- SECRET_KEY=${SECRET_KEY}- ALLOWED_HOSTS=${ALLOWED_HOSTS}
3. 使用Nginx作为反向代理
添加nginx服务到docker-compose.yml:
nginx:image: nginx:alpineports:- "80:80"volumes:- ./nginx/default.conf:/etc/nginx/conf.d/default.confdepends_on:- web
创建nginx/default.conf:
server {listen 80;server_name localhost;location / {proxy_pass http://web:8000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}location /static/ {alias /app/static/;}}
七、常见问题解决方案
1. 静态文件加载失败
解决方案:
- 确保
settings.py中配置了正确的STATIC_URL和STATIC_ROOT - 运行
python manage.py collectstatic收集静态文件 - 在Nginx配置中添加静态文件服务规则
2. 数据库连接问题
解决方案:
-
使用环境变量配置数据库连接:
DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql','NAME': os.getenv('DB_NAME', 'postgres'),'USER': os.getenv('DB_USER', 'postgres'),'PASSWORD': os.getenv('DB_PASSWORD', 'postgres'),'HOST': os.getenv('DB_HOST', 'db'),'PORT': os.getenv('DB_PORT', '5432'),}}
-
在
docker-compose.yml中添加数据库服务:
```yaml
db:
image: postgres:13
environment:- POSTGRES_DB=mydatabase
- POSTGRES_USER=myuser
- POSTGRES_PASSWORD=mypassword
volumes: - postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
## 3. 容器启动顺序问题解决方案:使用`depends_on`和健康检查确保服务就绪:```yamlweb:depends_on:db:condition: service_healthydb:healthcheck:test: ["CMD-SHELL", "pg_isready -U postgres"]interval: 5stimeout: 5sretries: 5
八、最佳实践建议
- 多阶段构建:减少最终镜像体积
```dockerfile
构建阶段
FROM python:3.9 as builder
WORKDIR /app
COPY requirements.txt .
RUN pip install —user -r requirements.txt
运行阶段
FROM python:3.9-slim
WORKDIR /app
COPY —from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
CMD [“gunicorn”, “—bind”, “0.0.0.0:8000”, “myproject.wsgi”]
2. **使用.dockerignore文件**:排除不必要的文件
.git
pycache/
.pyc
.pyo
*.pyd
.env
venv/
3. **日志管理**:集中收集容器日志```yamlservices:web:logging:driver: "json-file"options:max-size: "10m"max-file: "3"
- 安全加固:
- 使用非root用户运行容器
- 定期更新基础镜像
- 限制容器资源使用
九、总结与展望
通过Docker部署Django项目,开发者可以获得:
- 一致的开发环境,减少”在我机器上能运行”的问题
- 简化的部署流程,提高交付效率
- 更好的资源隔离,提升系统稳定性
- 方便的扩展能力,支持快速扩容
未来发展方向:
- 结合Kubernetes实现更高级的编排管理
- 引入CI/CD流水线实现自动化部署
- 探索服务网格技术提升微服务管理能力
- 采用无服务器架构进一步简化运维
通过本文介绍的完整流程,开发者可以在单机环境下快速搭建起生产级的Django容器化部署方案,为后续的云原生迁移和规模化部署打下坚实基础。