问题
I am trying to run docker-compose with two .net core console applications having dependency of rabbitMQ, I am using Docker with Windows.
I have added to console application, as described on RabbitMQ official docs https://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html
Outside of both applications I have added docker-compose.yml
Folder structure:
1. Send
- Send.cs (as it is in RabbitMQ docs)
- Send.csproj
Dockerfile
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 as build-env WORKDIR /app # Copy the project file and restore the dependencies COPY *.csproj ./ RUN dotnet restore # Copy the remaining source files and build the application COPY . ./ RUN dotnet publish -c Release -o out # Build the runtime image FROM mcr.microsoft.com/dotnet/core/sdk:2.2 WORKDIR /app COPY --from=build-env /app/out . ENTRYPOINT ["dotnet", "Send.dll"]
2. Recieve
Recieve.cs (as it is in RabbitMQ docs)
Recieve.csproj
Dockerfile (Same as Sender Dockerfile except Send replaced with Recieve)
3. Docker-compose.yml
version: '3'
services:
rabbitmq:
image: rabbitmq:3-management
ports:
- "5672:5672"
- "15672:15672"
container_name: rabbitmq
hostname: my-rabbit
Send:
image: sender
build:
context: ./Send
dockerfile: Dockerfile
depends_on:
- rabbitmq
Reciever:
image: reciever
build:
context: ./Recieve
dockerfile: Dockerfile
depends_on:
- rabbitmq
Error Thrown
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
回答1:
For making Docker containers able to communicate with each other, you need to set them in the same network. On your docker-compose.yml
add the following:
version: '3'
services:
rabbitmq:
image: rabbitmq:3-management
ports:
- "5672:5672"
- "15672:15672"
container_name: rabbitmq
hostname: my-rabbit
networks:
- my-network-name
Send:
image: sender
build:
context: ./Send
dockerfile: Dockerfile
depends_on:
- rabbitmq
networks:
- my-network-name
Reciever:
image: reciever
build:
context: ./Recieve
dockerfile: Dockerfile
depends_on:
- rabbitmq
networks:
- my-network-name
networks:
my-network-name:
driver: bridge
As you can see, all the containers are in the same network, and they can communicate in the next way:
http://<container_name>:<port>
So if you want the Sender sends a message to RabbitMQ then:
amqp://rabbitmq:5672
If you use localhost
as an IP inside any container, it will use its loopback interface, receiving the request itself.
回答2:
Victor's answer was also helpful but, problem was the rabbitmq starting later, while send and receiver started before.
While I restarted the same stopped sender and receiver container, it was working as expected(because the rabbitmq container was up). So I have added the retry policies on container, found from here.
The final version of my docker-compose file is looking like below, and is working fine. version: '3' services:
rabbitmq:
image: rabbitmq:3-management
ports:
- "5672:5672"
- "15672:15672"
container_name: rabbitmq
hostname: my-rabbit
networks:
- my-network-name
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:15672"]
interval: 30s
timeout: 10s
retries: 5
Send:
image: sender
build:
context: ./Send
dockerfile: Dockerfile
depends_on:
- rabbitmq
restart: on-failure
networks:
- my-network-name
links:
- rabbitmq
Reciever:
image: reciever
build:
context: ./Recieve
dockerfile: Dockerfile
depends_on:
- rabbitmq
restart: on-failure
networks:
- my-network-name
links:
- rabbitmq
networks:
my-network-name:
driver: bridge
来源:https://stackoverflow.com/questions/56901780/rabbitmq-client-throwing-error-while-running-docker-compose-up-command