当在docker中运行时,RabbitMq拒绝连接

5
我的docker-compose文件如下所示:
version: '2'

services:
  explore:
    image: explore
    build:
      context: ./Explore
      dockerfile: VsDockerfile
    environment:
      - "ElasticUrl=http://localhost:9200"
      - "RabbitMq/Host=localhost"
      - "RabbitMq/Username=guest"
      - "RabbitMq/Password=guest"
    networks:
      - localnet

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:5.4.3
    container_name: elasticsearch
    environment:
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ports:
      - 9200:9200
    volumes:
      - ./esdata:/usr/share/elasticsearch/data
    networks:
      - localnet

  rabbit:
    image: rabbitmq:3.6.7-management
    hostname: rabbit
    ports:
      - 15672:15672
      - 5672:5672
    networks:
      - localnet

networks:
  localnet:
    external:
      name: localnet

如果我在浏览器中输入http://localhost:15672,我会得到rabbitmq界面,但如果我尝试像这样从我的Explore项目连接:
public SqlToRabbitProcessor(SqlToRabbitRepository sqlToRabbitRepository)
{
    _sqlToRabbitRepository = sqlToRabbitRepository;

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

    var rabbit = factory.CreateConnection();
    channel = rabbit.CreateModel();
}

然后它在这一行中断了

var rabbit = factory.CreateConnection();

错误提示为:

ExtendedSocketException: 连接被拒绝 127.0.0.1:5672 System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)

ConnectFailureException: 连接失败 RabbitMQ.Client.EndpointResolverExtensions.SelectOne(IEndpointResolver resolver, Func selector)

BrokerUnreachableException: 没有可达的指定端点 RabbitMQ.Client.ConnectionFactory.CreateConnection(IEndpointResolver endpointResolver, string clientProvidedName)


嗯,我认为问题在于我的 Web 容器中调用了 localhost,但那不是主机的 localhost 而是容器的。 - Joshlo
3个回答

11

正如我在问题下的评论中所建议的那样,这是因为在Web应用程序部分定义的"localhost"是其容器的本地主机,而不是Docker主机。

只需要更改

- "ElasticUrl=http://localhost:9200"
- "RabbitMq/Host=localhost"

- "ElasticUrl=http://elasticsearch:9200"
- "RabbitMq/Host=rabbit"

0

我在使用docker-compose时遇到了同样的问题。

我通过使用主机名解决了这个问题:

  rabbit:
    hostname: rabbit
    command: sh -c "rabbitmq-plugins enable rabbitmq_management; rabbitmq-server"
    image: rabbitmq
    environment:
      RABBITMQ_DEFAULT_USER: admin
      RABBITMQ_DEFAULT_PASS: admin
    ports:
        - 5672:5672
        - 15672:15672

0

请按照此帖子上的说明进行操作。

为了让那些遇到这个问题的人受益,需要指出的是,--link 功能现在已被视为遗留功能,并且很可能会被 Docker 废弃。 最简单的方法是使用

depends_on: 为了实现这一点,建议首先创建一个网络,如下所示:

docker network create <network_name>

然后使用 docker-compose up 来生成与彼此绑定的服务。看下面的示例,我已将我的 spring-boot 应用程序绑定到 rabbit-mq。您可以从 这里 克隆我的 repo。

version: "3.1"
services:
  rabbitmq-container:
    image: rabbitmq:3.5.3-management
    hostname: rabbitmq-container
    ports:
      - 5673:5673
      - 5672:5672
      - 15672:15672
    networks:
      - resolute

  resolute-container:
    build: .
    ports:
      - 8080:8080
    environment:
      - spring_rabbitmq_host=rabbitmq-container
      - spring_rabbitmq_port=5672
      - spring_rabbitmq_username=guest
      - spring_rabbitmq_password=guest
      - resolute_rabbitmq_publishQueueName=resolute-run-request
      - resolute_rabbitmq_exchange=resolute
    depends_on:
      - rabbitmq-container
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - resolute

networks:
  resolute:
    external:
      name: resolute

看看我如何创建了一个名为resolute的网络,并将应用程序绑定到同一网络。我还给我的rabbitmq容器设置了一个hostname。这是因为docker现在会在容器名称前面添加前缀,这使得按名称绑定服务变得困难。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接