Как собрать приложение в 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