Docker环境下Celery连接Redis报名称解析临时失败问题排查
错误触发原因
- 根因是域名解析失败:当前Celery worker是直接在宿主机环境通过命令行启动的,没有加入Redis所在的
carvann_networkDocker自定义网络,宿主机不识别Docker内部DNS维护的redis容器主机名,解析redis:6381时直接抛出Temporary failure in name resolution错误。 - 存在端口配置认知偏差:docker-compose中Redis的端口映射规则
6381:6379,表示将宿主机的6381端口转发到Redis容器内部的6379监听端口——容器内部服务默认监听6379,仅容器外(宿主机、未接入同一Docker网络的服务)访问时才需要用宿主机IP+6381,同一Docker网络内的容器互访应该直接用服务名+容器内监听端口6379。 - Celery配置存在前置错误:代码中读取了
CELERY_BROKER环境变量,但初始化Celery实例时传入的BROKER_URL、RESULT_BACKEND均为未定义变量,该问题会在连接问题修复后触发命名错误,需同步修正。
可行修复方案
根据Celery worker的运行环境二选一调整即可:
- 方案1:保持在宿主机直接启动Celery worker
- 修改
CELERY_RESULT连接地址为redis://:sOmE__sEcUrE_pAsS@127.0.0.1:6381,替换无法解析的redis主机名为本地回环地址,走宿主机的端口映射访问Redis。 - 同步检查
CELERY_BROKER配置,若地址中使用了credit-rabbitmq这类Docker内部主机名,同样替换为127.0.0.1加RabbitMQ映射到宿主机的对应端口。 - 修正Celery初始化代码的变量引用错误:将
broker=BROKER_URL改为broker=os.getenv('CELERY_BROKER'),backend=RESULT_BACKEND改为backend=os.getenv('CELERY_RESULT'),保证配置值正确传入。
- 修改
- 方案2:将Celery服务容器化部署(与Redis、RabbitMQ同网络)
- 在docker-compose中新增Celery服务配置,将其加入
carvann_network外部网络,和Redis、RabbitMQ服务处于同一网络平面。 - 修改
CELERY_RESULT连接地址为redis://:sOmE__sEcUrE_pAsS@redis:6379,同一Docker网络内可直接通过服务名redis解析到容器地址,直接访问容器内6379端口即可,无需走宿主机端口映射。 - 同步修正Celery初始化代码的变量引用问题,同方案1第3点。
- 在docker-compose中新增Celery服务配置,将其加入
- 配置修改完成后,可先在worker运行环境执行端口连通性测试,确认Redis、RabbitMQ地址可通后再启动worker。
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

