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

如何正确将Celery与Django项目进行Docker容器化配置?

Django + Celery Docker容器化解决方案

核心原则

容器遵循单进程职责,将Celery Worker从Django后端容器中独立出来,单独作为一个服务运行,避免进程冲突和启动顺序问题。

步骤1:复用现有后端镜像

你的Django后端镜像已经包含了所有依赖(包括Celery),无需重新构建新镜像,直接复用即可。

步骤2:修改docker-compose.yml,添加Celery Worker服务

在services节点下新增Celery Worker配置:

celery-worker:
    container_name: project-celery-worker
    build:
      context: .
      dockerfile: docker/backend/Dockerfile
    command: celery -A project worker --loglevel=INFO --concurrency=4
    volumes:
      - static:/app/backend/static
    depends_on:
      - database
      - redis
      - backend
    env_file:
      - ./backend/project/.env
    restart: unless-stopped

参数说明:

  • --concurrency=4:生产环境建议根据CPU核心数设置并发数,默认等于CPU核心数,可按需调整
  • depends_on:声明依赖关系,但仅保证启动顺序,不等待依赖服务完全就绪,需配合健康检查逻辑
  • restart: unless-stopped:确保Worker异常退出后自动重启,符合生产环境可靠性要求

步骤3:解决启动顺序问题(数据库就绪+迁移完成)

Celery Worker启动前需要数据库已就绪,且Django迁移已完成,这里提供两种方案:

方案A:手动执行迁移(推荐,符合生产最佳实践)

  1. 先启动数据库和后端服务:
    docker-compose up -d database backend
    
  2. 手动执行Django迁移:
    docker-compose exec backend python manage.py migrate
    
  3. 启动剩余服务(包括Celery Worker):
    docker-compose up -d
    

方案B:添加启动前检查脚本(自动等待依赖就绪)

  1. 在backend/scripts目录下创建wait-for-db.sh脚本:

    #!/bin/bash
    set -e
    
    # 等待数据库TCP端口就绪
    until nc -z database 5432; do
      echo "Waiting for database port to be ready..."
      sleep 2
    done
    
    # 检查数据库连接可用性
    until python -c "import psycopg2; psycopg2.connect(dbname='${DB_NAME}', user='${DB_USER}', password='${DB_PASSWORD}', host='database')"; do
      echo "Waiting for database connection to be ready..."
      sleep 2
    done
    
    # 检查迁移是否完成(可选,确保迁移完成后再启动Worker)
    until python manage.py showmigrations --plan | grep -q "No planned migrations"; do
      echo "Waiting for migrations to be completed..."
      sleep 2
    done
    
    echo "Database is ready and migrations are done. Starting Celery Worker..."
    

    注意:需要在requirements.txt中添加psycopg2-binary和netcat-openbsd(或对应系统的nc工具包)才能运行脚本。

  2. 修改Celery Worker的command,先执行检查脚本再启动Worker:

    celery-worker:
      # ... 其他配置不变
      command: bash -c "scripts/wait-for-db.sh && celery -A project worker --loglevel=INFO --concurrency=4"
    

步骤4:生产环境Celery优化配置

  • 日志优化:生产环境可将日志输出到文件,添加--logfile=/var/log/celery/worker.log,并在容器中创建日志目录(可在Dockerfile中添加RUN mkdir -p /var/log/celery)
  • 持久化日志:若需持久化Celery日志,在docker-compose中添加日志卷:
    celery-worker:
      # ... 其他配置不变
      volumes:
        - static:/app/backend/static
        - celery-logs:/var/log/celery
    # 在volumes节点下添加:
    volumes:
      # ... 现有卷
      celery-logs:
    
  • Docker环境无需系统服务:Docker容器本身就是独立的进程运行环境,直接前台启动Celery Worker即可,无需依赖systemd等系统服务,Docker会负责进程的生命周期管理。

步骤5:验证配置

  1. 启动所有服务后,检查Celery Worker是否正常运行:

    docker-compose logs celery-worker
    

    若看到类似[INFO] Connected to redis://redis:6379/0和[INFO] celery@project-celery-worker ready.的日志,说明启动成功。

  2. 编写测试任务验证执行:
    在Django项目中创建tasks.py:

    from celery import shared_task
    
    @shared_task
    def test_celery_task():
        print("Celery task executed successfully!")
        return True
    

    进入Django shell触发任务:

    docker-compose exec backend python manage.py shell
    >>> from project.tasks import test_celery_task
    >>> test_celery_task.delay()
    

    查看Celery日志,若能看到任务执行的输出,说明配置正常。


内容的提问来源于stack exchange,提问作者4bs3nt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:17:12