我正在尝试使用两个依赖RabbitMQ的.net核心控制台应用程序运行docker-compose,我将Docker与Windows一起使用。
我已添加到控制台应用程序,如RabbitMQ官方文档https://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html
所述在这两个应用程序之外,我还添加了docker-compose.yml
文件夹结构:
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"]
Recieve.cs(与RabbitMQ文档中的一样)
Recieve.csproj
Dockerfile(与发件人Dockerfile相同,除了Send被Recieve替换)
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
引发错误
未处理的异常: RabbitMQ.Client.Exceptions.BrokerUnreachableException:无 指定的端点可达---> System.AggregateException:一个 或更多错误发生。 (连接失败)---> RabbitMQ.Client.Exceptions.ConnectFailureException:连接失败 ---> System.Net.Internals.SocketExceptionFactory + ExtendedSocketException: 连接被拒绝127.0.0.1:5672
答案 0 :(得分:2)
要使Docker容器能够相互通信,您需要将它们设置在同一网络中。在您的docker-compose.yml
上添加以下内容:
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
如您所见,所有容器都在同一网络中,并且它们可以通过以下方式进行通信:
http://<container_name>:<port>
因此,如果您希望发件人向 RabbitMQ 发送消息,则:
amqp://rabbitmq:5672
如果您将localhost
用作任何容器中的IP,它将使用其回送接口来接收请求本身。
答案 1 :(得分:1)
维克多的回答也很有帮助,但是问题是,rabbitmq稍后启动,而发送和接收器之前启动。
虽然我重新启动了相同的已停止的发送方和接收方容器,但是它按预期方式工作(因为rabbitmq容器已启动)。 因此,我添加了从here找到的容器重试策略。
我的docker-compose文件的最终版本如下所示,并且工作正常。 版本:“ 3” 服务:
profilePicture