【问题标题】:Can't create connection to RabbitMq instance in Docker无法在 Docker 中创建与 RabbitMq 实例的连接
【发布时间】:2021-12-27 09:58:02
【问题描述】:

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

搬运工拉rabbitmq
docker run -d --hostname my-rabbit --name bunny-queue rabbitmq:3

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

节点:rabbit@my-rabbit
数据库目录:/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 字段尝试了不同的值(有和没有显式端口)。我用谷歌搜索了抛出的确切异常(没有一个指定的端点是可达的)。我以前从未遇到过这部分的问题,所以我觉得这与我在 Docker 中本地运行兔子有关。最接近的命中是this issue,但对于远程服务器,当我运行本地默认值时,如官方文档中所示。 Someone suggests做工厂全金属护套配置。我没能让它这样工作,我觉得官方文档中的默认值应该适用于基本的 scrio,这意味着问题出在其他地方。

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

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

不确定如何进一步调查。

【问题讨论】:

    标签: c# docker .net-core rabbitmq


    【解决方案1】:

    您有多种选择:

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

    作为 #1 的示例,兔子应该使用以下命令执行。

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

    那么,在工厂中,需要传递本地环境的主机。

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

    【讨论】:

    • 这是非常有条理和清晰的。我解释它的方式,#1 是保持东西解耦,除了暴露的确切端口。其余的正在使兔子和发布者成为公共网络的一部分(有点)。我宁愿让东西尽可能地隔离,所以暴露端口是要走的路。但是,当我使用显式端口绑定运行时(第二次运行,包括管理,我连接了 5672),我没有让错误消失。还是我在这个过程中遗漏了什么?
    • 只是为了不误导你。我现在运行了命令docker run -detach --hostname rabbitmq --publish 5672:5672 --name bunny rabbitmq:3,我在 Docker 客户端中看到了端口绑定。仍然,同样的错误。如何确认问题是(或不是)我机器的 Docker 客户端上设置 RabbitMq 的方式?
    • 没关系。我才意识到你指的是什么,伙计。我应该使用 localhost 作为工厂参数 并且 在 Docker 客户端中运行兔子时显式公开端口。在我接受之前,我想修改一下你的答案。有些人不喜欢别人篡改他们的贡献,所以我先征求许可,以示尊重。
    • 请注意,选项 3 和 4 比选项 1 更“解耦”。选项 1 在主机上“全局”公开端口,任何可以访问主机的应用程序都可以连接到它们。使用 3 或 4 意味着只有同一 docker 网络中的应用程序才能访问您的服务,恕我直言,这更清楚,并且不需要您的主机上可用的端口。
    • 感谢您的评论。如果我要在与 RabbitMq 相同的 docker 网络 中执行发布者和消费者,那我也需要在 Docker 下执行这两个,对吗?目前,我更喜欢在本地运行它们以将复杂性保持在最低限度以避免混淆,因为 Docker 不是我最强大的套件(目前)。但是您的观点是有效的(并且值得欢迎)。还是我误会了?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多