DC/OS JMX 访问 java 应用程序

DC/OS JMX Access to java application

我是 docker 和 dc/os 的新手。我已经在 microsoft azure 中部署了 dc/os 集群。我需要通过 jmx 设置对我的 java 应用程序的访问权限,但我做不到。 让我们以部署标准 tomcat 图像为例。 我在本地机器上安装了 docker。要 运行 具有 jmx 访问权限的 tomcat 容器,我使用此命令:

docker run -e 
     JAVA_OPTS= "-Dcom.sun.management.jmxremote 
                -Djava.rmi.server.hostname=127.0.0.1 
                -Dcom.sun.management.jmxremote.port=8081 
                -Dcom.sun.management.jmxremote.rmi.port=8081 
                -Dcom.sun.management.jmxremote.local.only=false 
                -Dcom.sun.management.jmxremote.authenticate=false 
                -Dcom.sun.management.jmxremote.ssl=false" 
     -p 8080:8080 -p 8081:8081 tomcat:8.0   

而且我可以通过端口 8081 连接到 Tomcat。

我尝试在 dc/os 集群中做同样的事情。我使用以下 json 配置进行部署:

{
  "id": "/tomcat",
  "instances": 1,
  "cpus": 1,
  "mem": 512,
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "tomcat:8.0",
      "network": "BRIDGE",
      "portMappings": [
        { "protocol": "tcp", "hostPort": 8080, "containerPort": 8080 },
        { "protocol": "tcp", "hostPort": 8081, "containerPort": 8081 }
      ]
    }
  },
  "requirePorts": true,
  "acceptedResourceRoles": [
    "slave_public"
  ],
  "env": {      
    "JAVA_OPTS": "-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=10.0.0.4 -Dcom.sun.management.jmxremote.port=8081 -Dcom.sun.management.jmxremote.rmi.port=8081 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
  },
  "healthChecks": [
    {
      "gracePeriodSeconds": 120,
      "intervalSeconds": 30,
      "maxConsecutiveFailures": 3,
      "path": "/",
      "portIndex": 0,
      "protocol": "HTTP",
      "timeoutSeconds": 5
    }
  ]
}

之后我可以访问 tomcat webconsole 但我无法通过 jmx 连接。 我尝试了“-Djava.rmi.server.hostname”的各种值:127.0.0.1、10.0.0.4(代理 ip)、agents.westeurope.cloudapp.azure.com。 请帮助我了解我做错了什么。

更新:感谢 Walter - MSFT,他指出了一个事实,哪些端口在 azure 上默认打开。我真的忘记了。但是通过 jmx 连接的问题对我来说仍然是现实的。我打开了新的讨论,我在其中提供了更多细节。

你可以阅读 Azure official article:

Any DC/OS container in the ACS public agent pool is automatically exposed to the internet. By default, ports 80, 443, 8080 are opened, and any (public) container listening on those ports are accessible.

根据您的描述,8081端口好像没有开放。您可以在 Azure 门户上打开端口 8081。

更多信息请参考这个link:Enable public access to an Azure Container Service application.

更新:

我在我的实验室中使用您的 json 文件进行测试,它适用于我,您无需更改它。您应该在 Azure NSG 和负载平衡上打开端口。

核供应国集团:

负载平衡器

我在实验室测试,可以打开8080 Web UI。当我测试端口 8081 时,我注意到该端口正在侦听,我可以使用 Public IP.

访问该端口
azureuser@dcos-master-01234567-0:~$ netcat -z -v 13.84.176.235 8081
Connection to 13.84.176.235 8081 port [tcp/tproxy] succeeded!

你也可以用curl测试一下,我得到的结果如下

azureuser@dcos-master-01234567-0:~$ curl 13.84.176.235:8081
curl: (52) Empty reply from server

如果你无法访问8081 WebUI,建议你最好检查一下docker容器