【问题标题】:RabbitMq - Docker-compose - How to fix 'Connection refused 127.0.0.1:5672' exceptionRabbitMq - Docker-compose - 如何修复“连接被拒绝 127.0.0.1:5672”异常
【发布时间】:2020-03-06 23:53:54
【问题描述】:

我在 Stack Overflow 上尝试了几种可能的解决方案,但似乎没有什么对我有用。

我正在使用 RabbitMQ 开发微服务。该解决方案包含多个项目并且运行没有任何问题,但是一旦我使用docker-compose 选项构建项目,Visual Studio 就会引发以下异常:

RabbitMQ.Client.Exceptions.BrokerUnreachableException ExtendedSocketException:连接被拒绝 127.0.0.1:5672

在我的解决方案中,我有三个项目通过 RabbitMQ 相互通信。

以下是我的 YAML 文件的代码。

我的 docker-compose.yaml:

version: '3.4'

services:    
  rabbitmq:
    hostname: webnet
    image: rabbitmq:3.7.2-management
    ports:
      - "15672:15672"
      - "5672:5672"    
    networks:
      - webnet

  sql-server-db:
    container_name: sql-server-db
    image: microsoft/mssql-server-linux:2017-latest
    ports:
      - "1433:1433"
    environment:
      SA_PASSWORD: "customerdbalten@123"
      ACCEPT_EULA: "Y"
    networks:
      - webnet

  myproject.simulation.api:
    image: ${DOCKER_REGISTRY-}myprojectsimulationapi
    build:
      context: .
      dockerfile: myproject.Simulation.Api/Dockerfile
    links:
      - rabbitmq
    ports:
      - '5000'
    networks:
      - webnet

  myproject.updateservice.api:
    image: ${DOCKER_REGISTRY-}myprojectupdateserviceapi
    build:
      context: .
      dockerfile: myproject.updateservice.Api/Dockerfile
    links:
      - rabbitmq
      - sql-server-db
    ports:
      - '5050'
    networks:
      - webnet

  myproject.web:
    image: ${DOCKER_REGISTRY-}myprojectweb
    build:
      context: .
      dockerfile: MyProject.Web/Dockerfile
    links:
      - rabbitmq
    ports:
      - '5001'
    networks:
      - webnet

networks:
  webnet:
    driver: bridge

我的 Docker 文件:

我的 Dockerfile 如下所示:

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY 
MyProject.UpdateService.Api/MyProject.UpdateService.Api.csproj MyProject.UpdateService.Api/
COPY MyProject.Common/MyProject.Common.csproj MyProject.Common/
RUN dotnet restore MyProject.UpdateService.Api/MyProject.UpdateService.Api.csproj
COPY . .
WORKDIR /src/MyProject.UpdateService.Api
RUN dotnet build MyProject.UpdateService.Api.csproj -c Release -o /app

FROM build AS publish
RUN dotnet publish MyProject.UpdateService.Api.csproj -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "MyProject.UpdateService.Api.dll"]

我还创建了另一个简单的解决方案,只有两个项目——发送者和接收者——使用 RabbitMQ。此解决方案在docker-composeing 时会引发相同的异常,否则它只会运行。 YAML 文件只有自动生成的代码。

【问题讨论】:

  • 你需要在你的应用程序中更新你的连接字符串,它不应该指向127.0.0.1:5672,它应该是rabbitmq:5672。请记住 localhost in contains 表示此容器,而不是 rabbitmq 容器。更好地展示您的连接线。
  • in service with in this docker-compose 如果想和rabbitmq连接应该像rabbitmq:5672,记住在service to service通信中你必须使用service name或者container name来连接。
  • 没错,您必须使用rabbitmq:5672 而不是127.0.0.1:5672。是的,请更新appsettings.json file: Hostname: rabbitmq:5672
  • 嗨,@daudnadeem!实际上,我对 Dockerization 很陌生,所以我的问题很可能没有完全的意义,因为我也不确定我是否以正确的方式创建 docker。那么您能否让我知道问题的哪一部分不清楚,以便我向您解释?
  • @halfer,没问题,亲爱的。那个时候我已经纠正了自己。谢谢你再次提醒我。\

标签: docker docker-compose rabbitmq asp.net-core-2.2


【解决方案1】:

通过讨论,我们发现 rabbitMQ 容器没有运行,因为主机上已经运行了 rabbitMQ 服务。

你有两个选择,停止主机 RabbitMQ 服务,然后尝试连接 rabbitMQ 容器。

Hostname: rabbitmq:5672

或者如果你想连接 Host RabbitMQ 服务那么你可以使用

Hostname: host.docker.internal
#or
Hostname: HOST_IP

我想从容器连接到主机上的服务

主机有一个不断变化的 IP 地址(如果您没有网络,则没有 使用权)。从 18.03 起,我们的建议是连接到 特殊的 DNS 名称`host.docker.internal,解析为内部 主机使用的 IP 地址。这是出于开发目的,将 不适用于 Docker Desktop 之外的生产环境 窗户。

网关也可以通过gateway.docker.internal.访问

docker-for-windows-networking

【讨论】:

    猜你喜欢
    • 2021-01-13
    • 2019-07-31
    • 2018-10-24
    • 2023-01-10
    • 2021-10-12
    • 1970-01-01
    • 2019-11-29
    • 2020-06-07
    • 1970-01-01
    相关资源
    最近更新 更多