将JConsole连接到NAT服务器后面的Docker上运行的GlassFish服务器

时间:2017-06-23 17:59:45

标签: java ssh glassfish jmx jconsole

我的基础架构采用这种方式构建(在AWS上):

|NAT| <--> |ServerA| <--> |DockerContainer| <--> |GlassFish4.0|

ServerA有一个运行Glassfish 4.0版的Docker容器

ServerA通过NAT服务器可以访问Internet。

连接到ServerA我已经通过SSH连接到NAT服务器,然后SSH到ServerA。

运行顺利,没有任何问题。

现在我需要将本地计算机上的JConsole连接到GlassFish服务器,这是我遇到问题并需要帮助的地方。

我在domain.xml文件中添加了以下JVM选项:

<jvm-options>-Dsun.management.jmxremote.level=FINEST</jvm-options>
<jvm-options>-Dsun.management.jmxremote.handlers=java.util.logging.ConsoleHandler</jvm-options>
<jvm-options>-Djava.util.logging.ConsoleHandler.level=FINEST</jvm-options>
<jvm-options>-Dcom.sun.management.jmxremote.local.only=false</jvm-options>
<jvm-options>-Dcom.sun.management.jmxremote.ssl=false</jvm-options>
<jvm-options>-Dcom.sun.management.jmxremote.authenticate=false</jvm-options>
<jvm-options>-Dcom.sun.management.jmxremote.port=9010</jvm-options>
<jvm-options>-Dcom.sun.management.jmxremote.rmi.port=9010</jvm-options>
<jvm-options>-Dcom.sun.management.jmxremote.host=0.0.0.0</jvm-options>
<jvm-options>-Djava.rmi.server.hostname=10.0.0.115</jvm-options>

其中10.0.0.115(对于java.rmi.server.hostname)是ServerA的本地地址。

然后我创建一个从本地计算机到NAT服务器的SSH隧道,如下所示:

ssh -L 9010:localhost:9010 nat

然后我像这样建立另一个到ServerA的SSH隧道:

ssh -L 9010:localhost:9010 serverA

在docker容器上,我在docker run上公开端口9010,如下所示:

docker run --restart=always --name $CONTAINER_NAME  \
-d  \
-p 4848:4848 \
-p 8080:8080 \
-p 9010:9010 \
my container

现在,当我尝试连接JConsole时,我使用localhost:9010但它失败了。

我尝试telnet到localhost 9010,看起来它成功了:

telnet localhost 9010
Trying ::1...
Connected to localhost.
Escape character is '^]'.




^C^C^C^C^C^C


^]
::
exit
^Z^Z^X^C^V^M

Connection closed by foreign host.

一段时间后,我得到了Connection closed by foreign host.

我尝试过使用VisualJM但是如果我输入localhost:9010 VisualJM认为它已经&#34;真的&#34; localhost并且不允许我添加远程服务器然后添加JMX。

我已将安全组上的NAT和ServerA的所有流量打开到我自己的IP,但我没有成功,所以我假设它不是防火墙问题。

有人可以帮助我发现我在这里做错了吗?

修改

在我的本地计算机上使用jconsole -debug时,在尝试连接到docker JVM后,我得到以下异常:

java.lang.SecurityException: Expecting a javax.rmi.ssl.SslRMIClientSocketFactory RMI client socket factory in stub!
    at javax.management.remote.rmi.RMIConnector.checkStub(RMIConnector.java:1903)
    at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:295)
    at sun.tools.jconsole.ProxyClient.tryConnect(ProxyClient.java:355)
    at sun.tools.jconsole.ProxyClient.connect(ProxyClient.java:313)
    at sun.tools.jconsole.VMPanel$2.run(VMPanel.java:294)

编辑2

尝试从本地计算机连接到ServerA时运行netstat我得到此输出:

netstat -a | grep 9010
tcp        0      0 ip-XXX-XX-XX-X.us:34406 ip-XXX-XX-Y-YYY.us:9010 ESTABLISHED
tcp        0      0 localhost:54745         localhost:9010          ESTABLISHED
tcp6       0      0 [::]:9010               [::]:*                  LISTEN     
tcp6       0      0 localhost:9010          localhost:54745         ESTABLISHED

其中X在两种情况下都是相同的数字而Y是不同的数字

0 个答案:

没有答案