This sample demonstrates how to use Docker Linux containers to host NServiceBus endpoints communicating over the RabbitMQ transport. While this sample uses Docker Compose to demonstrate how to orchestrate a multi-container application, the containers are compatible withe other orchestration technologies, for example Kubernetes.
The endpoints use the .NET SDK Container Building Tools to enable the creation of containers via the dotnet publish
command. See the Microsoft tutorial and customization documentation for more details.
Prerequisites
To containerize a .NET app using dotnet publish
:
- .NET 8.0.200 SDK (or higher): Check your installed SDK version with
dotnet --info
. - Docker Community Edition: Ensure Docker is installed and running on your system.
Running the sample
Running the sample involves building the container images and starting the multi-container application.
Building container images
Build the container images by using the following command:
dotnet publish Docker.sln -f net8.0 --os linux --arch x64 /t:PublishContainer
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.
Orchestration
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:
services:
sender:
image: sender
depends_on:
rabbitmq:
condition: service_healthy
receiver:
image: receiver
depends_on:
rabbitmq:
condition: service_healthy
rabbitmq:
image: "rabbitmq:3-management"
ports:
- "15672:15672"
- "5672:5672"
healthcheck:
test: rabbitmq-diagnostics check_port_connectivity
interval: 30s
timeout: 30s
retries: 3
Transport configuration
Endpoints configure the RabbitMQ transport to use the broker instance running in the rabbitmq
container:
var transport = new RabbitMQTransport(RoutingTopology.Conventional(QueueType.Quorum), connectionString);