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
快速验证步骤
- 将任务中的SMTP主机地址替换为宿主机IP或
host.docker.internal - 在容器内测试连通性,确认能访问邮件服务器端口
- 重启Celery容器,重新执行邮件发送任务
内容的提问来源于stack exchange,提问作者WideWood
相关产品推荐
相关产品推荐

