如何在Docker容器中configurationkarf的jmx端口?
我想使用visualvm来检查运行在docker容器中的karaf中的线程。
我做了什么:
- 为docker揭露44444和1099
- 在org.apache.karaf.management.cfg中,试图用docker container ip和docker inner ip的不同组合来设置rmiRegistryHost和rmiServerHost几次。
- 尝试更改EXTRA_JAVA_OPTS =“ – Djava.rmi.server.hostname = $ {docker-container-ip} -Dcom.sun.management.jmxremote.local.only = false”
需要帮忙。
问题是RMI协议,在提供RMI端点的主机(Docker主机)不是RMI服务器(Docker容器中的VM)的主机的情况下,并不能很好地处理这种情况。
我得到它的工作方式是
export EXTRA_JAVA_OPTS=="-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.rmi.port=$JMX_RMI_PORT -Dcom.sun.management.jmxremote.port=$JMX_REMOTE_PORT -Djava.rmi.server.hostname=$HOST_HOSTNAME"
我使用docker-compose来设置环境,但只要在主机上只运行一个包含图像的容器,就可以用固定值replace环境variables。 我使用1097和1098分别为RMI和REMOTE端口。 这里有两件事很重要:
- RMI和REMOTE端口都必须映射到您的docker主机在相同的端口号。 例如,如果使用1097作为容器中的RMI端口,则必须将该端口发布到主机上的1097端口。
-
java.rmi.server.hostname
是您的docker主机的主机名或IP,而不是容器的IP
假设你正在使用上面的端口,然后连接到
service:jmx:rmi:///jndi/rmi://<your_docker_host>:1098/jmxrmi
应该现在工作。
我从来没有得到卡拉夫的JMX accecss控制工作。
使用JMXMP而不是RMI for JMX可能会使事情变得简单,但是Karaf并不支持它。