Как соединиться с JMX от хоста до контейнера Docker на машине Docker?

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

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

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

Мой докер имеет 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 

2 ответа

Решение

Я думаю, что проблема, вероятно, в ценности 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-адрес) в качестве переменных среды, как предлагается здесь. Затем они могут быть использованы в конфигурации 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"

Не очень приятно, но это должно работать...

Если у кого-то есть проблемы с этим. Я запустил процесс 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>

Важной частью является установка имени контейнера Docker. ВОЗДЕЙСТВУЙТЕ порт в контейнере 9876. Я также настроил соединение ssh и перенаправил 9876 на локальный хост.

Следующее идет к вашей конфигурации SSH:

LocalForward 127.0.0.1:9876 127.0.0.1:9876

Также у меня есть настройка /etc/hosts на локальной машине

127.0.0.1 <name of the docker container>

Теперь подключите вашу консоль к "имени контейнера докера"

Другие вопросы по тегам