使用映射端口访问Docker容器内的JMX

我正在尝试访问JMX的Docker容器内运行的应用程序。

这与此问题类似,解决scheme在Docker镜像中的端口映射到映像外的相同端口时起作用。 但是,我有时想将端口映射到不同的端口。

我在托pipe应用程序中设置这些属性。

-Dcom.sun.management.jmxremote.port=9832 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.rmi.port=9832 -Djava.rmi.server.hostname=192.168.99.100 -Djava.rmi.server.logCalls=true 

当Docker容器将端口9832映射到9832时,这工作正常。我可以通过JConsole或我们自己的应用程序进行连接。 如果端口映射到另一个端口,那么我无法从JConsole或我们的应用程序访问应用程序。

我怀疑需要一个或两个端口号作为外部端口(就像java.rmi.server.hostname是外部地址,而不是内部地址)。 但是,所有四个端口号组合都会失败。

其中两个组合不会产生来自服务器的日志输出。 一个(我忘记了)产生这个输出:

 Feb 09, 2016 10:35:54 PM org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl start INFO: AMQ221001: Apache ActiveMQ Artemis Message Broker version 1.1.0 [nodeID=7a6e038e-cf7d-11e5-b566-31dc437b2d1a] HTTP Server started at http://0.0.0.0:8161 Feb 09, 2016 10:36:06 PM sun.rmi.server.UnicastServerRef logCall FINER: RMI TCP Connection(1)-192.168.99.1: [192.168.99.1: sun.rmi.transport.DGCImpl[0:0:0, 2]: java.rmi.dgc.Lease dirty(java.rmi.server.ObjID[], long, java.rmi.dgc.Lease)] Feb 09, 2016 10:36:08 PM sun.rmi.transport.Transport serviceCall FINE: RMI TCP Connection(1)-192.168.99.1: [192.168.99.1] exception: java.rmi.NoSuchObjectException: no such object in table at sun.rmi.transport.Transport.serviceCall(Transport.java:177) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Feb 09, 2016 10:40:24 PM sun.rmi.server.UnicastServerRef logCall FINER: RMI TCP Connection(2)-192.168.99.1: [192.168.99.1: sun.rmi.transport.DGCImpl[0:0:0, 2]: void clean(java.rmi.server.ObjID[], long, java.rmi.dgc.VMID, boolean)] 

另一个产生这个输出。

 HTTP Server started at http://0.0.0.0:8161 Feb 09, 2016 10:14:13 PM sun.rmi.server.UnicastServerRef logCall FINER: RMI TCP Connection(1)-192.168.99.1: [192.168.99.1: sun.management.jmxremote.SingleEntryRegistry[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)] Feb 09, 2016 10:14:17 PM sun.rmi.server.UnicastServerRef logCall FINER: RMI TCP Connection(1)-192.168.99.1: [192.168.99.1: sun.management.jmxremote.SingleEntryRegistry[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)] Feb 09, 2016 10:14:17 PM sun.rmi.server.UnicastServerRef logCall FINER: RMI TCP Connection(1)-192.168.99.1: [192.168.99.1: sun.management.jmxremote.SingleEntryRegistry[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)] 

鉴于这些故障,我怀疑一个或两个端口属性的使用方式有时需要是内部端口,有时需要作为外部端口。 这意味着当端口被映射到不同的位置时,JMX访问是不可能的。

我可以通过telnet 192.168.99.100 <mapped port>访问映射的端口,所以我知道映射正在工作。