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

Docker Compose下Flask路由无法通过容器名连接Redis与Celery

问题描述

在Docker Compose环境中遇到以下异常:

  • Flask(web容器)的flask shell中可正常运行Celery共享任务,且使用容器名redis能正常连接Redis
  • 但在Flask路由中调用Celery任务时超时,直接测试Redis连接时,使用容器名redis会出现DNS解析超时错误,仅通过Redis容器IP连接正常
  • 调用Celery任务task_test.delay()时也出现相同的连接超时问题

解决方案

1. 统一容器网络配置

确保web、redis、celery容器都加入同一个自定义Docker网络(默认bridge网络的DNS解析稳定性较差):

  • 在docker-compose.yml中显式定义自定义网络并关联所有服务:
version: '3.8'
services:
  web:
    build: ./web
    networks:
      - app-network
    # 其他配置(端口、环境变量等)
  redis:
    image: redis:alpine
    networks:
      - app-network
    # 其他配置
  celery:
    build: ./celery
    networks:
      - app-network
    # 其他配置

networks:
  app-network:
    driver: bridge
  • 重新部署容器:docker-compose down && docker-compose up -d

2. 校验Celery配置的正确性

确保Flask应用中Celery的broker地址使用容器名,且配置在全局生效(避免路由中使用错误的Celery实例):

  • 示例Celery初始化代码:
# Flask配置文件
CELERY_BROKER_URL = 'redis://redis:6379/0'
CELERY_RESULT_BACKEND = 'redis://redis:6379/0'

# 初始化Celery
from celery import Celery

def make_celery(app):
    celery = Celery(
        app.import_name,
        broker=app.config['CELERY_BROKER_URL'],
        backend=app.config['CELERY_RESULT_BACKEND']
    )
    celery.conf.update(app.config)
    return celery

# 在应用工厂中绑定Celery实例
celery = make_celery(app)
  • 确认路由中调用任务时,使用的是上述全局初始化的celery实例,而非临时创建的新实例。

3. 检查容器内DNS配置

进入web容器,验证DNS服务器指向Docker内置的DNS服务(通常为127.0.0.11):

  • 进入容器:docker exec -it <web容器名称> /bin/bash
  • 查看DNS配置:cat /etc/resolv.conf
    正常输出应包含nameserver 127.0.0.11
  • 若DNS配置异常,重启web容器:docker-compose restart web

4. 排查容器名冲突或设置网络别名

  • 执行docker ps检查是否有其他容器占用redis名称,若有则修改目标容器名称
  • 可在docker-compose.yml中给Redis容器设置网络别名,确保解析唯一性:
services:
  redis:
    image: redis:alpine
    networks:
      app-network:
        aliases:
          - redis-server

随后将Celery配置中的broker地址改为redis://redis-server:6379/0


内容的提问来源于stack exchange,提问作者Nicholas G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:56:05