我试图建立一个简单的docker-compose文件,其中包括一个rabbitmq容器和一个连接到rabbitmq的简单的express服务器。当我试图从我的express应用程序连接到rabbitmq时,我得到了以下错误:
Error: connect ECONNREFUSED 172.19.0.2:5672
at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1247:16) {
errno: -111,
code: 'ECONNREFUSED',
syscall: 'connect',
address: '172.19.0.2',
port: 5672
}
我手动检查了Docker网络的IP地址,以验证172.19.0.2确实是rabbitmq进程,它确实是。
下面是我的docker-compose:
version: '3'
services:
rabbitmq:
image: rabbitmq:3-management-alpine
container_name: 'rabbitmq'
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=pass
ports:
- 5672:5672
- 15672:15672
producerexpress:
build: ./service1
container_name: producerexpress
ports:
- 3000:3000
environment:
- PORT=3000
depends_on:
- rabbitmq
和Express应用程序及其Docker文件:
第一个
这是我第一次使用docker compose,我在这里找到的所有修复程序似乎都表明我做的一切都是正确的。我错过了什么?
1条答案
按热度按时间ldxq2e6h1#
TL;DR
depends_on
保证了服务启动的顺序,但这并不能保证它们启动的进程的任何内容。在这些情况下,您应该按照感兴趣的进程的
to take into account the health status
顺序展开depends_on
语句首先,您应该避免使cointainers的通信依赖于它们的IP地址,而是依赖于它们的服务名称,因为您使用的是docker compose。
意思是,代替
amqp://admin:pass@172.19.0.2:5672
您应该使用
amqp://admin:pass@rabbitmq:5672
接下来讨论核心问题,您的
producerexpress
依赖于rabbitmq
才能正常工作。因此,我们在
producerexpress
中添加了depends_on
语句来解决这个问题。您可以使用depends_on选项来控制服务的启动和关闭顺序。Compose永远会以相依性顺序启动和停止容器,...。但是,
for startup Compose does not wait until a container is “ready” (whatever that means for your particular application) - only until it’s running
。因此,你需要添加一个
health check
以保证rabbitmq process has started
成功,not just the container
。为了实现这一点,您应该修改
compose
文件为了进行健康检查,我们需要rabbitmq映像中的
curl
包,因此添加以下Dockerfile最后,要使此更改兼容,请创建以下目录结构