如何在Docker中无停机重启Django-Gunicorn服务?
无停机重启Django项目的实现方案
针对你当前使用Gunicorn+Docker Compose的部署场景,有两种可靠的无停机重启方案:
一、利用Gunicorn的平滑重启特性
Gunicorn本身支持通过发送HUP信号实现优雅重启,旧Worker会处理完当前请求后退出,新Worker启动就绪后再接管流量,全程不会中断服务。
操作步骤:
- 单独执行数据库迁移(建议将migrate从容器启动命令中移出,放到部署流程里,避免重复执行):
docker-compose exec web python manage.py migrate - 发送HUP信号给Gunicorn主进程:
或直接指定容器名操作:docker-compose exec web pkill -HUP gunicorndocker exec django_service pkill -HUP gunicorn
二、Docker Compose滚动更新(自动化部署场景)
如果需要更新镜像、调整配置,或者希望更自动化的无停机部署,可以通过配置Docker Compose的滚动更新策略,确保始终有可用的服务实例。
修改后的docker-compose.yml示例:
version: "3.6" services: web: build: . restart: always command: bash -c "gunicorn tehosmotr.wsgi:application --workers=5 --bind 0.0.0.0:8888" volumes: - ./django:/code ports: - "8003:8888" deploy: replicas: 2 # 至少部署2个副本,滚动更新时保持一个在线 update_config: parallelism: 1 # 每次仅更新1个容器 delay: 10s # 等待新容器就绪的间隔 order: start-first # 先启动新容器,再关闭旧容器 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8888/health"] # 健康检查接口 interval: 5s timeout: 5s retries: 3
配套准备:
需要在Django项目中添加健康检查接口,确保容器就绪后才会被流量接管:
- 在
views.py中添加视图:from django.http import HttpResponse from django.views.decorators.http import require_GET @require_GET def health_check(request): return HttpResponse("OK", status=200) - 在
urls.py中注册路由:path('health/', health_check, name='health_check'),
执行滚动更新:
# 先执行数据库迁移 docker-compose exec web python manage.py migrate # 触发滚动更新(构建新镜像并替换旧容器) docker-compose up --no-deps --build --force-recreate web
方案对比
- Gunicorn平滑重启:适合代码小范围更新,操作最快,无需重启容器
- 滚动更新:适合镜像/配置变更,自动化程度高,可靠性更强,适合生产环境大规模部署
内容的提问来源于stack exchange,提问作者Yuretz
相关产品推荐
相关产品推荐

