【问题标题】:Docker - Get bound port inside java applicationDocker - 在 Java 应用程序中获取绑定端口
【发布时间】:2016-02-02 10:38:51
【问题描述】:

我正在创建我的图像的实例,例如

docker run -P webmodule-xy

webmodule 的 Dockerfile 公开了一个端口(例如 8080)。

我现在的目标是获取可以通过 Java 从外部访问的映射/分配的端口号。是否有环境变量或类似的东西?

用例: webmodule-xy 应该在另一个 web 应用程序上注册自己并提供其 IP + 端口,以便其他应用程序稍后可以联系 webmodule-xy。 IP没问题,但是端口有问题。

我已经在 GitHub 上找到了这个open issue,但我不敢相信没有简单的解决方案。就像那里所说的那样,REST 不是一种选择:

允许容器访问 REST API 是有问题的。 一方面,REST API 是读/写的,如果您只需要 阅读您的端口映射,这是一个危险的权限级别 授予一个容器只是为了找出几个端口。

【问题讨论】:

  • 我没有直接回答你的问题,但也许你可以使用 docker 链接来代替 (docs.docker.com/userguide/dockerlinks)。它允许多个 docker 容器以可移植的方式相互了解。如果可行,您可能需要重新设计应用程序的注册部分。
  • 感谢您的建议!我已经知道链接并将它们用于例如数据库。不幸的是,我不能在我的用例中使用它们,因为这两个系统(模块和基础应用程序)应该是严格分离的。所以不应该假设它们在同一个 Docker 主机上运行。
  • 是的,没错。我刚刚想到的一个技巧:您可以运行第二个容器,链接到webmodule-xy 并使用它来注册应用程序。之后就可以退出了。
  • 实际上这个hack是行不通的,因为新图像会看到内部界面,而不是外部界面。

标签: java docker environment-variables


【解决方案1】:

一旦容器运行,您应该能够使用docker inspect 来获取通过-P 选项映射到主机的端口号。

可以循环遍历结果中的数组和映射以产生简单的文本输出:

docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' $INSTANCE_ID

查找特定端口映射

docker inspect --format='{{(index (index .NetworkSettings.Ports "8080/tcp") 0).HostPort}}' $INSTANCE_ID

我现在想了解在容器中运行的 java 应用程序中的这个随机端口。

如“Docker, how to get container information from within the container?”中详述,您可以:

  • 通过检查 $HOSTNAME env var 找出缩短的 docker id。
  • 使用Docker Remote API

    GET /containers/<docker_id>/json HTTP/1.1
    

Since using Docker Remote API from a container is problematic(因为可写访问),你可以考虑adding the port as a variable environment

  • docker exec 将在docker run 之后添加从docker inspect 读取的端口作为环境变量并运行Java 应用程序(issue 8838):

    docker exec -i CONTAINER_ID /bin/bash -c "export PORT=<port> && run_java-app"
    
  • Java 应用程序(从容器内)将读取环境变量

【讨论】:

  • 感谢您的回答!我知道这可以通过使用 docker cli 来实现,但我想在 Java 应用程序中访问此功能。您是否建议我应该在我的 java 应用程序中运行这个检查命令?
  • @M156 你的java应用是运行在容器还是宿主机上?
  • 它在容器中运行并暴露一个端口,然后由docker通过-P参数随机绑定。我现在想了解在容器中运行的 java 应用程序中的这个随机端口。我想将此端口告诉另一个应用程序,以便稍后通过端口(从外部)联系我的应用程序。
  • @M156 我已经编辑了答案以解决您的特殊情况
  • @M156 我已经编辑了答案以提出使用远程 API 的替代方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 2018-01-12
  • 2014-08-31
  • 2018-10-22
  • 1970-01-01
相关资源
最近更新 更多