2016-02-17 3 views
5

Когда у меня есть контейнер Docker прямо на моем хосте, можно без проблем подключиться к нему.Как подключиться с JMX от хоста до контейнера Docker в машине Docker?

У моего хоста есть сеть 192.168.1.0/24, а IP-адрес хоста - 192.168.1.20. Мой контейнер Docker имеет IP-адрес 172.17.0.2. Когда я подключаюсь к 172.17.0.2:1099 из jconsole, он работает.

Когда я помещаю эту службу в машину Докера, с ней невозможно подключиться.

Мое устройство для докеров имеет IP 192.168.99.100, а контейнер в нем имеет IP-адрес 172.17.0.2, но когда я использую jconsole для подключения к 192.168.99.100:1099, он не работает.

Чтобы повторить:

192.168.1.20 --- 172.17.0.2:1099 работы

192.168.1.20 --- (192.168.99.100 --- 172.17.0.2:1099) и подключения к 192.168.99.100:1099 от моего хоста не работает.

Стоит сказать, что я могу получить доступ к сервисам, помещенным в контейнер Docker через внешний IP-адрес устройства Docker, например. это будет работать:

192.168.99.100 --- (192.168.99.100:8080 --- 172.17.0.2:8080)

Но когда я использую JMX это просто не работает.

Это услуга Tomcat. Я имею в сценариях которых начинается экземпляр Tomcat:

CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n \ 
-Dcom.sun.management.jmxremote.port=1099 \ 
-Dcom.sun.management.jmxremote.rmi.port=1099 \ 
-Dcom.sun.management.jmxremote.authenticate=false \ 
-Dcom.sun.management.jmxremote.ssl=false \ 
-Djava.rmi.server.hostname=IP address of Docker container 
+0

Он запускается библиотекой docker-java ... это не так важно, но когда я делаю «докер-машину ssh» и в ней «docker ps -a», я вижу, что мой контейнер имеет эти привязки портов/экспозиции: ad6be9184855 company/tomcat: 8.0.30 0.0.0.0:1099->1099/tcp, 0.0.0.0:8000->8000/tcp, 0.0.0.0:8009->8009/tcp, 0.0.0.0:8080->8080/tcp – stewenson

ответ

4

Я думаю, что проблема, вероятно, значение java.rmi.server.hostname собственности. Это должно быть имя хоста или IP-адрес, который должен использоваться клиентом JMX для подключения к вашей JVM. Это в первом случае, когда вы напрямую подключаетесь к контейнеру с помощью 172.17.0.2:1099, этот параметр должен быть установлен в 172.17.0.2. В последнем случае, когда вы получаете доступ к контейнеру через докер-машину на 192.168.99.100:1099, настройка должна быть установлена ​​на 192.168.99.100.

Во время моего исследования для очень похожего вопроса (который был удален тем временем) я наткнулся на запись в блоге (которая была удалена тем временем также). Хотя это довольно старая она дала мне представление о том, как работает подключение JMX:

  1. Реестр JMX прослушивает порт <com.sun.management.jmxremote.port> контейнера
  2. Если подключиться к реестру с JConsole, реестр предоставляет URL JMX службы для клиента.
  3. Этот URL используется клиентом для получения JMX объектов

URL-адрес службы выглядит следующим образом service:jmx:rmi:///jndi/rmi://<java.rmi.server.hostname>:<com.sun.management.jmxremote.rmi.port>/jmxrmi. То есть в вашем случае service:jmx:rmi:///jndi/rmi://172.17.0.2:1099/jmxrmi. Поскольку этот адрес доступен только на докере, соединение с пультом невозможно. В моем вопросе я затрагиваю ту же проблему в отношении порта RMI ...

Похоже, что не существует готового решения этой проблемы. Однако при запуске контейнера в качестве переменных среды можно указать как порт JMX, так и имя внешнего хоста (или IP), как предложено here.Затем они могут быть использованы в конфигурации JMX:

docker run -p 1099:1099 \ 
    -e "JMX_HOST=192.168.99.100" \ 
    -e "JMX_PORT=1099" \ 
    company/tomcat:8.0.30 

и

CATALINA_OPTS="... \ 
    -Dcom.sun.management.jmxremote=true \ 
    -Dcom.sun.management.jmxremote.port=$JMX_PORT \ 
    -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT \ 
    -Dcom.sun.management.jmxremote.authenticate=false \ 
    -Dcom.sun.management.jmxremote.ssl=false \ 
    -Djava.rmi.server.hostname=$JMX_HOST" 

Не очень хорошо, но он должен работать ...

+0

Да, этот подход работает, и я понял его точно так же, как вы, я только что забыл написать ответ :) Спасибо. – stewenson

+1

BTW: Это сработало и для меня (Java 7, Tomcat 7), но мне также пришлось добавить '-Dcom.sun.management.jmxremote =' в 'CATALINA_OPTS', чтобы заставить его работать. Просто наличие отдельных свойств было недостаточно. – nwinkler

+1

@nwinkler, конечно, вы правы. Я обновил свой ответ, чтобы включить недостающее системное свойство 'com.sun.management.jmxremote' – dpr

1

Если у кого есть проблемы с ним. Я начал процесс Java в контейнере Docker со следующими параметрами:

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=9876 
-Dcom.sun.management.jmxremote.rmi.port=9876 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-Djava.rmi.server.hostname=<name of the docker container> 

важная часть, чтобы установить имя контейнера Докер. EXPOSE порт в контейнере 9876. Я также установил ssh-соединение и переслал 9876 на localhost.

Ниже идет на ваш SSH конфигурации:

LocalForward 127.0.0.1:9876 127.0.0.1:9876 

Кроме того, я настройки/и т.д./хосты на локальной машине

127.0.0.1 <name of the docker container> 

Теперь подключить консоль к «имя контейнера Докер»

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