Упаковка jvm приложения в docker образ
Мы же решим практическую задачу по упаковке jvm приложения и получим контейнер с миниатюрным Linux, JDK и нашим приложением, который опубликуем на hub.docker.com и сможем запускать где угодно.Исходное приложение
Если ваше приложение для jvm состоит из более чем одного файла и образ нужно генерировать регулярно/автоматически, то можно интегрировать процесс сборки в maven с помощью плагина com.spotify: docker-maven-plugin. Если же вы используете Gradle, то se.transmode.gradle: gradle-docker вам поможет сделать сборку docker образа. Пример для maven опубликовал на github.
В публикации используем jar из центрального maven репозитария. Это своя сборка груви, которая примечательна упакованным aether provide для разрешения зависимостей Grape и расширенной поддержкой протоколов для java.net.URL. Для пытливых умов:
Отладка Groovy скриптов с Grape на основе maven aether.
java.net.URL или старый конь борозды не испортит.
Для меня это удобный инструмент, который часто использую. Как пример — загрузка jvm агента в запущенную JVM, инсталятор для crate.io, пример парсера сайта…
Теперь groovy-grape-aether доступен и в docker образе suhorukov/docker-groovy. В подобный образ вы может упаковать ваше приложение для jvm.
DockerfileОписывает на основе какого существующего образа и с помощью каких команд сформировать новый образ.
Воспользуемся образом frolvlad/alpine-oraclejdk8, с благодарностью frol за его труд! Этот образ на основе Alpine Linux image + glibc и Oracle JDK 8u102.14. Достаточно компактный, по сравнению с образами на основе на debian/ubuntu. Как альтернатива возможен популярный образ anapsix/alpine-java.
FROM frolvlad/alpine-oraclejdk8
EXPOSE 8080
ENV GROOVY_VERSION=2.4.5.4
RUN mkdir "/usr/lib/groovy" && \
wget "http://repo1.maven.org/maven2/com/github/igor-suhorukov/groovy-grape-aether/$GROOVY_VERSION/groovy-grape-aether-$GROOVY_VERSION.jar" -O /usr/lib/groovy/groovy-grape-aether.jar
ENTRYPOINT ["java","-jar","/usr/lib/groovy/groovy-grape-aether.jar"]
CMD ["--help"]
Здесь я указал что порт 8080 будет слушать приложение внутри контейнера. При запуске контейнера можно указать параметр -P и тогда он будет привязан к динамическому порту хост-машины, либо параметр -p и можно указать какой порт хоста соответствует порту контейнера.
ENTRYPOINT определяет какая команда с параметрами будет запущена при старте контейнера. Для команды возможно указать с помощью CMD параметры по-умолчанию.
Собираем образ локальноЗапускаем в той же директории, где находится наш Dockerfile команду
docker build -t docker-groovy .
Публикация в hub.docker.com
Этот раздел можете пропустить, если у вас не opensource проект и вам не нужно делиться образом со всем миром.
Публикуем Dockerfile на github
В своей учетной записи на github выбираем New Repository и помещаем туда подготовленный Dockerfile. В этом примере используется репозитарий docker-groovy.
Настраиваем сборку в hub.docker.com
Создаем бесплатный аккаунт на главной странице hub.docker, заполнив форму и нажав «Sign Up». Обязательно активируем его с помощью письма в email.
В настройках аккаунта заходим во вкладку «Linked Accounts & Services» и настраиваем «Link Github» на ваш github аккаунт (другой вариант Bitbucket аккаунт).
В меню вверху страници выбираем Create→Create Automated Build, затем жмем«Create Auto-build Github», выбираем репозитарий и указываем где в репозитарии Dockerfile. При следующем push в репозитарий на github сборка автоматичеки запустится. Можно запустить и сборку вручную.
В результате всех вышеописанных действий получился такой проект на hub.docker.com.
Загрузка и использование контейнераПеред использованием, получим образ из hub.docker.
docker pull suhorukov/docker-groovy
И запустим контейнер с параметром-скриптом gitblit.groovy.
docker run -d -p 8080:8080 suhorukov/docker-groovy https://raw.githubusercontent.com/igor-suhorukov/git-configuration/master/gitblit.groovy
В случае, если для приложения нужен доступ к внешним для контейнера ресурсам в файловой системе (директории хост-машины, NFS, распределенной файловой системы) то нужно указать точки монтирования при создании образа в секции VOLUME в Dockerfile. Если же нужно распределенное выполнение и орекстрация контейнеров — Kubernetes / Mesos / Swarm / fabric8.io / Rancher более подходящие для этого технологии которые работают с docker.
На примере jvm приложения мы создали и опубликовали миниатюрный образ на hub.docker.com, после чего запустили docker контейнер с параметрами приложения.
Комментарии (3)
21 сентября 2016 в 15:01
0↑
↓
А можно сделать jvm образ без OS?21 сентября 2016 в 15:05 (комментарий был изменён)
0↑
↓
Нельзя. jvm без ОС это baremetal прямо)
21 сентября 2016 в 15:14
0↑
↓
В смысле образ jvm для OS Linux, без привязки к какому-то дистрибутиву