dotnetcore 控制台应用程序:rabbitmq 与 docker 连接被拒绝 127.0.0.1:5672

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

来自控制台应用程序的兔子连接:

 var factory = new ConnectionFactory()
                {
                    HostName = Environment.GetEnvironmentVariable("RabbitMq/Host"),
                    UserName = Environment.GetEnvironmentVariable("RabbitMq/Username"),
                    Password = Environment.GetEnvironmentVariable("RabbitMq/Password")
                };

                using (var connection = factory.CreateConnection()) // GETTING ERROR HERE
                using (var channel = connection.CreateModel())
                {
                    channel.QueueDeclare(queue: "rss",
                                         durable: fa...

我收到此错误:

未处理的异常: RabbitMQ.Client.Exceptions.BrokerUnreachableException:没有一个 指定端点可达 ---> RabbitMQ.Client.Exceptions.ConnectFailureException:连接失败 ---> System.Net.Internals.SocketExceptionFactory + ExtendedSocketException: 连接被拒绝 127.0.0.1:5672

我的 docker-compose.yml 文件:

version: '3'

services:
  message.api:
    image: message.api 
    build:
      context: ./message_api
      dockerfile: Dockerfile
    container_name: message.api
    environment:
      - "RabbitMq/Host=rabbit"
      - "RabbitMq/Username=guest"
      - "RabbitMq/Password=guest"
    depends_on:
      - rabbit

  rabbit:
    image: rabbitmq:3.7.2-management
    hostname: rabbit
    ports:
      - "15672:15672"
      - "5672:5672"

  rsscomparator:
    image: rsscomparator 
    build:
      context: ./rss_comparator_app
      dockerfile: Dockerfile
    container_name: rsscomparator
    environment:
      - "RabbitMq/Host=rabbit"
      - "RabbitMq/Username=guest"
      - "RabbitMq/Password=guest"
    depends_on:
      - rabbit

我正在使用 dotnetcore 控制台应用程序。当我在 docker 中使用这个应用程序时,出现错误。我可以访问rabbitmq网络浏览器(http://192.168.99.100:15672),但应用程序无法访问。

rabbitmq .net-core docker-compose console-application
2个回答
5
投票

您正在尝试从容器应用程序连接到rabbitmq应用程序。 您尝试在控制台应用程序容器中使用

127.0.0.1:5672
来实现此目的。

但这指向此容器内的本地主机,而不是主机上的本地主机。

您正在使用相同的 docker-compose 部署服务,而无需指定网络设置,这意味着它们都部署在同一个 docker 桥接网络内。这将允许您让容器使用其容器或服务名称相互通信。

因此请尝试连接到

rabbit:5672
而不是
127.0.0.1:5672
。该名称将被转换为容器 IP (172.xx.xx.xx),这意味着您将在容器之间创建私有连接。


0
投票

在通过 docker-compose 文件启动容器后尝试连接

rabbit:5672
时,我仍然遇到同样的问题。这不是这里的原始问题,但我遇到了相同的“连接被拒绝”错误。

我发现rabbitMQ服务需要一段时间才能启动,因此其他服务(容器)会在它运行之前尝试连接。主要原因是

depends_on
子句只保证rabbitMQ启动,但不保证它运行且健康。

要解决此问题,您可以根据 RabbitMQ 将

restart: unless-stopped
restart: on-failure
设置为其他服务。

rabbit:
    image: rabbitmq:3-management
    ports:
        - "15672:15672"
        - "5672:5672"

gobackend:
    build: ./go-backend
    ports:
        - "8080:8080"
    restart: unless-stopped
    depends_on:
        - rabbit

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

healthcheck
子句并在其他服务中检查它,就像这样

rabbit:
    image: rabbitmq:3-management
    ports:
        - "15672:15672"
        - "5672:5672"
    healthcheck:
        test: rabbitmq-diagnostics -q ping
        interval: 10s
        timeout: 5s
        retries: 2
        start_period: 5s

gobackend:
    build: ./go-backend
    ports:
        - "8080:8080"
    depends_on:
        rabbit:
            condition: service_healthy
© www.soinside.com 2019 - 2024. All rights reserved.