Java и Docker. Часть 2
2026-03-10 18:55 Diff

Теги: docker, java, программирование на java, разработка на java, java 10, контейнер, jconsole, visualvm, проброс портов

В первой части мы рассмотрели новые возможности работы Java-приложения в Docker-е. В этой части рассмотрим вопрос, как мониторить работающее в Docker-е Java-приложение.

Для мониторинга в Java-мире есть два очень популярных тула: VisualVM и jconsole. Давайте попробуем ими воспользоваться.

В Dockerfile пишем такую команду запуска:

CMD java -jar testJavaAppl.jar

Запускаем контейнер:

Запускаем 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, видим:

Всё идёт по плану. Теперь запускаем jconsole. В списке локальных процессов нашего приложения нет. Подключаемся как к удалённому процессу:

Jconsole успешно подключилась к приложению в контейнере. Теперь можно понаблюдать за его работой.

Если хотите узнать больше, смотрите наш открытый урок. На нём мы посмотрим на этот пример в комплексе и выясним некоторые другие нюансы.