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

Docker环境Scrapyrt与Web服务连接失败:ConnectionRefusedError求助

解决Docker中Celery调用Scrapyrt出现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:20:53