连接被拒绝:无法从 NodeJS Docker 容器访问 RabbitMQ Docker 容器

Connection Refused: cannot access RabbitMQ Docker container from NodeJS Docker container

我无法将 Docker 容器 运行ning NodeJS 连接到另一个 docker 容器 运行ning RabbitMQ。

我用谷歌搜索并环顾四周,但没有看到任何特别针对我 运行 的问题。我不确定这是我遗漏的愚蠢的东西还是其他东西。

要从 NodeJS 连接,首先我尝试使用 ampqlib library. And that would give me a connection refused from NodeJS. So then I tried looking for other alternatives and found Rascal。它是 ampqlib 的包装器。我看到两个相同的错误:

Error: connect ECONNREFUSED 192.XXX.XXX.X:5672
    at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1195:16) {
  errno: -111,
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '192.XXX.XXX.X',
  port: 5672,
  broker: Symbol()
}

用于连接的来自 NodeJS 的连接字符串:

amqp://${process.env.RABBITMQ_DEFAULT_USER}:${process.env.RABBITMQ_DEFAULT_PASS}@${process.env.RABBITMQ_DEFAULT_HOST}:${process.env.RABBITMQ_DEFAULT_PORT};`

这里的 HOSTRABBITMQ_DEFAULT_HOST=rabbitmq,正如我在下面的 docker-compose 中设置的那样。

这些是从我检查过的 .env 文件中提取的,NodeJS 应用程序可以很好地读取它们。

到目前为止我测试过的东西:

  1. 我可以看到 rabbitmq 容器 运行ning 并准备好在端口 5672:
  2. 上进行连接
2022-05-27 15:16:06.422648+00:00 [info] <0.680.0> Ready to start client connection listeners
2022-05-27 15:16:06.429403+00:00 [info] <0.825.0> started TCP listener on [::]:5672
 completed with 4 plugins.
2022-05-27 15:16:06.627770+00:00 [info] <0.680.0> Server startup complete; 4 plugins started.
2022-05-27 15:16:06.627770+00:00 [info] <0.680.0>  * rabbitmq_prometheus
2022-05-27 15:16:06.627770+00:00 [info] <0.680.0>  * rabbitmq_management
2022-05-27 15:16:06.627770+00:00 [info] <0.680.0>  * rabbitmq_web_dispatch
2022-05-27 15:16:06.627770+00:00 [info] <0.680.0>  * rabbitmq_management_agent
  1. 我可以使用我通过 env 变量设置的自定义 user/pass 通过网络浏览器在端口 15672 上访问 RabbitMQ 管理 UI。我必须配置 NGINX 反向代理但它有效。

  2. 相关作品的 docker-compose 如下所示:

  #################
  ### rabbit mq ###
  #################
  rabbitmq:
    hostname: rabbitmq
    container_name: rabbitmq
    image: rabbitmq:management
    environment:
      RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER}
      RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS}
      RABBITMQ_DEFAULT_HOST: ${RABBITMQ_DEFAULT_HOST}
    ports:
      # AMQP protocol port
      - '5672:5672'
      # HTTP management UI
      - '15672:15672'

  ######################
  ### nodejs-client ####
  ######################
  api-client:
    container_name: api-client
    restart: unless-stopped
    build: ./packages/market/api-client
    env_file:
      - ./packages/market/api-client/.env
    depends_on:
      - rabbitmq
      - api
    links:
      - rabbitmq
      - api
  1. 确保 username/password 没有任何可能破坏字符串的奇怪字符,所以只使用 test:test 之类的东西,但仍然没有运气。

如果有人 运行 之前对此有任何想法或建议,我将不胜感激,因为我很困惑!谢谢

  1. 除默认网络外,我没有配置任何 Docker 网络。当我执行 docker network inspect app_default 时,我可以看到为该网络列出的 rabbitmqapi-client 容器。

我发现了问题:我需要让 NodeJS 应用等待一段时间才能尝试连接到 RabbitMQ 容器。我放了一个setTimeout等待几分钟就可以成功连接了。

我不知道有更好的等待方式。我之前尝试过 wait-for-it,也许我会编写一个特定于我的设置的自定义 bash 脚本,以便在一段时间后仅启动 NodeJS 容器。