Docker环境Scrapyrt与Web服务连接失败:ConnectionRefusedError求助
嘿,这个问题我太熟了——你遇到的ConnectionRefusedError: [Errno 111]本质上是Docker容器网络的坑,核心原因就是你在Celery代码里用了localhost!
为什么会报错?
在Docker容器的语境里,localhost指的是容器自身,而不是你的宿主机或者其他服务容器。你的Celery跑在web服务容器里,当它发起http://localhost:9080请求时,其实是在尝试访问web容器自己的9080端口,而不是scrapyrt容器的端口,自然会被拒绝连接。
具体解决方案
按下面的步骤调整,就能解决问题:
替换localhost为Docker服务名
Docker Compose会自动为同一网络下的容器创建DNS解析,你直接用scrapyrt服务的名称就能访问它。比如你的docker-compose.yml里scrapyrt服务块叫scrapyrt,那把Celery代码里的请求地址改成:response = requests.get('http://scrapyrt:9080/crawl.json', params)注意:这里的服务名要和你docker-compose.yml里scrapyrt的服务名称完全一致,比如如果服务块写的是
scrapyrt-service: ...,那地址就要改成http://scrapyrt-service:9080。核对scrapyrt的端口配置
确认你的scrapyrt服务确实在监听9080端口,docker-compose.yml里的配置应该类似这样:scrapyrt: build: ./scrapyrt # 或者使用scrapyrt的官方镜像 ports: - "9080:9080" command: scrapyrt -p 9080确保内部端口(命令里的
-p 9080)和你请求的端口一致,而且服务已经正常启动(你提到Twisted服务已启动,这一步快速核对即可)。确认容器在同一网络
Docker Compose默认会创建一个默认网络,所有服务自动加入,但如果你的web或scrapyrt指定了自定义网络,一定要确保它们在同一个网络里:networks: my-app-network: driver: bridge services: web: # 其他配置 networks: - my-app-network scrapyrt: # 其他配置 networks: - my-app-network只有在同一网络下,服务之间才能通过服务名互相访问。
验证方法
你可以先在web容器里手动测试连接,确认网络没问题:
docker exec -it <你的web容器名称> curl http://scrapyrt:9080
如果能返回scrapyrt的响应页面,说明网络通了,再调整Celery代码里的地址就可以正常工作了。
内容的提问来源于stack exchange,提问作者8-Bit Borges

