【问题标题】:Ping work but Java code fails with host is unreachable in DockerPing 工作,但 Java 代码失败,主机在 Docker 中无法访问
【发布时间】:2017-01-04 10:19:42
【问题描述】:

我被 docker 和 Java 网络问题难住了。我有几个通过 docker-compose 启动的容器。有些人需要与他人交谈。例如,一个容器启动 RabbitMQ,另一个连接到它。如果我在与容器名称连接的 URL 中使用,一切正常。但是,我想使用实际的 docker 主机名地址(以便我使用的配置文件可以从 docker 容器之外的外部机器上使用),这很奇怪地失败了。 所以假设我有两个容器:

  • rabbitmq
  • 消息消费者

如果 messageconsumer 配置为访问amqp://rabbitmq:5672,则连接正常。但是我的容器在主机docker.mycompany.com 上运行。如果我使用amqp://docker.mycompany.com:5672 作为url,我的messageconsumer java 代码barfs 与java.net.NoRouteToHostException: Host is unreachable

但是,如果我在 messageconsumer 容器中启动一个 shell,ping docker.mycompany.com 可以工作!为什么 shell 和 ping 能找到主机地址,而 Java 却不能?我的镜像基于 openjdk:alpine。

任何帮助表示赞赏!

【问题讨论】:

  • 您是否将端口从容器映射到主机? Docker 默认不执行此操作,因此虽然 amqp://rabbitmq:5672 将在同一 Docker 网络上的容器之间解析和连接,但 amqp://docker.mycompany.com:5672 不会连接,除非您专门配置它像这样。
  • 是的,端口已映射,我可以从外部访问容器。
  • telnet 是否在端口上工作?
  • 图片中没有 telnet,但在不同打开的端口上尝试 Java 代码也不起作用。不过,它可以在主机网络模式下工作,所以我想这是设计使然。我以不同的方式重新设计了我的应用程序来解决这个问题。

标签: java networking docker docker-compose


【解决方案1】:

我刚刚经历了同样的事情。我没有深入的答案,而且可能不会,但看起来使用 HOST 网络解决了这个问题。

我不会声称这是理想的,但它应该会让你继续前进,直到有人提出更好的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 2021-12-09
    • 2015-05-29
    • 2014-10-11
    • 2015-01-12
    相关资源
    最近更新 更多