Rabbitmq - Docker 连接在端口 5672 上被拒绝

问题描述 投票:0回答:3

我有一个用 Go 编写的 Web 服务器,可以与 Rabbitmq 和 Mongodb 交互。当我在没有容器的机器上运行所有这些服务器时(rabbitmq url:

amqp://guest:guest@localhost:5672
),它工作正常。

现在我尝试在单独的容器中运行所有这些服务。这是我的撰写文件

version: '3'
services:
  rabbitmq:
    image: rabbitmq
    container_name: rabbitmq
    ports:
      - 5672:5672
  mongodb:
    image: mongo
    container_name: mongodb
    ports:
      - 27017:27017
  web:
    build: .
    image: palash2504/collect
    container_name: collect-server
    restart: on-failure
    ports:
      - 3000:3000
    depends_on:
      - rabbitmq
      - mongodb
    links: ["rabbitmq", "mongodb"]

networks:
  default:
    external:
      name: collect-net

这是我的服务器 dockerfile

FROM golang

ENV GO111MODULE=on


WORKDIR /app

COPY go.mod .
COPY go.sum .

RUN go mod download

COPY . .

RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build

EXPOSE 3000


ENTRYPOINT ["/app/social-cops-assignment"]

我的服务器似乎无法连接到rabbitmq。这是我在运行

docker compose up
时收到的日志消息,并且我的配置中的rabbitmq url 是
amqp://guest:guest@rabbitmq:5672
(因为容器名称是rabbitmq,我将 localhost 替换为rabbitmq,以便我的服务器能够找到rabbitmq 容器)

collect-server | 2019/03/10 08:50:51 Failed to connect to AMQP compatible broker at: amqp://guest:guest@rabbitmq:5672/, with errror: dial tcp 172.24.0.3:5672: connect: connection refused

但是rabbitmq似乎已经准备好接受连接了。这是来自

docker-compose up

的rabbitmq 日志的最后两行
rabbitmq    | 2019-03-10 08:50:55.164 [info] <0.489.0> accepting AMQP connection <0.489.0> (172.24.0.4:49784 -> 172.24.0.3:5672)
rabbitmq    | 2019-03-10 08:50:55.205 [info] <0.489.0> connection <0.489.0> (172.24.0.4:49784 -> 172.24.0.3:5672): user 'guest' authenticated and granted access to vhost '/'

我是 docker-networking 的新手,我不知道我做错了什么?是我正在使用的rabbitmq地址还是我需要一些关于rabbitmq的额外配置或暴露一些端口?

docker docker-compose rabbitmq docker-network
3个回答
8
投票

当定位服务时,不要附加端口。使用

rabbitmq
,而不是
rabbitmq:5672

我已经在您的问题中回答了这个问题:如何从应用程序服务器容器连接到rabbitmq容器

所有 docker 网络配置(在上述修复之后)似乎都很好。剩余的错误可能是由于与源代码和/或身份验证数据/设置相关的身份验证问题造成的。


3
投票

为我解决了两件事:

  1. 确保不要使用 localhost,而是使用容器的名称。对我来说这是
    amqp
amqp:
    image: rabbitmq:3-management-alpine
    ports:
      - "5672:5672"
      - "15672:15672"

那么连接字符串将是

amqp://guest:guest@amqp/


0
投票

我在使用 RabbitMQ 和 docker-compose 时也遇到了麻烦。如果你的代码在没有容器的情况下运行良好,那么看看这两件事:

  1. 如上所述,您需要使用服务名称(如果您在 docker compose 文件中指定,也可以使用容器名称)来定位另一个容器中的服务。这里有很好的解释:https://docs.docker.com/compose/networking/。文档指示将端口附加到服务中,即使它似乎没有也可以工作。

  2. 这就是我遇到的问题:rabbitMQ 服务需要一段时间才能启动,因此其他服务(容器)会在其运行之前尝试连接。主要原因是

    depends_on
    子句仅保证rabbitMQ已启动,但不能保证它正在运行且健康。要解决此问题,您可以根据 RabbitMQ 将
    restart: unless-stopped
    restart: on-failure
    添加到其他服务。

另一种可能的解决方案是在 RabbitMQ 服务中添加

healthcheck
子句,并在其他服务中检查它,如下所示:

depends_on:
    rabbitmq:
        condition: service_healthy
© www.soinside.com 2019 - 2024. All rights reserved.