首页 > 解决方案 > ECONNREFUSED 在 Docker 容器内部;访问远程 API

问题描述

最近,我一直在构建一个 nodejs 机器人来在 phpbb 论坛上运行游戏。我让机器人在我的机器上本地运行(登录、发布、抓取线程等),所以很自然地,我已经开始对它进行 docker 化。

但是,即使从我的 docker 容器内部运行登录工作流,我ECONNREFUSED在尝试访问论坛的 api 时也会从容器内部收到错误。上述api没有官方文档,所以很多都是自我调查。

我正在使用 axios v0.19.2 + toughcookie v4.0.0 运行节点 v14.4.0 来处理请求。我能够从容器内部成功地使用相同的有效负载卷曲端点,所以我怀疑 axios/node.js 有什么东西让我头疼。我试图查看 docker 和 ECONNREFUSED 的其他问题,但在 stackoverflow 上的大多数问题都与容器间通信有关,而不是与外部 apis/访问有关的问题。

该容器以 root 用户身份运行,我没有设置任何类型的代理或不稳定的网络。

有没有人有任何建议或暗示?我的 docker-compose 非常简单,但我已将其包含在下面以供参考。

version: '3.2'
services:
  bot:
    build: .
    env_file:
      - .env
    ports:
      - '80:80'

任何提示或理论将不胜感激;我已经完成了我的清单!

干杯!

标签: node.jsdockerdocker-composeaxiosphpbb

解决方案


我假设您尝试从容器中访问主机。实现这一点的一种简单方法是使用主机网络而不是容器网络。尝试

version: '3.2'
services:
  network_mode: host
  bot:
    build: .
    env_file:
      - .env

更好的方法可能是将应用程序的其余部分也放入容器中,并在 Compose 中使用服务发现,例如

version: '3.2'
services:
  bot:
    build: .
    env_file:
      - .env
  webapp:
    ...

然后,您可以通过连接到上例中的主机名“webapp”来访问 PHP 应用程序。


推荐阅读