我可以将VisualVM连接到Docker中的远程Java进程而不将RMI端口暴露为自身吗?

时间:2016-08-02 11:05:22

标签: 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

但是我对这个解决方案有几个问题:

  1. 我不想指定主机名,因为我想使用相同的脚本在我的开发机器和不同的服务器中运行我的进程

  2. 如果我只想监控一个JVM,则可以正常工作。但我使用Docker Compose文件到我的Java应用程序作为可以扩展到多个容器的服务,所以我可以公开端口9010但它将链接到主机中的不同端口号

  3. 我一直在玩SSH隧道,但没有运气。 JVM不喜欢从端口32878访问,即,即使它被映射到容器中的9010。

    请问任何想法?

1 个答案:

答案 0 :(得分:0)

我将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