Joshlo
Joshlo

Reputation: 794

RabbitMq refuses connection when run in docker

My docker-compose file looks like this:

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

If I type http://localhost:15672 in the browser, I get the rabbitmq interface, but if I tries to connect from my Explore project like this:

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();
}

Then it breaks in the line

var rabbit = factory.CreateConnection();

with the error saying

ExtendedSocketException: Connection refused 127.0.0.1:5672 System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)

ConnectFailureException: Connection failed RabbitMQ.Client.EndpointResolverExtensions.SelectOne(IEndpointResolver resolver, Func selector)

BrokerUnreachableException: None of the specified endpoints were reachable RabbitMQ.Client.ConnectionFactory.CreateConnection(IEndpointResolver endpointResolver, string clientProvidedName)

Upvotes: 5

Views: 18185

Answers (3)

Phani Bushan
Phani Bushan

Reputation: 61

Follow instructions on this post.

Just to benefit people that stumble upon this question. The --link feature is now considered legacy and is a prime candidate to be deprecated by docker. The easiest way is to use

depends_on: In order to do this, its recommended to first create a network like so"

docker network create <network_name>

Then use docker-compose up to spawn services that bind with each other. Look at the example below where I've bound my spring-boot app to rabbit-mq. You can clone my repo from here

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

See how I've created a network called resolute and bound the apps to the same network. I've also given my rabbitmq-container a hostname. This is because docker now prepends the container name and that makes it difficult to bind services by name.

Upvotes: 0

migueloop
migueloop

Reputation: 541

I had the same issue with docker-compose.

I solved it by with hostname:

  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

Upvotes: 0

Joshlo
Joshlo

Reputation: 794

As my comment under the question suggested, it's because the "localhost" defined in the web application part is it's containers localhost, and not the docker host..

just needed to change

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

to

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

Upvotes: 11

Related Questions