2016-11-30 1 views
3

Я хочу сделать РЕАЛЬНОЕ удаленное управление JMX в Докер контейнер работает приложение Spring загрузки:JMX - удаленное управление в Докер-создании сообщения контейнера - Не удалось получить RMIServer окурок

архитектура эскиз

enter image description here

Я читал много документации и я понимаю, что это должно быть конфигурация на стороне сервера:

java \ 
    -Djava.rmi.server.hostname=10.0.2.15 \ 
    -Dcom.sun.management.jmxremote.port=8600 \ 
    -Dcom.sun.management.jmxremote.rmi.port=8601 \ 
    -Dcom.sun.management.jmxremote.ssl=false \ 
    -Dcom.sun.management.jmxremote.authenticate=false \ 
    -Dcom.sun.management.jmxremote.local.only=false \ 
    -jar my-spring-boot-app.jar 

URL-адрес, используемый в JVisualVM, должен быть service:jmx:rmi://10.0.2.15:8601/jndi/rmi://10.0.2.15:8600/jmxrmi.

НО ЭТО НЕ (Не удалось получить RMIServer заглушки) в JVisualVM (начало на компьютере 1) - это выход журнала:

Вызванный: java.io.IOException: Не удалось получить RMIServer заглушки на javax.management.remote.rmi.RMIConnector.connect (RMIConnector.java:369) на com.sun.tools.visualvm.jmx.impl.JmxModelImpl $ ProxyClient.tryConnect (JmxModelImpl.java:549) [catch] в com.sun.tools.visualvm.jmx.impl.JmxModelImpl $ ProxyClient. подключения (JmxModelImpl.java:486) на com.sun.tools.visualvm.jmx.impl.JmxModelImpl.connect (JmxModelImpl.java:214)

ЭТО РАБОТАЕТ если я изменить конфигурацию приложения сервера до -Djava.rmi.server.hostname=172.19.0.6 (я использую сеть докеров BRDIGE ... поэтому маршрутизация до 172.19.0.6 возможно). С этой конфигурацией я могу выполнить JMX-мониторинг, если JVisualVM запущен на Docker Host (машина 2). Но это НЕТ РЕАЛЬНОГО ДИСТАНЦИОННОГО управления, потому что маршрутизация до 172.19.0.6 обычно невозможна.


Некоторые дополнительные сведения:

порт 8600, 8601 подвергаются и показаны в виде СЛУШАТЬ:

[email protected] ~/temp/ % netstat -taupen | grep 860 tcp6 0 0 :::8600 :::* LISTEN 0 254349 - tcp6 0 0 :::8601 :::* LISTEN 0 254334 -

и telnet 10.0.2.15 8600 из машины 1 можно.

Я получаю то же неправильное поведение с Java 1.8.0_111 и 1.7.0_80 на докерных контейнерах и докер-хост (работает JVisualVM).

BTW: эта конфигурация работает, если приложение Spring Boot работает непосредственно на машине 2 (без докера).

Я знаю, что JMX обычно ведет переговоры о случайных портах ... Я пытаюсь сделать их явными в своей конфигурации. Существует также одно дополнительное свойство -Dcom.sun.aas.jconsole.server.cbport=8602, которое можно установить, но это не решило проблему.

Где моя вина?

+0

"Порт 8600, 8601 подвергаются" означает, что вы побежали как 'Докер запустить -p 8600: 8600 -p 8601 : 8601 somedockerimage', чтобы иметь эти порты на y наш хост, а также изображение докеров также «ЭКСПОЗИЦИЯ» эти порты внутри страны (например, http://stackoverflow.com/a/32806333/995891)? – zapl

+0

точно ... Я не знаю, важно ли это, но контейнеры запускаются/управляются 'docker-compose' ... Я буду тестировать, если это что-то изменит – Pierre

+0

@zapl: wow ... он работает, когда делаете это с помощью 'docker run', но не через' docker-compose up' ... это мой 'docker-compose.yml': ' my-spring-boot-service: ... портов: - «8610: 8610 " -" 8611: 8611 " – Pierre

ответ

1

В моем описании проблемы я скрывала контейнер докер был запущен с помощью docker-compose с этой конфигурацией:

my-spring-boot-service: ... ports: - "8610:8610" - "8611:8611"

... и это приводит к открытым портам, которые, как представляется, будет связан со всеми интерфейсами, как вы можете увидеть через docker inspect my-spring-boot-app:

"NetworkSettings": { "Bridge": "", "SandboxID": "ac1a27e2696fd4ac2fcddf6e0935716304e348203ddbe1a0f8e31114cc6e289b", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": { "8610/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "8610" } ], "8611/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "8611" } ],

Я не вижу здесь проблемы ... , но это, кажется, проблема, потому что если я начну контейнер с помощью самого docker (как это было предложено @zapl)

docker run -p 8610:8610 -p 8611:8611 my-spring-boot-app-image

ЭТО РАБОТАЕТ - но не так, я хочу - я хочу использовать докер -компонент.

Существует разница между двумя развертываниями ... docker inspect network <foo>.

... на рабочей docker сети выглядит следующим образом:

"Options": { 
     "com.docker.network.bridge.default_bridge": "true", 
     "com.docker.network.bridge.enable_icc": "true", 
     "com.docker.network.bridge.enable_ip_masquerade": "true", 
     "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", 
     "com.docker.network.bridge.name": "docker0", 
     "com.docker.network.driver.mtu": "1500" 
    }, 

на нерабочую docker-compose сети выглядит следующим образом:

"Options": {}, 

Обе конфигурации контейнера не использовать никакого явного определенной сети, но по умолчанию.

ВОПРОСЫ: Отсутствует ли конфигурация? Должен ли я определить сеть явно в docker-compose?

docker-elk - это развертывание на основе докеров. Я настроил described configuration of the JMX interface и смог удаленную JMX эту машину.

Моя конфигурация JMX точно такой же - MINE НЕ РАБОТАЕТ :-(


OS/Arch: Linux/amd64 докер версия: 1.12.2 докер-Compose версия: 1.8.0, строить f3628c7 и 1.9.0, построить 2585387

Смежные вопросы