Java и Docker. Часть 2
В первой части мы рассмотрели новые возможности работы 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 успешно подключилась к приложению в контейнере. Теперь можно понаблюдать за его работой.
Если хотите узнать больше, смотрите наш открытый урок. На нём мы посмотрим на этот пример в комплексе и выясним некоторые другие нюансы.