Docker容器连接本地主机的Rabbitmq被拒绝

24
我有一个运行着Java进程的Docker容器,我试图连接到运行在本地主机上的RabbitMQ。以下是我迄今为止所做的步骤:
在我的本地计算机(MacBook运行Docker版本1.13.0-rc3,构建4d92237,防火墙关闭),我已更新了rabbitmq_env.conf文件以删除RABBITMQ_NODE_IP_ADDRESS,因此我不必通过本地主机进行连接,并且我有一个管理员rabbitmq用户(不使用guest用户)。我已通过本地计算机上的telnet测试,没有问题 telnet <本地ip> 5672 在我的Docker容器内部:
能够ping本地IP并访问RabbitMQ管理API curl -i -u username:password http://local-ip:15672/api/vhosts 成功返回 [{"name":"/","tracing":false}] 当我尝试从容器内部进行telnet时,我收到“Connection closed by foreign host”错误消息。 查看rabbitmq.logs
= ERROR REPORT ==== closing AMQP connection <0.30526.1> (local-ip:53349 -> local-ip:5672): {handshake_timeout,handshake} 如果有用,这是我的Java堆栈跟踪:Caused by: java.net.ConnectException: Connection refused (Connection >refused) at java.net.PlainSocketImpl.socketConnect(Native Method) at >java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at >java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.>java:206) at >java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589)在com.rabbitmq.client.impl.FrameHandlerFactory.create(FrameHandlerFactory.java:32)处发生错误, 在com.rabbitmq.client.impl.recovery.RecoveryAwareAMQConnectionFactory.newConnection(RecoveryAwareAMQConnectionFactory.java:35)时创建新连接。 可以使用docker network inspect bridge命令检查网络配置信息。

我错过了什么?


“local-ip” 究竟是什么?你能提供运行容器时 docker ps 命令的输出,以及 docker inspect 命令的输出吗? - The_Tourist
这是我的本地IP地址,即192.168.1.XXX。 - CandiedCode
docker ps 容器 ID 镜像 命令 创建时间 状态 端口 名称 9722a49c4e99 e9096fc4f5ff "/bin/sh" 3 小时前 已运行 2 小时 5672/tcp, 7888/tcp testing - CandiedCode
4个回答

30

对我来说这很好用!

我安装了这张图片:

docker pull rabbitmq:3-management

并运行:

docker run -d --hostname haroldjcastillo --name rabbit-server -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin2017 -p 5672:5672 -p 15672:15672 rabbitmq:3-management

最重要的是添加连接和管理端口:-p 5672:5672 -p 15672:15672

在Docker中查看您的主机:

docker-machine ip

在我的情况下返回:

192.168.99.100

前往管理控制台:http://192.168.99.100:15672

对于Spring Boot,您可以进行以下配置:

spring.rabbitmq.host=192.168.99.100
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin2017
spring.rabbitmq.port=5672

祝一切顺利!


谢谢。我自己遇到了这种情况,感觉很愚蠢,没有意识到我必须打开端口:P - KdgDev
指定端口解决了我的连接问题。为什么在已经使用 docker run rabbitmq 暴露了5672端口的情况下,指定端口允许我连接? - jndietz

7
对于其他在寻找这个错误的人,我使用spring boot和rabbitmq在docker容器中,通过docker compose启动它们。我在spring应用程序中一直得到“org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused”的错误。
Rabbitmq主机名不正确。为了解决这个问题,我在spring应用程序配置中使用容器名称。将“spring.rabbitmq.host=my-rabbit”放入spring的“application.properties”(或“yml”文件)中,或者在“docker-compose.yaml”中添加“environment: SPRING_RABBITMQ_HOST: my-rabbit”到spring服务中。当然,“my-rabbit”是在“docker-compose.yaml”中描述的rabbitmq容器名称。

2
我正在使用带有rabbitmq:3-management的Linux容器的docker,并创建了基于dotnet core的Web API。在从We API操作方法调用时,我遇到了相同的问题,并将值更改为“host.docker.internal”。
以下情况对我有用:
1. 在IIS Express上使用“localhost” 2. 在从Visual Studio构建的Docker上使用“localhost” 3. 在从Visual Studio构建的Docker上使用“host.docker.internal”
"Messaging":{ "Hostname":“host.docker.internal”, "OrderQueue":“ProductQueue”, "UserName":“someuser”, "Password":“somepassword” },
但是,当通过docker build命令创建容器时,遇到相同的问题,但是使用Visual Studio F5命令创建容器时则没有问题。
现在找到解决方案有两种方法:
默认情况下,所有容器都会添加到“bridge”网络中,请按照以下步骤操作:
情况1:如果您已经拥有docker中的容器(rabbitmq和api)并且正在运行,请首先检查它们的IP /主机名
1. docker network ls 2. docker network inspect bridge # 从这一步开始,您将知道与此相关的容器是什么 3. 找到rabbitmq容器和内部IP,应用此容器名称或IP,然后运行应用程序,它将从Visual Studio和Docker构建和运行命令中工作
情况2:如果您没有正在运行的容器,则可能希望在docker中创建您的网络,请按照以下步骤操作:
1. docker network create givenetworknamehere 2. 在使用“docker run”命令或之后添加容器; 步骤2.1:如果使用docker run命令为容器,则; docker run --network givenetworknamehere -d -p yourport:80 --name givecontainername giveyourimagename 步骤2.2如果在容器创建后添加新创建的网络,则使用下面的命令docker network connect givenetworknamehere givecontainername 通过这些步骤,您可以将容器带入新创建的相同网络中,并且它们可以通信。
注意:默认情况下会创建“bridge”网络类型。

0

重启后,一切都正常了。我认为Rabbit没有使用.respecting .config更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接