当前位置: 首页 > 知识库问答 >
问题:

Docker-获取java应用程序内的绑定端口

丘向荣
2023-03-14

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

docker run -P webmodule-xy

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

我现在的目标是获得映射/分配的端口号,该端口号可以通过Java从外部访问。有没有环境变量之类的?

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

我已经在GitHub上发现了这个公开问题,但我不敢相信没有简单的解决方案。如上文所述,Rest不是一种选择:

允许容器访问REST API是有问题的。首先,REST API是读/写的,如果您只需要读取端口映射,那么仅仅为了查找几个端口而授予容器的权限级别是危险的。

共有1个答案

郑高驰
2023-03-14

容器运行后,您应该能够使用docker检查,以便通过-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,如何从容器内获取容器信息?”,中所述,你可以:

>

  • 通过检查$HOSTNAME env var.找出一个短的docker id。
  • 使用Docker远程API

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

    由于从容器中使用Docker Remote API存在问题(因为可写访问),因此可以考虑将端口添加为可变环境。

    >

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

    docker exec -i CONTAINER_ID /bin/bash -c "export PORT=<port> && run_java-app"
    

    java应用程序(从容器中)将读取环境变量

  •  类似资料:
    • 当在docker容器中实现Java应用程序和在自己的docker容器中配置的MySQL数据库以及Docker Comuse时,在使用jdbc创建到数据库的连接时,Java应用程序中总是会出现以下错误: 相应的Docker文件和Java代码如下所示:Docker compose。yml:版本:“3.7” Java中的JDBC连接: Dockerfile: 有人有或知道这个问题吗?谢谢你的回答。

    • 问题内容: 我需要检查是否可以显式设置可以传递给JVM的某些选项,或者是否具有其默认值。 更具体地说:我需要创建一个本机堆栈大小比默认线程大的特定线程,但是如果用户想通过指定-Xss选项自己处理此类事情,我想创建所有具有默认堆栈大小的线程(将由用户在-Xss选项中指定)。 我已经检查了类和,但是这些类并没有给我有关VM参数的任何有用信息。 有什么方法可以获取我需要的信息吗? 问题答案: 通过此代码

    • 我有一个Java应用程序(打包成一个JAR ),它通过websockets与一个聊天程序(Slack)交互。据我所知,我的应用程序不需要绑定到特定的端口才能工作——它只是连接到Slack的实时消息API。它不是作为一个网络应用或网络服务器。它不会在任何端口上侦听传入的请求,因为它不需要这样做。我希望有人能够点击我的应用程序的“部署到Heroku”按钮,我希望Java应用程序在应用程序部署后立即运行

    • 我想从节点内部获取映射端口。js应用程序。 前任。 : : 我想从node获取端口。js应用。 有什么想法吗?

    • 问题内容: 我尝试使用docker-py(版本1.3.1)启动Docker容器。我想将容器内部端口映射到其他端口,但无法正确公开它们。 我这样做是这样的: 在当前情况下,输出如下: docker ps告诉我: 但是如果我给它映射3000-> 3000,2424-> 2424和2480-> 2480 关键是从命令行我可以使用正确的端口映射启动容器。那是 docker运行-d -p 3001:3000

    • 问题内容: 是否可以使用Java从Windows Vista计算机中获取已安装应用程序的列表(如来自卸载程序的列表)? 问题答案: 不是解决方案,而是解决方法! 如果没有外部API的支持,则无法使用Java SDK获取Windows本机信息。代替使用外部API(主要由LGPL许可且未完全开放),我们可以使用shell命令来获取相同的信息。 要获取已安装的软件列表,请使用ProcessBuilder