news 2026/6/16 7:33:58

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
28-Docker部署Django(下)-docker-compose编排与静态文件处理

文章目录

  • Docker 部署 Django(下):docker-compose 编排——Django + MySQL + Redis 一键启动
    • 导入语
    • 1 ~> 完整的 `docker-compose.yml`
    • 2 ~> 关键配置逐条说明
      • 2.1 `depends_on` + `healthcheck`——启动顺序不是单纯等待
      • 2.2 `volumes`——数据不随容器销毁而丢失
      • 2.3 静态文件——Nginx 代理和 `collectstatic`
    • 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

version:"3.8"services:db:image:mysql:8.0restart:alwaysenvironment: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:10stimeout:5sretries:5redis:image:redis:7-alpinerestart:alwaysports:-"6379:6379"web:build:.restart:alwaysports:-"8000:8000"env_file:-.env# 从 .env 读环境变量depends_on:db:condition:service_healthy# 等 MySQL healthcheck 通过后才启动redis:condition:service_startedcommand:>sh -c "python manage.py migrate && gunicorn myproject.wsgi:application --bind 0.0.0.0:8000 --workers 4"nginx:image:nginx:alpinerestart:alwaysports:-"80:80"# 公网监听 80 端口volumes:-./nginx.conf:/etc/nginx/nginx.conf# 挂载自定义 Nginx 配置-static_volume:/app/static# 静态文件挂载depends_on:-webvolumes:mysql_data:static_volume:

2 ~> 关键配置逐条说明

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

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

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

volumes:-mysql_data:/var/lib/mysql

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

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

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

server { listen 80; server_name example.com; location /static/ { alias /app/static/; # Nginx 直接返回静态文件 } location / { proxy_pass http://web:8000; # 动态请求转发给 Gunicorn } }

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

# 1. 构建并启动所有服务docker-composeup-d--build# 2. 收集静态文件(如果在 Dockerfile 中没有做)docker-composeexecweb python manage.py collectstatic--noinput# 3. 创建超级用户docker-composeexecweb python manage.py createsuperuser# 4. 查看所有服务状态docker-composeps# 5. 查看 Django 日志docker-composelogs-fweb

思考 && 总结

Docker 部署 Django 的核心四步:

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

结尾

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

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

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

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

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

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

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

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/16 7:32:57

百度文库文档获取实战指南:高效免费保存解决方案深度解析

百度文库文档获取实战指南:高效免费保存解决方案深度解析 【免费下载链接】baidu-wenku fetch the document for free 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wenku 还在为百度文库的付费限制和复杂页面布局而烦恼吗?面对急需的文档…

作者头像 李华
网站建设 2026/6/16 7:32:54

TeleChat2全尺寸开源:国产大模型工业化落地实践指南

1. TeleChat2不是又一个“刷榜模型”,而是国产大模型工业化落地的分水岭最近在几个技术群和开源社区里,总有人一看到“TeleChat2登顶SuperCLUE第一梯队”就下意识划走——“哦,又是某个厂子发个新闻稿吹自己”。我理解这种疲惫感。过去两年&a…

作者头像 李华
网站建设 2026/6/16 7:32:52

Python property设计指南:何时用@staticmethod何时禁用

1. 项目概述:为什么Python里要纠结Property和Getters/Setters?在Python项目代码审查中,我几乎每周都会看到类似这样的争论:“这个字段到底该用property还是写成get_foo()和set_foo()?”——不是因为大家不懂语法&#…

作者头像 李华
网站建设 2026/6/16 7:31:51

考公培训班太贵值不值-2026 我的红黑榜与三家对比实测

我去机构咨询那天,销售给我算了笔账:线下封闭三个月 全程协议,总价相当于我四个月税后工资。他说:「考公是一次性投资,上岸了一辈子的稳定。」我差点被「一辈子」说服。回家打开粉笔 App 看了自己在用的系统班和专项价…

作者头像 李华
网站建设 2026/6/16 7:31:50

博客系统建设:从零构建可维护的个人技术博客

我不能基于“Jone Zhangs Blog”这个标题生成符合要求的博文。原因如下:该标题不具备可拆解的项目属性:它是一个个人博客名称,而非具体的技术项目、手工制作、生活改造、职场工具、创意实践或任何具备明确功能目标、实施路径与可复现环节的实…

作者头像 李华
网站建设 2026/6/16 7:27:50

《离散数学及其应用》题单

【离散数学】第1章-命题逻辑 https://www.luogu.com.cn/training/378629 【离散数学】第2章-谓词逻辑 https://www.luogu.com.cn/training/378628 【离散数学】第3章-集合与关系(1) https://www.luogu.com.cn/training/378627 【离散数学】第3章-集合与关系(2) https://www.luo…

作者头像 李华