相关疑难解决方法(0)

如何从外部访问docker中的JMX接口?

我正在尝试远程监视在docker中运行的JVM.配置如下所示:

  • 机器1:在ubuntu机器上的docker中运行JVM(在我的例子中,运行kafka); 本机的IP是10.0.1.201; 在docker中运行的应用程序是172.17.0.85.

  • 机器2:运行JMX监控

请注意,当我从机器2运行JMX监视时,它会因以下错误的版本而失败(注意:当我运行jconsole,jvisualvm,jmxtrans和node-jmx/npm:jmx时会出现相同的错误):

失败时的堆栈跟踪对于每个JMX监视工具看起来类似于以下内容:

java.rmi.ConnectException: Connection refused to host: 172.17.0.85; nested exception is
    java.net.ConnectException: Operation timed out
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
    (followed by a large stack trace)
Run Code Online (Sandbox Code Playgroud)

现在有趣的是,当我在运行docker(上面的机器1)的同一台机器上运行相同的工具(jconsole,jvisualvm,jmxtrans和node-jmx/npm:jmx)时,JMX监控正常工作.

我认为这表明我的JMX端口处于活动状态且工作正常,但是当我远程执行JMX监视时(从机器2),它看起来像JMX工具无法识别内部docker IP(172.17.0.85)

下面是机器1上JMX监控工作的相关(我认为)网络配置元素(注意docker ip,172.17.42.1):

docker0   Link encap:Ethernet  HWaddr ...
      inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
      inet6 addr:... Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:6787941 errors:0 dropped:0 overruns:0 frame:0
      TX packets:4875190 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0
      RX bytes:1907319636 (1.9 GB)  TX bytes:639691630 (639.6 MB)

wlan0     Link encap:Ethernet  HWaddr ... 
      inet addr:10.0.1.201 …
Run Code Online (Sandbox Code Playgroud)

java jmx docker jmxtrans

25
推荐指数
4
解决办法
2万
查看次数

通过JMX访问在docker容器中运行的tomcat

我想通过JMX获得tomcat的表现.Tomcat版本为7,Java版本为1.7.0_79.

Tomcat在docker的容器上运行.端口映射已通过以下设置.

docker run -itd -p 18080:8080 -p 19998:19998 -p 62911:62911 sad_jang2 bash
Run Code Online (Sandbox Code Playgroud)

在tomcat容器中,在路径/ tomcat_home/bin /中创建了setevn.sh,其中包含以下内容.

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"
Run Code Online (Sandbox Code Playgroud)

我写了一个简单的java代码

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();
Run Code Online (Sandbox Code Playgroud)

并且可以通过JMX获得相关值.

但是,我在我的桌面上使用docker主机的地址和19998端口运行此代码

JMXServiceURL serviceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + "10.70.1.5"+ ":" + "19998" + "/jmxrmi");
Run Code Online (Sandbox Code Playgroud)

控制台显示以下消息

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) …
Run Code Online (Sandbox Code Playgroud)

java tomcat jmx docker

5
推荐指数
1
解决办法
6399
查看次数

如何在Docker机器中将JMX从主机连接到Docker容器?

当我直接在主机上运行Docker容器时,可以毫无问题地连接到它.

我的主机有网络192.168.1.0/24,主机的IP地址是192.168.1.20.我的Docker容器的IP地址为172.17.0.2.当我从jconsole连接到172.17.0.2:1099时,它可以工作.

当我将此服务放入Docker机器时,无法连接到它.

我的Docker机器有IP 192.168.99.100,其中的容器有IP地址172.17.0.2但是当我使用jconsole连接到192.168.99.100:1099时它不起作用.

重复一遍:

192.168.1.20 --- 172.17.0.2:1099有效

192.168.1.20 ---(192.168.99.100 --- 172.17.0.2:1099)并从我的主机连接到192.168.99.100:1099不起作用.

值得一提的是,我可以通过Docker机器的外部IP地址访问Docker机器中的容器化服务,例如,这将起作用:

192.168.99.100 ---(192.168.99.100:8080 --- 172.17.0.2:8080)

但是当我使用JMX时,它就无法正常工作.

这是Tomcat服务.我在启动Tomcat实例的脚本中有这个:

CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.rmi.port=1099 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=IP address of Docker container 
Run Code Online (Sandbox Code Playgroud)

networking tomcat jmx docker docker-machine

5
推荐指数
1
解决办法
6344
查看次数

标签 统计

docker ×3

jmx ×3

java ×2

tomcat ×2

docker-machine ×1

jmxtrans ×1

networking ×1