无法在 Docker 中创建与 RabbitMq 实例的连接

Can't create connection to RabbitMq instance in Docker

我已关注 How to use this image,拉取并执行了 Docker 中的最新图像。发件人应用程序未 dockerized,因此在本地环境中 运行。

docker pull rabbitmq
docker run -d --hostname my-rabbit --name bunny-queue rabbitmq:3

这似乎是 运行 的预期,我可以在日志中验证主机名和数据库是否与文章中描述的一样。我没有看到任何错误记录,只有一些关于重新初始化索引的警告。

node : rabbit@my-rabbit
database dir : /var/lib/rabbitmq/mnesia/rabbit@my-rabbit

然后,我设置了一个工厂并尝试创建一个连接(如图所示 here)。

ConnectionFactory factory = new() { HostName = "my-rabbit" };
using IConnection connection = factory.CreateConnection();
using IModel channel = connection.CreateModel();

我已经为 HostName 字段尝试了不同的值(有和没有显式端口)。我用谷歌搜索了抛出的确切异常(None 的指定端点是可达的)。我以前从未遇到过这部分的问题,所以我感觉它与我 运行 Docker 本地的兔子有关。最接近的命中是 but for a remote server, while I'm running the local, default values as exemplified in the official docs. Someone suggests 做工厂的全金属外壳配置。我没能让它那样工作,我感觉官方文档中的默认值应该适用于基本的 scario,这意味着问题出在其他地方。

我还尝试启动另一个包含管理工具的图像 here。当我访问(作为访客)时,我看到 AMQP 协议绑定到端口 :: 上的 5672。据我所知,没有错误、警告或问题报告。

docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.9-management

不确定如何进一步调查。

您有多种选择:

  1. 将容器的端口绑定到您主机的端口,然后连接到您主机的端口。要将容器端口绑定到主机端口,请在启动容器时使用 -p 开关
  2. 运行 您的 docker 容器处于“主机”网络模式并连接到主机的端口。这可以通过指定 --network host 选项来实现。您的应用程序的所有端口都将可用,就像您在主机上本地启动应用程序一样。
  3. 创建一个 docker 网络并 运行 RabbitMQ 和您的应用程序都在同一个网络中。连接到 rabbitmq 容器的端口。要创建一个 docker 网络,运行 docker network create name 然后用 --network name.
  4. 启动你的容器
  5. docker-compose 文件中定义容器。文件中的所有容器将自动共享同一网络。您也可以定义自定义网络并将某些容器仅连接到特定网络。

作为#1 的示例,应使用以下内容执行兔子。

docker run -detach --hostname rabbitmq --publish 5672:5672 --name bunny rabbitmq:3

然后在factory中,需要传入本地环境的host

ConnectionFactory factory = new() { HostName = "localhost" };
using IConnection connection = factory.CreateConnection();