连接被拒绝:无法从 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}
;`
这里的 HOST
是 RABBITMQ_DEFAULT_HOST=rabbitmq
,正如我在下面的 docker-compose
中设置的那样。
这些是从我检查过的 .env
文件中提取的,NodeJS 应用程序可以很好地读取它们。
到目前为止我测试过的东西:
- 我可以看到 rabbitmq 容器 运行ning 并准备好在端口
5672
: 上进行连接
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
我可以使用我通过 env 变量设置的自定义 user/pass 通过网络浏览器在端口 15672
上访问 RabbitMQ 管理 UI。我必须配置 NGINX 反向代理但它有效。
相关作品的 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
- 确保 username/password 没有任何可能破坏字符串的奇怪字符,所以只使用 test:test 之类的东西,但仍然没有运气。
如果有人 运行 之前对此有任何想法或建议,我将不胜感激,因为我很困惑!谢谢
- 除默认网络外,我没有配置任何 Docker 网络。当我执行
docker network inspect app_default
时,我可以看到为该网络列出的 rabbitmq
和 api-client
容器。
我发现了问题:我需要让 NodeJS 应用等待一段时间才能尝试连接到 RabbitMQ 容器。我放了一个setTimeout
等待几分钟就可以成功连接了。
我不知道有更好的等待方式。我之前尝试过 wait-for-it
,也许我会编写一个特定于我的设置的自定义 bash 脚本,以便在一段时间后仅启动 NodeJS 容器。
我无法将 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}
;`
这里的 HOST
是 RABBITMQ_DEFAULT_HOST=rabbitmq
,正如我在下面的 docker-compose
中设置的那样。
这些是从我检查过的 .env
文件中提取的,NodeJS 应用程序可以很好地读取它们。
到目前为止我测试过的东西:
- 我可以看到 rabbitmq 容器 运行ning 并准备好在端口
5672
: 上进行连接
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
我可以使用我通过 env 变量设置的自定义 user/pass 通过网络浏览器在端口
15672
上访问 RabbitMQ 管理 UI。我必须配置 NGINX 反向代理但它有效。相关作品的
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
- 确保 username/password 没有任何可能破坏字符串的奇怪字符,所以只使用 test:test 之类的东西,但仍然没有运气。
如果有人 运行 之前对此有任何想法或建议,我将不胜感激,因为我很困惑!谢谢
- 除默认网络外,我没有配置任何 Docker 网络。当我执行
docker network inspect app_default
时,我可以看到为该网络列出的rabbitmq
和api-client
容器。
我发现了问题:我需要让 NodeJS 应用等待一段时间才能尝试连接到 RabbitMQ 容器。我放了一个setTimeout
等待几分钟就可以成功连接了。
我不知道有更好的等待方式。我之前尝试过 wait-for-it
,也许我会编写一个特定于我的设置的自定义 bash 脚本,以便在一段时间后仅启动 NodeJS 容器。