docker容器之间的连接拒绝rabbitMQ

z31licg0  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(1)|浏览(202)

我试图建立一个简单的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,我在这里找到的所有修复程序似乎都表明我做的一切都是正确的。我错过了什么?

ldxq2e6h

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文件

version: '3'
services:
  rabbitmq:
    build: ./rabbitmq
    container_name: 'rabbitmq'
    environment:
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=pass
    ports:
      - 5672:5672
      - 15672:15672
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:15672"]
      interval: 30s
      timeout: 10s
      retries: 5

  producerexpress:
    build: ./service1
    restart: on-failure
    container_name: producerexpress
    ports:
      - 3000:3000
    environment:
      - PORT=3000
    depends_on:
      rabbitmq:
        condition: service_healthy

为了进行健康检查,我们需要rabbitmq映像中的curl包,因此添加以下Dockerfile

FROM rabbitmq:3-management-alpine
RUN apk update
RUN apk add curl
EXPOSE 5672 15672

最后,要使此更改兼容,请创建以下目录结构

./docker-compose.yml
./rabbitmq/
 --- Dockerfile
./service1/
 --- Dockerfile

相关问题