Acceso a tomcat corriendo en contenedor acoplable por JMX

Quiero get el performance de Tomcat por JMX. La versión de Tomcat es 7 y la versión de Java es 1.7.0_79.

Tomcat se ejecuta en el contenedor de la window acoplable. La asignación del puerto se ha configurado por lo siguiente.

docker run -itd -p 18080:8080 -p 19998:19998 -p 62911:62911 sad_jang2 bash 

En el contenedor de tomcat, setevn.sh se creó en la ruta / tomcat_home / bin / con el siguiente contenido.

 export JAVA_OPTS=" -Xdebug -Xrunjdwp:transport=dt_socket,address=62911,server=y,suspend=n -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=19998 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=172.17.0.16" 

Escribo un código simple de Java como

 JMXServiceURL serviceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + "172.17.0.16"+ ":" + "19998" + "/jmxrmi"); JMXConnector connector = JMXConnectorFactory.connect(serviceURL, null); MBeanServerConnection mbsc = connector.getMBeanServerConnection(); 

y puede get valores relacionados por JMX.

Sin embargo, ejecuto este código en mi escritorio con la dirección del host docker y el puerto 19998, como

 JMXServiceURL serviceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + "10.70.1.5"+ ":" + "19998" + "/jmxrmi"); 

La console muestra el siguiente post

 java.rmi.ConnectException: Connection refused to host: 172.17.0.16; nested exception is: java.net.ConnectException: Connection timed out: connect at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619) at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:130) at javax.management.remote.rmi.RMIServerImpl_Stub.newClient(Unknown Source) at javax.management.remote.rmi.RMIConnector.getConnection(RMIConnector.java:2432) at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:308) at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:270) at utility.GetStatistic.getTomcatStats(GetStatistic.java:84) at exec.Main.main(Main.java:53) Caused by: java.net.ConnectException: Connection timed out: connect at java.net.DualStackPlainSocketImpl.connect0(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589) at java.net.Socket.connect(Socket.java:538) at java.net.Socket.<init>(Socket.java:434) at java.net.Socket.<init>(Socket.java:211) at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40) at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:148) at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613) ... 9 more 

Usando el browser para conectar la URL http://10.70.1.5:18080 puede mostrar la página raíz de tomcat.

¿Alguien puede dar alguna sugerencia? Gracias.

Aquí están los indicadores que he utilizado con éxito para controlar mi contenedor ZooKeeper a través de JMX:

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Djava.rmi.server.hostname=192.168.1.4 -Dcom.sun.management.jmxremote.ssl=false

Entonces, la diferencia sería esta input -Dcom.sun.management.jmxremote.rmi.port que es arreglar el puerto RMI para que sea el mismo que el puerto JMX.

Con esto puedo simplemente docker run -p 9010:9010 ... y todo está bien para mí.

Esto no funciona cuando ejecuta ese contenedor en la máquina Docker, en VirtualBox. No estoy seguro de qué tipo de dirección debo agregar a java.rmi.server.hostname porque cuando agrego la IP externa del contenedor Docker me estoy conectando desde mi host, no funciona. Así que, básicamente, la situación es como HOST —> (MACHINE — CONTAINER) y no puedo alcanzarlo desde HOST hasta CONTAINER.

No estoy seguro de si es necesario, pero recomendaría agregar esto a sus opciones adicionales -Djgroups.bind_addr=172.17.0.16 . También estoy bastante seguro de que este tipo de opciones probablemente deberían ir a CATALINA_OPTS y no a JAVA_OPTS, pero eso no debería marcar la diferencia. Otra cosa que noté es que el nombre de host del server de rmi que usted definió es diferente que el del constructor de JMXServiceURL. No soy un experto en Docker, pero ¿no debería ser idéntico?

Esta configuration funcionó para mí:

 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=10005 -Dcom.sun.management.jmxremote.rmi.port=10005 -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.ssl=false 

La parte importante fue configurar el nombre de host del server de rmi con la dirección de bucle invertido local. Si utilicé 0.0.0.0 no pude llegar al puerto expuesto localmente a través de un túnel SSH, con 127.0.0.1 todo funcionó bien .

Nota : si está ejecutando docker dentro de la caja virtual, las cosas son diferentes … tiene que usar la ip que virtualbox le brinda aquí.