Перейти к содержимому

Как упаковать java приложение в docker

  • автор:

Как собрать приложение в docker java mysql

Для сборки приложения Java с использованием базы данных MySQL в контейнере Docker можно использовать следующие шаги:

  • Написать Dockerfile для приложения Java . Пример файла может выглядеть так:
FROM openjdk:11-jre-slim COPY target/myapp.jar /app.jar CMD ["java", "-jar", "/app.jar"] 

В этом примере мы используем базовый образ openjdk:11-jre-slim , копируем собранный JAR-файл приложения в контейнер и запускаем его с помощью команды java -jar

  • Написать Dockerfile для базы данных MySQL . Пример файла может выглядеть так:
FROM mysql:latest ENV MYSQL_ROOT_PASSWORD=password ENV MYSQL_DATABASE=myapp COPY init.sql /docker-entrypoint-initdb.d/ 

В этом примере мы используем базовый образ mysql:latest , устанавливаем пароль для пользователя root , создаем базу данных myapp и копируем файл init.sql в директорию /docker-entrypoint-initdb.d/ . Этот файл будет автоматически выполнен при запуске контейнера.

  • Написать скрипт для сборки образов и запуска контейнеров. Пример скрипта может выглядеть так:
#!/bin/bash mvn clean package docker build -t myapp . docker build -t mysql-db ./mysql docker run -d --name mysql -p 3306:3306 mysql-db docker run -d --name myapp --link mysql:mysql -p 8080:8080 myapp 

В этом примере мы сначала собираем приложение с помощью Maven , затем создаем образы для приложения и базы данных. Затем мы запускаем контейнеры с помощью команды docker run . Опция —link позволяет связать контейнеры myapp и mysql , чтобы приложение могло подключаться к базе данных.

  • Проверить работу приложения.

осле запуска контейнеров можно проверить работу приложения, открыв веб-браузер и перейдя по адресу http://localhost:8080 . Если все настроено правильно, вы должны увидеть страницу вашего приложения.

Это только пример сборки приложения с использованием базы данных MySQL в контейнере Docker , и настройка может отличаться в зависимости от ваших требований.

Как упаковать java приложение в docker

Упаковка Java приложения в Docker обычно выполняется в несколько шагов:

  • Убедитесь, что Docker установлен на вашей машине. Если нет, установите его из официального сайта Docker
  • Создайте Dockerfile в корневой директории вашего проекта Java . Dockerfile является инструкцией для Docker о том, как собрать образ вашего приложения. Вот пример Dockerfile для Java-приложения , которое использует OpenJDK 11 :
FROM openjdk:11 COPY . /usr/src/myapp WORKDIR /usr/src/myapp RUN javac Main.java CMD ["java", "Main"] 

Этот Dockerfile начинается с образа OpenJDK 11 , копирует все файлы в текущей директории в папку /usr/src/myapp в образе, устанавливает рабочую директорию в /usr/src/myapp , компилирует файл Main.java и запускает его.

  • Соберите Docker-образ с помощью команды docker build . Укажите путь к Dockerfile и тег для нового образа:
-t my-java-app . 
  • Запустите контейнер на основе созданного образа с помощью команды docker run :
-p 8080:8080 my-java-app 

Эта команда запустит контейнер, привяжет порт 8080 в контейнере к порту 8080 на хосте и запустит ваше Java-приложение внутри контейнера.

Это общий пример упаковки Java-приложения в Docker . Некоторые шаги могут отличаться в зависимости от вашего конкретного приложения и требований.

Упаковка 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-aether на Хабре

Для меня это удобный инструмент, который часто использую. Как пример — загрузка 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 контейнер с параметрами приложения.

  • Java
  • Groovy & Grails
  • Системы сборки

Как сделать docker image с двумя контейнерами?

Я совсем новичек в докере и мне дали задание залить свое приложение в докер, но вот беда , мое приложение использует кафку и задача такова, что мне нужно помимо jar файла залить еще и кафку в докер, так чтобы все работало в отрыве. Сейчас я сделал это приложение и локально запускаю и кафку и код и все работает. Задача как раз в том чтобы переместить все в докер, так что прошу помощи, может статьи какие или еще что, потому что в инете не особо нашел полезного для моей ситуации. Заранее спасибо !

Отслеживать
задан 13 сен 2021 в 11:43

Пожалуйста, исправьте вопрос, чтобы он отражал конкретную проблему с достаточным количеством деталей для возможности дать адекватный ответ.

13 сен 2021 в 12:19

ваше java приложение можно упаковать в отдельный образ, а для kafka использовать готовый образ, например от bitnami, и потом это все можно объединить с помощью docker-compose

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *