Rabbitmq连接从Docker容器拒绝到本地主机

时间:2016-12-11 17:58:39

标签: docker rabbitmq

我有一个运行java进程的docker容器,我正在尝试连接到在localhost上运行的rabbitmq。

以下是我到目前为止所做的步骤:

在我的本地计算机上(运行Docker版本1.13.0-rc3的macbook,在关闭防火墙的情况下构建4d92237)

  1. 我已经更新了我的rabbitmq_env.conf文件以删除RABBITMQ_NODE_IP_ADDRESS,因此我不依赖于通过localhost连接,而且我有一个admin rabbitmq用户。 (不尝试与访客用户)
  2. 我在本地计算机上通过telnet对此进行了测试,并且没有问题telnet <local-ip> 5672
  3. 在我的泊坞窗容器内

    1. 能ping ping local-ip和curl rabbitmq admin api curl -i -u username:password http://local-ip:15672/api/vhosts成功返回

        

      [{ “名称”: “/”, “跟踪”:假}]

    2. 当我尝试从容器内部远程登录时,我得到了

        

      “连接被外国主机关闭”

    3. 查看rabbitmq.logs

      =错误报告==== 关闭AMQP连接&lt; 0.30526.1&gt; (local-ip:53349 - &gt; local-ip:5672): {handshake_timeout,握手}

    4. 我的java stacktrace有用

        

      引起:java.net.ConnectException:拒绝连接(连接&gt;拒绝)     at java.net.PlainSocketImpl.socketConnect(Native Method)     at&gt; java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)     at&gt; java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl。&gt; java:206)     at&gt; java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)     在java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)     在java.net.Socket.connect(Socket.java:589)     at&gt; com.rabbitmq.client.impl.FrameHandlerFactory.create(FrameHandlerFactory.ja&gt; va:32)     在&gt; com.rabbitmq.client.impl.recovery.RecoveryAwareAMQConnectionFactory.newCon&gt; nection(RecoveryAwareAMQConnectionFactory.java:35)

      docker network inspect bridge

        

      [       {           “名字”:“桥”,           “Id”:“716f935f19a107225650a95d06eb83d4c973b7943b1924815034d469164affe5”,           “Created”:“2016-12-11T15:34:41.950148125Z”,           “范围”:“本地”,           “司机”:“桥”,           “EnableIPv6”:false,           “IPAM”:{               “司机”:“默认”,               “选项”:null,               “配置”:[                   {                       “子网”:“172.17.0.0/16”,                       “网关”:“172.17.0.1”                   }               ]           },           “内部”:错误,           “可附着”:虚假,           “容器”:{               “9722a49c4e99ca5a7fabe56eb9e1c71b117a1e661e6c3e078d9fb54d7d276c6c”:{                   “名称”:“测试”,                   “EndpointID”:“eedf2822384a5ebc01e5a2066533f714b6045f661e24080a89d04574e654d841”,                   “MacAddress”:“02:42:ac:11:00:02”,                   “IPv4Address”:“172.17.0.2/16”,                   “IPv6Address”:“”               }           },           “选项”:{               “com.docker.network.bridge.default_bridge”:“true”,               “com.docker.network.bridge.enable_icc”:“true”,               “com.docker.network.bridge.enable_ip_masquerade”:“true”,               “com.docker.network.bridge.host_binding_ipv4”:“0.0.0.0”,               “com.docker.network.bridge.name”:“docker0”,               “com.docker.network.driver.mtu”:“1500”           },           “标签”: {}       }   ]

      我错过了什么?

4 个答案:

答案 0 :(得分:3)

对我来说这很好用!

  

我已经安装了图像 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

Go to management 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

祝福

答案 1 :(得分:3)

对于寻找此错误的其他人,我在docker容器中使用spring boot和rabbitmq,并以docker compose开头。我一直从春季应用中获得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 :(得分:0)

重新启动后,一切正常。我不认为Rabbit正在使用尊重.config更改

答案 3 :(得分:0)

我正在使用带有 rabbitmq:3-management 的 docker 和 linux 容器,并创建了一个基于 dotnet 核心的 web api。从 We API 操作方法调用时,我遇到了同样的问题并将值更改为“host.docker.internal”

<块引用>

以下场景对我有用

  1. IIS Express 上的“本地主机”
  2. 从 Visual Studio 构建 Docker 上的“localhost”
  3. 从 Visual Studio 构建 Docker 上的“host.docker.internal”

“消息”:{ "主机名": "host.docker.internal", "订单队列": "产品队列", "用户名": "someuser", "密码": "somepassword" },

但在通过 docker build 命令创建容器时面临同样的问题,但在使用 Visual Studio F5 命令创建容器时则不然。

现在找到解决方案有两种方法:

默认情况下,所有容器都通过这些步骤添加到“桥接”网络中

案例 1: 如果您在 docker 中已经有容器(rabbitmq 和 api) 然后运行然后首先检查他们的ip/主机名

<块引用>
  1. docker 网络 ls
  2. docker network inspect bridge # 从这一步您将了解哪些容器与此相关
  3. 找到 rabbitmq 容器和内部 IP,应用此容器名称或 IP,然后运行您的应用程序,它将通过 Visual Studio 和 Docker 构建和运行命令运行

案例 2: 如果您没有正在运行的容器,那么您可能想要创建 您在 docker 中的网络然后按照以下步骤操作:

<块引用>
  1. docker network 在此处创建给定网络名称
  2. 在使用“docker run”命令时或之后添加您的容器
    Step2.1:如果对您的容器使用 docker run 命令,则;
    docker run --network givenetworknamehere -d -p yourport:80 --name givecontainername giveyourimagename
    Step2.2 如果在容器创建后添加新创建的网络,则在下面使用 命令 docker network connect givenetworknamehere givecontainername

通过这些步骤,您可以将容器放入新创建的同一网络中,它们可以进行通信。

注意:默认情况下会创建“桥接”网络类型