Как соединиться с 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-соединение:
- Реестр JMX прослушивает порт
<com.sun.management.jmxremote.port>
контейнера - Если вы подключаетесь к реестру с помощью JConsole, реестр предоставляет клиенту URL-адрес службы JMX.
- Этот 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>
Теперь подключите вашу консоль к "имени контейнера докера"