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

Docker环境下Celery无法向RabbitMQ发送任务求助

Celery在Docker中发送邮件出现[Errno 111] Connection refused的排查方案

核心原因分析

出现连接拒绝错误,本质是Celery容器无法访问配置的邮件服务器,结合你Windows本地正常、Docker部署失败的场景,主要排查以下几个方向:

1. 邮件服务器地址配置错误

Windows本地测试时用的localhost/127.0.0.1指向宿主机,但Docker容器内的localhost是容器自身,并非宿主机:

  • 若邮件服务跑在宿主机,Windows/macOS的Docker Desktop可直接用host.docker.internal作为宿主机别名;Linux环境需用宿主机的局域网IP(如192.168.x.x)
  • 若邮件服务也是Docker容器,直接用容器名称作为主机名(前提是和Celery在同一个Docker网络)

2. 端口或防火墙限制

  • 检查宿主机防火墙是否开放了邮件服务的端口(SMTP常用25、465、587),允许Docker容器的IP段访问
  • 若使用第三方邮件服务商(如QQ、网易邮箱),确认是否开启了SMTP服务,以及是否用对了加密端口(465为SSL、587为TLS)

3. Docker网络连通性问题

  • 查看docker-compose.yml的网络配置,确保Celery容器和邮件服务所在网络连通:若邮件服务是容器,要放在同一个networks下;若为宿主机,容器网络模式避免使用完全隔离的配置
  • 进入Celery容器内部手动测试连通性:
    docker exec -it <celery容器名> bash
    # 用telnet测试端口连通
    telnet <SMTP主机> <端口>
    # 或用nc工具
    nc -zv <SMTP主机> <端口>
    
    如果连不通,直接定位为网络问题,而非代码问题

4. 环境变量传递错误

检查docker-compose.yml是否正确传递了邮件相关环境变量,避免容器内仍使用本地的localhost配置。示例:

services:
  celery:
    environment:
      - SMTP_HOST=host.docker.internal
      - SMTP_PORT=587
      - SMTP_USER=your-email@example.com
      - SMTP_PASSWORD=your-auth-code

快速验证步骤

  1. 将任务中的SMTP主机地址替换为宿主机IP或host.docker.internal
  2. 在容器内测试连通性,确认能访问邮件服务器端口
  3. 重启Celery容器,重新执行邮件发送任务

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:30:11