Masstransit无法从docker容器访问主机RabbitMQ

Masstransit无法从docker容器访问主机RabbitMQ,rabbitmq,.net-core,masstransit,Rabbitmq,.net Core,Masstransit,我创建了一个带有docker支持的简单.net核心控制台应用程序。以下内容 Masstransit代码无法连接到主机上的RabbitMQ实例。但使用RabitMq.Client的类似实现能够连接到主机RabbitMQ实例 大众运输公司 MassTransit.RabbitMqTransport.RabbitMqConnectionException:连接 失败:ctas@192.168.0.9:5672/ ---> RabbitMQ.Client.Exceptions.BrokerRunReac

我创建了一个带有docker支持的简单.net核心控制台应用程序。以下内容
Masstransit代码无法连接到主机上的RabbitMQ实例。但使用RabitMq.Client的类似实现能够连接到主机RabbitMQ实例

大众运输公司

MassTransit.RabbitMqTransport.RabbitMqConnectionException:连接 失败:ctas@192.168.0.9:5672/ ---> RabbitMQ.Client.Exceptions.BrokerRunReachableException:

主机ip:192.168.0.9

使用大众运输

        string rabbitMqUri = "rabbitmq://192.168.0.9/";
        string userName = "ctas";
        string password = "ctas@123";
        string assetServiceQueue = "hello";


       var bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
       {
           var host = cfg.Host(new Uri(rabbitMqUri), hst =>
           {
               hst.Username(userName);
               hst.Password(password);
           });

           cfg.ReceiveEndpoint(host,
                assetServiceQueue, e =>
                {
                    e.Consumer<AddNewAssetReceivedConsumer>();

                });

       });


        bus.Start();
        Console.WriteLine("Service Running.... Press enter to exit");
        Console.ReadLine();
        bus.Stop();
Docker文件

FROM microsoft/dotnet:1.1-runtime
ARG source
WORKDIR /app
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", "TestClient.dll"]

也尝试在MassTransit配置中使用虚拟主机,但不确定为什么决定忽略它

var host = cfg.Host("192.168.0.9", "watcherindustry", hst =>
{
     hst.Username(userName);
     hst.Password(password);
});

请看Alexey Zimarev对您的问题的评论,如果您的兔子在容器上运行,那么它应该在docker compese文件中,然后在端点定义中使用该条目连接到兔子,因为docker创建了一个内部网络,您对该网络的源代码不可知

rabbitmq:
     container_name: "rabbitmq-yournode01"
     hostname: rabbit
     image: rabbitmq:3.6.6-management
     environment:
        - RABBITMQ_DEFAULT_USER=yourusergoeshere
        - RABBITMQ_DEFAULT_PASS=yourpasswordgoeshere
        - RABBITMQ_DEFAULT_VHOST=vhost
     volumes:
        - rabbit-volume:/var/lib/rabbitmq
     ports:
        - "5672:5672"
        - "15672:15672"
在应用程序设置中,您应该有以下内容:

 "ConnectionString": "host=rabbitmq:5672;virtualHost=vhost;username=yourusergoeshere;password=yourpasswordgoeshere;timeout=0;prefetchcount=1",
如果您使用EasyNEtQ,您可以:

 _bus = RabbitHutch.CreateBus(_connectionString); // The one above
我希望有帮助

Juan

我创建了一个,并能够使用masstransit的预览包连接我的主机

在docker中启动rabbitmq并在主机上公开端口

docker run -d -p 5672:5672 -p 15672:15672 --hostname my-rabbit --name some-rabbit rabbitmq:3-management
构建并运行控制台应用程序

docker build -t dotnetapp .
docker run -d -e RABBITMQ_URI=rabbitmq://guest:guest@172.17.0.2:5672 --name some-dotnetapp dotnetapp
要验证您的接收消息,请运行

docker logs some-dotnetapp --follow
您应该看到以下输出

Application is starting...
Connecting to rabbitmq://guest:guest@172.17.0.2:5672
Received: Hello, World [08/12/2017 04:35:53]
Received: Hello, World [08/12/2017 04:35:58]
Received: Hello, World [08/12/2017 04:36:03]
Received: Hello, World [08/12/2017 04:36:08]
Received: Hello, World [08/12/2017 04:36:13]
...
注:

172.17.0.2是我的兔子容器ip地址,但您可以将其替换为您的机器ip地址 是以来宾作为用户名和密码登录的rabbitmq管理控制台


最后是一个非常有用的应用程序,可以直观地查看本地docker环境。

感谢您的回复。我设法解决了这个问题。我的调查结果如下

要连接到另一个docker容器上的rabbitmq实例,必须将它们移动/连接到同一网络。这样做 创作一部新作品

   docker network create -d bridge my_bridge
将app和rabbitmq容器连接到同一网络

   docker network connect my_bridge <container name>
docker网络连接我的网桥
对于masstransit uri,请在该网络或容器名称上使用rabbitmq容器IP

从docker容器上的应用程序连接主机的rabbitmq实例。
masstransit uri应该包括机器名(我尝试了IP,但没有成功)

您没有连接到masstransit中的虚拟主机,为什么?感谢您的回复。但无论有无虚拟宿主,它都不起作用。我还使用了主机重载来反对基于URI的重载。如您所见,异常是由RabbitMQ客户端库生成的,因此我不认为这与MassTransit有关。您是说MassTransit.RabbitMQ,我使用()。否则我没有任何RabbitMQ库引用。不,显然异常是
RabbitMQ.Client.Exceptions.BrokerRunReachableException
某些库被合并。您也没有得到对Newtonsoft.Json的引用,但是它被广泛使用。谢谢,但是RabbitMQ在主机上。在docker容器内运行的应用程序正在尝试使用masstransit访问该RabbitMQ实例。Masstransit连接在该设置中失败,但RabbitMq客户端成功。
   docker network connect my_bridge <container name>