java - 我可以在不暴露RMI端口本身的情况下将VisualVM连接到Docker中的远程Java进程吗?

标签 java docker rmi docker-compose visualvm

我已经能够将VisualVM连接到我的Java进程,并在Docker容器中运行,并执行以下操作:

docker run \
--rm \
--entrypoint=java \ 
-p 9010:9010 \
my-user/my-image \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9010 \
-Dcom.sun.management.jmxremote.rmi.port=9010 \
-Dcom.sun.management.jmxremote.local.only=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname='192.168.99.100' \
-jar /my-app-1.0-SNAPSHOT.jar

但是,此解决方案有几个问题:
  • 我不想指定主机名,因为我想使用相同的脚本在我的开发机和我的不同服务器上运行我的进程
  • 如果我只想监视一个JVM,则此方法有效。但是我在我的Java应用程序中使用了Docker Compose文件作为可扩展到多个容器的服务,因此我可以公开端口9010,但它将链接到主机
  • 中的不同端口号

    我一直在使用SSH隧道,但是没有运气。 JVM不喜欢从端口32878进行访问,即,即使它已映射到容器中的9010。

    有什么想法吗?

    最佳答案

    我将docker与大量Web应用程序和休息服务一起使用。
    为了直接在我的本地浏览器中访问它们(我是Windows 10用户),我已经安装了代理容器。该代理具有一个暴露的端口“1080:1080”。
    然后,我使用代理插件(FoxyProxy)进入浏览器。而且我可以访问任何端口的任何地址。使用它,而您不需要在其他容器上进行任何其他端口映射,则代理将处理所有流量。

    这是我在容器中使用的命令

    service sshd start && sshpass -p 'password' ssh -o StrictHostKeyChecking=no -N -D 0.0.0.0:1080 localhost
    

    关于java - 我可以在不暴露RMI端口本身的情况下将VisualVM连接到Docker中的远程Java进程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38718708/

    相关文章:

    java - Android相机存储图像(原始): Strange pictures after update

    java - 如何将java数组复制到javascript数组?

    java - 有选择地拒绝登录用户对操作子集的访问

    java - 在该类的方法体内实例化泛型类

    bash - 在Java应用程序中从Docker收集输出

    linux - 在 Linux Distro 容器中安装 Lamp 与作为单独容器安装的区别?

    ubuntu - Ubuntu 上的 Docker hello-world - 权限被拒绝

    java - RMI动态类加载

    java - java RMI 服务中的通用事务逻辑?

    ssl - 无法使用 SSL RMI 启动 JMeter 4.0 客户端