Упаковка jvm приложения в docker образ

Все плюсы docker для приложения, уже много раз описывали на Хабре, как и его архитектуру.
a1d6abe0e88d459cafac028f9c38a7a9.jpg

Мы же решим практическую задачу по упаковке 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-aether на Хабре
Уличная магия в скриптах или что связывает Groovy, Ivy и Maven?
Отладка 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, без привязки к какому-то дистрибутиву

© Habrahabr.ru