DC / OS JMX访问Java应用程序

时间:2017-05-31 17:09:32

标签: java azure docker jmx dcos

我是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”的variouse值:127.0.0.1,10.0.0.4(agent ip),agents.westeurope.cloudapp.azure.com。 请帮我理解我做错了什么。

更新:感谢Walter - MSFT指出了默认情况下在azure上打开哪些端口的事实。我真的忘了它。但是通过jmx连接的问题对我来说仍然是实际的。我开始了新的讨论,我提供了更多细节。 DC/OS JMX Access

1 个答案:

答案 0 :(得分:1)

您可以阅读Azure official article

  

ACS公共代理程序池中的任何DC / OS容器都是自动的   暴露在互联网上。默认情况下,端口80,443,8080已打开,   并且可以访问在这些端口上侦听的任何(公共)容器。

根据您的描述,似乎端口8081未打开。您可以在Azure门户上打开端口8081。

有关详情,请参阅此链接:Enable public access to an Azure Container Service application

更新

我在我的实验室用你的json文件测试,它适用于我,你不能改变它。您应该在Azure NSG和Load Balance上打开端口。

NSG:

LoadBalncer enter image description here

我在实验室测试,我可以打开8080 Web UI。当我测试端口8081时,我注意到端口正在侦听,我可以使用公共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 Web UI,我建议您最好检查docker容器。