Предоставление порта JMX в контейнере докеров, работающем в кластере ECS

У меня есть приложение Java, работающее внутри контейнера докеров. Я развернул этот контейнер в кластере ECS. Я хочу открыть порт JMX, чтобы я мог собирать статистику JVM с помощью агента CollectD, установленного на этом компьютере.

Параметры JVM, которые я указал в своем приложении Java:

JAVA_OPTS="-Dspring.config.location=classpath:/base/ -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8008 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.net.preferIPv4Stack=true -Djava.rmi.server.hostname=10.0.7.118

Я могу подключиться к этому порту JMX, если я запускаю это приложение в среде без докеров. Однако я не могу сделать то же самое в Docker.

Я также привел сопоставления портов в «Определении моей задачи», чтобы этот порт мог быть открыт для внешнего мира. Я знаю, что если бы я запускал этот докер с помощью команды docker run, то я мог бы указать параметр -p для сопоставления портов, но я не могу сделать то же самое здесь, поскольку я запускаю это приложение в кластере ECS, который развертывает этот образ. Поэтому мне приходится полагаться на сопоставления портов, предоставляемые определением задачи.

TaskDefnition

            "ContainerDefinitions": [
                {
                    "Name": "MyApplication",
                    "Cpu": "2048",
                    "Essential": "true",
                    "Image": "location of the image",
                    "Memory": "8192",
                    "MemoryReservation": "4096",
                    "Environment": [
                        {
                            "Name": "Test",
                            "Value": {
                                "Fn::GetAtt": [
                                    "SomeAttrib",
                                    "SomeAccessKey"
                                ]
                            }
                        }
                    ],
                    "PortMappings": [
                        {
                            "HostPort": "8080",
                            "ContainerPort": "8080"
                        },
                        {
                            "HostPort": "8008",
                            "ContainerPort": "8008"
                        }
                    ]
                }

person Rakshit Jain    schedule 14.09.2017    source источник


Ответы (1)


Пройдя по разным ссылкам, я нашел решение своей проблемы. Наконец, параметры JVM выглядят так

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8008 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.net.preferIPv4Stack=true -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.rmi.port=8008 -Dcom.sun.management.jmxremote.local.only=true

Добавление -Dcom.sun.management.jmxremote.local.only = true помогло мне. Вы можете установить значение true или false в зависимости от ваших требований.

person Rakshit Jain    schedule 18.09.2017
comment
Как вы прошли этот JAVA_OPTS? - person richersoon; 29.05.2018
comment
Файл Docker выполняет сценарий оболочки, который затем выполняет загрузочную банку Spring. При выполнении jar я передал JAVA_OPTS - person Rakshit Jain; 30.05.2018