This sample demonstrates how to use Docker Linux containers to host NServiceBus endpoints communicating over the RabbitMQ transport.
Prerequisites
This sample requires that the following tools are installed:
- .NET Core 7.0 SDK
- Docker Personal or higher
- If using Windows, configure Docker to use Linux containers to support the Linux-based RabbitMQ container
Running the sample
Running the sample involves building the container images and starting the multi-container application.
Building container images
Building the container images using the following command will dotnet publish
(which includes dotnet restore
and dotnet build
) the endpoints in addition to building the container images for both the Sender
and the Receiver
:
$ docker-compose build
Starting containers
When the container images are ready, the containers can be started:
$ docker-compose up -d
Observing containers
Both containers log to the console. These logs can be inspected:
$ docker-compose logs sender
$ docker-compose logs receiver
Stopping and removing containers
The containers can be stopped and removed:
$ docker-compose down
Code walk-through
This sample consists of Sender
and Receiver
endpoints exchanging messages using the RabbitMQ transport. Each of these three components runs in a separate Docker Linux container.
Endpoint Docker image
Each endpoint is a container built on top of the official mcr.
image from Docker Hub. The container image builds and publishes the endpoint binaries and then uses those artifacts to build the final container image:
FROM mcr.microsoft.com/dotnet/runtime:7.0 AS base
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY . .
WORKDIR /src/Receiver
RUN dotnet publish -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "Receiver.dll"]
Multi-container application
Endpoint container images for the Sender
and the Receiver
are combined with an official RabbitMQ image to create a multi-container application using Docker Compose:
version: "3.8"
services:
sender:
image: sender
build:
context: .
dockerfile: ./Sender/Dockerfile
depends_on:
- rabbitmq
receiver:
image: receiver
build:
context: .
dockerfile: ./Receiver/Dockerfile
depends_on:
- rabbitmq
rabbitmq:
image: "rabbitmq:3.11-management"
ports:
- "15672:15672"
- "5672:5672"
healthcheck:
test: ["CMD-SHELL", "if rabbitmqctl status; then \nexit 0 \nfi \nexit 1"]
interval: 10s
retries: 5
Transport configuration
Endpoints configure the RabbitMQ transport to use the broker instance running in the rabbitmq
container:
var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
transport.ConnectionString("host=rabbitmq");
transport.UseConventionalRoutingTopology(QueueType.Quorum);
Waiting for RabbitMQ broker to become available
Both endpoints block startup until the broker becomes available using the shared ProceedIfRabbitMqIsAlive
hosted service.
See the docker documentation for other options to control startup order.