【问题标题】:Rabbitmq connection refused from Docker container to local host从 Docker 容器到本地主机的 Rabbitmq 连接被拒绝
【发布时间】:2017-04-26 15:14:35
【问题描述】:

我有一个运行 java 进程的 docker 容器,我试图连接到在我的本地主机上运行的 rabbitmq。

到目前为止,我已经完成了以下步骤:

在我的本地机器上(运行 Docker 版本 1.13.0-rc3 的 macbook,构建 4d92237 并关闭防火墙)

  1. 我已经更新了我的 rabbitmq_env.conf 文件以删除 RABBITMQ_NODE_IP_ADDRESS,所以我没有绑定到通过 localhost 进行连接,并且我有一个管理员 rabbitmq 用户。 (不尝试访客用户)
  2. 我在本地机器上通过 telnet 对此进行了测试,没有出现任何问题 telnet <local-ip> 5672

在我的 docker 容器内

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

    [{"name":"/","tracing":false}]

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

    “连接被外部主机关闭”

  3. 查看 rabbitmq.logs

    =错误报告==== 关闭 AMQP 连接 (local-ip:53349 -> local-ip:5672): {handshake_timeout,handshake}

我的 java stacktrace 很有帮助

原因:java.net.ConnectException:连接被拒绝(连接>拒绝) 在 java.net.PlainSocketImpl.socketConnect(本机方法) 在 >java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 在 >java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.>java:206) 在 >java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 在 java.net.Socket.connect(Socket.java:589) 在 >com.rabbitmq.client.impl.FrameHandlerFactory.create(FrameHandlerFactory.ja>va:32) 在 >com.rabbitmq.client.impl.recovery.RecoveryAwareAMQConnectionFactory.newCon>nection(RecoveryAwareAMQConnectionFactory.java:35)

docker network inspect bridge

[ { “名称”:“桥”, “ID”:“716f935f19a107225650a95d06eb83d4c973b7943b1924815034d469164affe5”, “创建”:“2016-12-11T15:34:41.950148125Z”, “范围”:“本地”, “司机”:“桥”, “启用 IPv6”:假, “IPAM”:{ “驱动程序”:“默认”, “选项”:空, “配置”:[ { “子网”:“172.17.0.0/16”, “网关”:“172.17.0.1” } ] }, “内部”:错误, “可附加”:假, “容器”:{ “9722a49c4e99ca5a7fabe56eb9e1c71b117a1e661e6c3e078d9fb54d7d276c6c”:{ “名称”:“测试”, "EndpointID": "eedf2822384a5ebc01e5a2066533f714b6045f661e24080a89d04574e654d841", "MacAddress": "02:42:ac:11:00:02", “IPv4地址”:“172.17.0.2/16”, “IPv6地址”:“” } }, “选项”: { “com.docker.network.bridge.default_bridge”:“真”, “com.docker.network.bridge.enable_icc”:“真”, “com.docker.network.bridge.enable_ip_masquerade”:“真”, “com.docker.network.bridge.host_binding_ipv4”:“0.0.0.0”, “com.docker.network.bridge.name”:“docker0”, “com.docker.network.driver.mtu”:“1500” }, “标签”: {} } ]

我错过了什么?

【问题讨论】:

  • local-ip 到底是什么?您能否在容器运行时粘贴docker ps 的输出以及docker inspect
  • 这是我的本地 IP 地址,即 192.168.1.XXX
  • docker ps 容器 ID 图像命令创建状态端口名称 9722a49c4e99 e9096fc4f5ff "/bin/sh" 3 小时前 2 小时 5672/tcp, 7888/tcp 测试

标签: docker rabbitmq


【解决方案1】:

对我来说这很好用!

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

最好的祝福

【讨论】:

  • 谢谢。我自己也遇到了这种情况,因为没有意识到我必须打开端口而感到愚蠢:P
【解决方案2】:

对于其他搜索此错误的人,我在 docker 容器中使用 spring boot 和 rabbitmq,并使用 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容器名称

【讨论】:

    【解决方案3】:

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

    以下方案对我有用

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

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

    但是当容器通过 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 create givenetworknamehere
    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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-15
        • 1970-01-01
        • 2020-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-30
        • 2020-03-14
        相关资源
        最近更新 更多