在 docker 容器中运行 RabbitMQ

Mon*_*caS 0 c# rabbitmq docker dockerfile docker-compose

我对 RabbitMQ 还很陌生,我正在开发一个 POC 来运行在 docker 容器中使用 RabbitMQ 的 C# 解决方案。

我设法编写了 docker-compose.yml、dockerfile 并运行了 RabbitMQ。但是,我的解决方案无法访问 RabbitMQ 主机。我想我可能缺少一些配置,但我不知道是什么。

docker-compose.yml

version: '3.4'

services:
  rabbit-sender:
    image: rabbit-sender
    container_name: rabbit-sender
    build: 
        context: ../SenderRabitMQ
        dockerfile: debug.Dockerfile
    env_file: common.env
    networks:
      - rabbitPoc
    expose:
      - "80"

  rabbit-receiver:
    image: rabbit-receiver
    container_name: rabbit-receiver
    build: 
      context: ../ReceiveRabitMQ
      dockerfile: debug.Dockerfile
    env_file: common.env
    networks:
      - rabbitPoc
    expose:
      - "80"

  rabbitmq:
    image: rabbitmq:3.7.15
    hostname: rabbitmq
    build: 
      context: rabbit
      dockerfile: debug.Dockerfile
    ports:
      - "5672:5672"
      - "15672:15672"
    volumes:
      - "./enabled_plugins:/etc/rabbitmq/enabled_plugins"
Run Code Online (Sandbox Code Playgroud)

调试.Dockerfile

Install RabbitMQ
FROM ubuntu:14.04.1

CMD docker pull dockerfile/rabbitmq
CMD docker build -t="dockerfile/rabbitmq" github.com/dockerfile/rabbitmq

FROM dotnet-core-sdk-2.1-debug:latest AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY SenderRabitMQ/SenderRabitMQ.csproj SenderRabitMQ/
RUN dotnet restore SenderRabitMQ/SenderRabitMQ.csproj

# Copy everything else and build
COPY ./ ./
RUN dotnet publish SenderRabitMQ/SenderRabitMQ.csproj -c Debug -o out --no-restore

# Build runtime image
FROM dotnet-core-aspnet-2.1-debug:latest
WORKDIR /app

COPY --from=build-env /app/SenderRabitMQ/out .

ENTRYPOINT ["dotnet", "SenderRabitMQ.dll"]
Run Code Online (Sandbox Code Playgroud)

运行命令

docker run  --hostname myrabbit rabbitmq:3
Run Code Online (Sandbox Code Playgroud)

连接RabbitMQ


var factory = new ConnectionFactory() { HostName = "myrabbit:5672" , DispatchConsumersAsync = true };

Run Code Online (Sandbox Code Playgroud)

这是运行应该向队列发布消息的 RabbitSender 时收到的错误。

rabbit-sender      | Unhandled Exception: 
RabbitMQ.Client.Exceptions.BrokerUnreachableException: None of the 
specified endpoints were reachable ---> System.AggregateException: 
One or more errors occurred. (Connection failed) ---> 
RabbitMQ.Client.Exceptions.ConnectFailureException: Connection 
failed ---> 
System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: 
Connection refused 127.0.0.1:5672
Run Code Online (Sandbox Code Playgroud)

Llo*_*ell 6

您的 docker compose 将 RabbitMQ 服务主机名设置为 rabbitmq 而不是 myrabbit(这是您尝试连接的)。试试这个:

var factory = new ConnectionFactory() { HostName = "rabbitmq", port = 5672 , DispatchConsumersAsync = true };
Run Code Online (Sandbox Code Playgroud)

您还需要 Dockerfile rabbitmq 部分与其他服务位于同一网络上:

rabbitmq:
    image: rabbitmq:3.7.15
    hostname: rabbitmq
    build: 
      context: rabbit
      dockerfile: debug.Dockerfile
    ports:
      - "5672:5672"
      - "15672:15672"
    networks:
      - rabbitPoc
    volumes:
      - "./enabled_plugins:/etc/rabbitmq/enabled_plugins"
Run Code Online (Sandbox Code Playgroud)

希望有帮助!