28-Docker部署Django(下)-docker-compose编排与静态文件处理

文章目录

  • [Docker 部署 Django(下):docker-compose 编排------Django + MySQL + Redis 一键启动](#Docker 部署 Django(下):docker-compose 编排——Django + MySQL + Redis 一键启动)
    • 导入语
    • [1 ~> 完整的 `docker-compose.yml`](#1 ~> 完整的 docker-compose.yml)
    • [2 ~> 关键配置逐条说明](#2 ~> 关键配置逐条说明)
      • [2.1 `depends_on` + `healthcheck`------启动顺序不是单纯等待](#2.1 depends_on + healthcheck——启动顺序不是单纯等待)
      • [2.2 `volumes`------数据不随容器销毁而丢失](#2.2 volumes——数据不随容器销毁而丢失)
      • [2.3 静态文件------Nginx 代理和 `collectstatic`](#2.3 静态文件——Nginx 代理和 collectstatic)
    • [3 ~> 生产环境完整启动流程](#3 ~> 生产环境完整启动流程)
    • [思考 && 总结](#思考 && 总结)
    • 结尾

Docker 部署 Django(下):docker-compose 编排------Django + MySQL + Redis 一键启动

📖 文章简介: 上篇把 Django 镜像从 2GB 瘦身到 180MB。下篇用 docker-compose.yml 把 Django、MySQL、Redis、Nginx 四个服务编排在一起------一个 docker-compose up -d 就全跑起来。重点讲:服务之间的依赖顺序控制(depends_on + healthcheck)、数据库数据持久化(volumes)、静态文件和白卷代理(Nginx 反向代理 Gunicorn)、以及生产环境的网络隔离策略。附完整可用的 docker-compose.yml 示例------直接改环境变量就能用。


🎬 个人主页: 源码骑士

专栏传送门: 《Android开发基础》《python基础课程》

⭐️热衷从源码视角拆解技术底层原理,将复杂架构讲得通俗易懂


🎬 源码骑士的简介:

5年Android Framework系统开发经验,曾主导多项系统级性能优化专项

技术栈覆盖Android系统全链路(Binder/Handler/AMS/WMS/启动流程)及Java后端全家桶(Spring + MyBatis + Redis + Oracle)

累计产出原创技术文章100+篇,文章以源码拆解为特色,被读者评价为"看一篇胜过啃一周文档"


导入语

上篇你的 Django 镜像已经瘦到 180MB。但光有镜像不够------生产环境 Django 需要数据库、需要缓存、需要反向代理。如果每个服务都手动 docker run 配对应端口和网络,很容易出错。docker-compose 把多个 Docker 容器的配置写在一个 YAML 文件里------docker-compose up -d 一条命令全跑起来。


1 ~> 完整的 docker-compose.yml

yaml 复制代码
version: "3.8"

services:
  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASSWORD}
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql              # 数据持久化
    healthcheck:                                # 健康检查------告知 Django 何时可以启动
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    restart: always
    ports:
      - "6379:6379"

  web:
    build: .
    restart: always
    ports:
      - "8000:8000"
    env_file:
      - .env                                    # 从 .env 读环境变量
    depends_on:
      db:
        condition: service_healthy             # 等 MySQL healthcheck 通过后才启动
      redis:
        condition: service_started
    command: >
      sh -c "python manage.py migrate &&
             gunicorn myproject.wsgi:application --bind 0.0.0.0:8000 --workers 4"

  nginx:
    image: nginx:alpine
    restart: always
    ports:
      - "80:80"                                # 公网监听 80 端口
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf     # 挂载自定义 Nginx 配置
      - static_volume:/app/static              # 静态文件挂载
    depends_on:
      - web

volumes:
  mysql_data:
  static_volume:

2 ~> 关键配置逐条说明

2.1 depends_on + healthcheck------启动顺序不是单纯等待

depends_on 只保证启动的先后顺序,不保证数据库已准备好接受连接。加上 condition: service_healthy 结合 MySQL 的 healthcheck 才能保证 Django 启动时数据库已能用。

2.2 volumes------数据不随容器销毁而丢失

yaml 复制代码
volumes:
  - mysql_data:/var/lib/mysql

没有这行的话,每次 docker-compose down 数据库数据都被清空。加了 volumes 后,数据库文件存在 Docker 管理的卷中------重启不丢失。

2.3 静态文件------Nginx 代理和 collectstatic

Django 生产环境不能用它自带的 runserver 处理静态文件。Nginx 直接响应 /static/ 请求,Gunicorn 只处理动态请求:

nginx 复制代码
server {
    listen 80;
    server_name example.com;

    location /static/ {
        alias /app/static/;          # Nginx 直接返回静态文件
    }

    location / {
        proxy_pass http://web:8000;  # 动态请求转发给 Gunicorn
    }
}

3 ~> 生产环境完整启动流程

bash 复制代码
# 1. 构建并启动所有服务
docker-compose up -d --build

# 2. 收集静态文件(如果在 Dockerfile 中没有做)
docker-compose exec web python manage.py collectstatic --noinput

# 3. 创建超级用户
docker-compose exec web python manage.py createsuperuser

# 4. 查看所有服务状态
docker-compose ps

# 5. 查看 Django 日志
docker-compose logs -f web

思考 && 总结

Docker 部署 Django 的核心四步:

  1. 写好 Dockerfile------多阶段构建、slim 基础镜像、无缓存 pip 安装。
  2. 编写 docker-compose.yml------定义服务、控制启动顺序、持久化数据。
  3. Nginx 反向代理------静态文件由 Nginx 直接返回,动态请求转发 Gunicorn。
  4. 环境变量从 .env 管理------生产密码不进代码仓库。

结尾

Docker 部署上下篇完结。感谢阅读!

源码骑士 --- 源码级拆解,从底层看透技术

👀 关注:跟博主一起从源码视角深耕底层原理

❤️ 点赞:让优质内容被更多人看见

收藏:核心知识点存好,随用随查

💬 评论:分享你的经验或疑问,一起交流

🔄 一键四连:别忘了给博主一键四连!

🗡️ 寄语 :一条 docker-compose up -d 背后,是四个服务无缝协作的编排。

结语:Django 生产部署到这里就完整了。下篇讲日志------print 不是日志。一键四连!

相关推荐
至乐活着2 小时前
Docker Compose多服务编排实战:从零搭建Node.js+MySQL+Redis全栈应用
docker·微服务·devops·容器编排·compose
木雷坞2 小时前
Firecrawl Docker Compose 自托管排查:镜像、Redis、队列和 Playwright
redis·docker·容器·firecrawl
whyfail3 小时前
Colima:把 Docker Desktop 从 Mac 上“瘦身”的那把刀
macos·docker·容器
码云骑士3 小时前
23-Django-ORM的N+1问题-select_related与prefetch_related详解
后端·python·django
人工智能培训3 小时前
数字孪生的未来发展方向探析
gpt·深度学习·机器学习·容器·知识图谱
大佐不会说日语~4 小时前
在 Windows 本地用 Docker 部署向量模型(bge-m3)
windows·docker·容器·llm·ollama
摸摸芋5 小时前
Django框架(1)
后端·python·django
xsc-xyc5 小时前
CasaOS + Docker 挂载外接硬盘部署 Jellyfin 私人影院
运维·docker·容器
码云骑士5 小时前
27-Docker部署Django(上)-从2GB到180MB的镜像瘦身实战
docker·容器·django