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

📅 2026/6/25 4:02:32
28-Docker部署Django(下)-docker-compose编排与静态文件处理
文章目录Docker 部署 Django下docker-compose 编排——Django MySQL Redis 一键启动导入语1 ~ 完整的 docker-compose.yml2 ~ 关键配置逐条说明2.1 depends_on healthcheck——启动顺序不是单纯等待2.2 volumes——数据不随容器销毁而丢失2.3 静态文件——Nginx 代理和 collectstatic3 ~ 生产环境完整启动流程思考 总结结尾Docker 部署 Django下docker-compose 编排——Django MySQL Redis 一键启动文章简介上篇把 Django 镜像从 2GB 瘦身到 180MB。下篇用docker-compose.yml把 Django、MySQL、Redis、Nginx 四个服务编排在一起——一个docker-compose up -d就全跑起来。重点讲服务之间的依赖顺序控制depends_onhealthcheck、数据库数据持久化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.ymlversion:3.8services: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:3306volumes:-mysql_data:/var/lib/mysql# 数据持久化healthcheck:# 健康检查——告知 Django 何时可以启动test:[CMD,mysqladmin,ping,-h,localhost]interval:10stimeout:5sretries:5redis:image:redis:7-alpinerestart:alwaysports:-6379:6379web:build:.restart:alwaysports:-8000:8000env_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 4nginx: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_onhealthcheck——启动顺序不是单纯等待depends_on只保证启动的先后顺序不保证数据库已准备好接受连接。加上condition: service_healthy结合 MySQL 的healthcheck才能保证 Django 启动时数据库已能用。2.2volumes——数据不随容器销毁而丢失volumes:-mysql_data:/var/lib/mysql没有这行的话每次docker-compose down数据库数据都被清空。加了volumes后数据库文件存在 Docker 管理的卷中——重启不丢失。2.3 静态文件——Nginx 代理和collectstaticDjango 生产环境不能用它自带的 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 的核心四步写好 Dockerfile——多阶段构建、slim 基础镜像、无缓存 pip 安装。编写 docker-compose.yml——定义服务、控制启动顺序、持久化数据。Nginx 反向代理——静态文件由 Nginx 直接返回动态请求转发 Gunicorn。环境变量从 .env 管理——生产密码不进代码仓库。结尾Docker 部署上下篇完结。感谢阅读源码骑士 — 源码级拆解从底层看透技术关注跟博主一起从源码视角深耕底层原理❤️点赞让优质内容被更多人看见⭐收藏核心知识点存好随用随查评论分享你的经验或疑问一起交流一键四连别忘了给博主一键四连️寄语一条docker-compose up -d背后是四个服务无缝协作的编排。结语Django 生产部署到这里就完整了。下篇讲日志——print 不是日志。一键四连