【发布时间】: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