You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Docker中无停机重启Django-Gunicorn服务?

无停机重启Django项目的实现方案

针对你当前使用Gunicorn+Docker Compose的部署场景,有两种可靠的无停机重启方案:

一、利用Gunicorn的平滑重启特性

Gunicorn本身支持通过发送HUP信号实现优雅重启,旧Worker会处理完当前请求后退出,新Worker启动就绪后再接管流量,全程不会中断服务。

操作步骤:

  1. 单独执行数据库迁移(建议将migrate从容器启动命令中移出,放到部署流程里,避免重复执行):
    docker-compose exec web python manage.py migrate
    
  2. 发送HUP信号给Gunicorn主进程:
    docker-compose exec web pkill -HUP gunicorn
    
    或直接指定容器名操作:
    docker 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项目中添加健康检查接口,确保容器就绪后才会被流量接管:

  1. 在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)
    
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:01:08