Упаковка jvm програми в docker образ

Всі плюси 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-ефір на ХабреВулична магія в скриптах або що пов'язує 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-ефір.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 контейнер з параметрами програми.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.