Статья подготовлена для студентов курса «Разработчик Java» в образовательном проекте OTUS.
В первой части мы рассмотрели новые возможности работы Java-приложения в Docker-е. В этой части рассмотрим вопрос, как мониторить работающее в Docker-е Java-приложение.
Для мониторинга в Java-мире есть два очень популярных тула: VisualVM и jconsole. Давайте попробуем ими воспользоваться.
В Dockerfile пишем такую команду запуска:
CMD java -jar testJavaAppl.jar
Запускаем контейнер:
docker run java-docker
Запускаем jconsole. И видим, что jconsole не видит наше приложение в контейнере, хотя оно и запущено на этом же хосте. Дело понятное, Java-приложение работает в контейнере, который хорошо изолирует приложение от внешнего мира, поэтому jconsole его и не видит. Чтобы снаружи получить доступ к приложению в контейнере, надо запустить контейнер с «проброшенными» наружу портами. В нашем случае надо пробросить порт jmx, к которому будет подключаться jconsole. Но чтобы этот порт пробросить, его сначала надо открыть.
Меняем Dockerfile, пишем в нём такую команду:
CMD java -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=1026
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-jar testJavaAppl.jar
Так мы говорим, что приложение будет слушать 1026 порт.
Стартуем контейнер с указанием порта:
docker run -p1026:1026 java-docker
Проверяем, что контейнер слушает порт.docker psВ разделе PORTS, видим:
0.0.0.0:1026->1026/tcp
Всё идёт по плану. Теперь запускаем jconsole. В списке локальных процессов нашего приложения нет. Подключаемся как к удалённому процессу:
localhost:1026
Jconsole успешно подключилась к приложению в контейнере. Теперь можно понаблюдать за его работой.
Если хотите узнать больше, смотрите наш открытый урок. На нём мы посмотрим на этот пример в комплексе и выясним некоторые другие нюансы.
OTUS открыл 15-ый набор легендарного онлайн-курса «Разработчик Java»
Вас ждёт:
— 5 месяцев Best Practice по Java-разработке (теперь на gradle вместо maven);
— особенности разработки серверных приложений на Java;
— проектирование, тестирование, низко- и высокоуровневые подходы к созданию многопоточных и многопроцессных приложений;
— утилиты Jmh и Jol, Byte-коды, области применения unsafe и многое другое.