无法在 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
不确定如何进一步调查。
您有多种选择:
- 将容器的端口绑定到您主机的端口,然后连接到您主机的端口。要将容器端口绑定到主机端口,请在启动容器时使用
-p
开关
- 运行 您的 docker 容器处于“主机”网络模式并连接到主机的端口。这可以通过指定
--network host
选项来实现。您的应用程序的所有端口都将可用,就像您在主机上本地启动应用程序一样。
- 创建一个 docker 网络并 运行 RabbitMQ 和您的应用程序都在同一个网络中。连接到 rabbitmq 容器的端口。要创建一个 docker 网络,运行
docker network create name
然后用 --network name
. 启动你的容器
- 在 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();
我已关注 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 本地的兔子有关。最接近的命中是
我还尝试启动另一个包含管理工具的图像 here。当我访问(作为访客)时,我看到 AMQP 协议绑定到端口 :: 上的 5672。据我所知,没有错误、警告或问题报告。
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.9-management
不确定如何进一步调查。
您有多种选择:
- 将容器的端口绑定到您主机的端口,然后连接到您主机的端口。要将容器端口绑定到主机端口,请在启动容器时使用
-p
开关 - 运行 您的 docker 容器处于“主机”网络模式并连接到主机的端口。这可以通过指定
--network host
选项来实现。您的应用程序的所有端口都将可用,就像您在主机上本地启动应用程序一样。 - 创建一个 docker 网络并 运行 RabbitMQ 和您的应用程序都在同一个网络中。连接到 rabbitmq 容器的端口。要创建一个 docker 网络,运行
docker network create name
然后用--network name
. 启动你的容器
- 在 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();