从零开始:使用Docker容器化部署Django项目到腾讯云CVM(附完整配置文件)
从零开始:使用Docker容器化部署Django项目到腾讯云CVM(附完整配置文件)
在当今快速迭代的开发环境中,传统部署方式常常面临环境不一致、依赖冲突等问题。Docker容器化技术为解决这些痛点提供了优雅方案,本文将带您从零开始,通过Docker将Django项目无缝部署到腾讯云CVM,实现"一次构建,处处运行"的现代化部署体验。
1. 环境准备与架构设计
1.1 腾讯云CVM基础配置
建议选择以下规格的云服务器:
- 操作系统:Ubuntu 22.04 LTS(长期支持版)
- 推荐配置:
- 计算型C3:2核4GB(中小型项目)
- 计算型C4:4核8GB(中大型项目)
- 安全组设置:
- 开放80/443端口(Web服务)
- 开放22端口(SSH管理)
- 开放8000端口(调试用)
提示:购买后建议立即设置SSH密钥登录,禁用密码认证提升安全性
1.2 项目结构优化
标准Django项目的Docker化前需要调整目录结构:
myproject/ ├── app/ # Django应用代码 ├── manage.py ├── requirements.txt ├── Dockerfile # 主容器构建文件 ├── docker-compose.yml # 多服务编排文件 ├── nginx/ │ └── nginx.conf # 反向代理配置 └── static/ # 收集的静态文件1.3 容器化架构设计
采用生产级三容器方案:
- Django容器:运行Gunicorn应用服务器
- Nginx容器:处理静态文件与反向代理
- PostgreSQL容器:数据库服务(可选替换为云数据库)
2. 核心配置文件编写
2.1 Dockerfile详解
# 基础镜像 FROM python:3.9-slim-bullseye # 设置环境变量 ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 # 创建工作目录 WORKDIR /code # 安装系统依赖 RUN apt-get update && apt-get install -y \ gcc \ libpq-dev \ && rm -rf /var/lib/apt/lists/* # 安装Python依赖 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制项目代码 COPY . . # 收集静态文件(可在构建时执行) RUN python manage.py collectstatic --noinput # 暴露端口 EXPOSE 8000 # 启动命令 CMD ["gunicorn", "--bind", "0.0.0.0:8000", "myproject.wsgi:application"]2.2 docker-compose.yml配置
version: '3.8' services: web: build: . command: gunicorn --bind 0.0.0.0:8000 --workers 3 myproject.wsgi:application volumes: - .:/code expose: - "8000" environment: - DJANGO_SETTINGS_MODULE=myproject.settings.prod - DATABASE_URL=postgres://postgres:password@db:5432/postgres depends_on: - db db: image: postgres:13 volumes: - postgres_data:/var/lib/postgresql/data/ environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=password - POSTGRES_DB=postgres nginx: image: nginx:1.21 ports: - "80:80" volumes: - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf - ./static:/static depends_on: - web volumes: postgres_data:2.3 Nginx配置文件
upstream django { server web:8000; } server { listen 80; server_name your_domain.com; location /static/ { alias /static/; } location / { proxy_pass http://django; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }3. 部署流程与优化
3.1 完整部署步骤
构建镜像:
docker-compose build启动服务:
docker-compose up -d执行数据库迁移:
docker-compose exec web python manage.py migrate创建超级用户:
docker-compose exec web python manage.py createsuperuser
3.2 生产环境优化建议
Gunicorn参数调优:
# gunicorn_config.py bind = "0.0.0.0:8000" workers = (2 * cpu_count()) + 1 worker_class = "gthread" threads = 2 max_requests = 1000 timeout = 30 keepalive = 2Django生产配置:
# settings/prod.py DEBUG = False ALLOWED_HOSTS = ['your_domain.com', 'localhost'] STATIC_ROOT = '/static/' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': os.getenv('DB_NAME'), 'USER': os.getenv('DB_USER'), 'PASSWORD': os.getenv('DB_PASSWORD'), 'HOST': os.getenv('DB_HOST'), 'PORT': os.getenv('DB_PORT', '5432'), } }4. 高级运维技巧
4.1 日志管理方案
查看容器日志:
docker-compose logs -f web配置日志轮转:
# 在Dockerfile中添加 RUN mkdir -p /var/log/gunicorn && \ touch /var/log/gunicorn/access.log /var/log/gunicorn/error.log4.2 自动化部署策略
使用GitHub Actions实现CI/CD:
name: Deploy to Tencent CVM on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Install SSH key uses: shimataro/ssh-key-action@v2 with: key: ${{ secrets.SSH_PRIVATE_KEY }} known_hosts: ${{ secrets.KNOWN_HOSTS }} - name: Deploy via SSH run: | ssh user@your_server_ip "cd /path/to/project && git pull && docker-compose build && docker-compose up -d"4.3 监控与告警配置
使用cAdvisor监控容器资源:
docker run \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --volume=/dev/disk/:/dev/disk:ro \ --publish=8080:8080 \ --detach=true \ --name=cadvisor \ google/cadvisor:latest