Вам нужно создать образ Docker из вашего веб-приложения Java? Вы используете Gradle ? Если это так, то вы всего в 4 шагах от Docker nivana.
Для этого примера я собираюсь использовать простое приложение Spring Boot . Вы можете найти весь исходный код в моем репозитории Github, который называется Galoshe .
Если у вас не было возможности увидеть Spring Boot в действии, то вас ждет удовольствие, особенно если слова simple и Java web app в одном предложении заставят вас вздрогнуть. Это была моя давняя реакция, пока я серьезно не посмотрел на Бута.
Например, быстрое и грязное загрузочное приложение «hello world» — это, по сути, больше импорта и аннотаций, чем реального кода. Проверьте это:
Простое приложение Spring Boot
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
package com.github.aglover.galoshe; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @Configuration @EnableAutoConfiguration @ComponentScan public class Application { public static void main(String[] args) { ApplicationContext ctx = SpringApplication.run(Application. class , args); } @RequestMapping ( "/" ) public String index() { return "Hello to you, world" ; } } |
Запустить это приложение так же просто, как набрать:
1
|
$ java -jar build/libs/galoshe- 0.1 . 0 .jar |
Эта команда запустит встроенный веб-контейнер с путем запроса /
сопоставленным, чтобы вернуть простую String
«Привет тебе, мир». Вы можете определить, на каком порту будет запускаться это приложение, с помощью файла application.properties
следующим образом:
application.properties
1
|
server.port: 8080 |
Следовательно, если я возьму свой браузер и укажу его на localhost: 8080, я увижу пешехода, но это очень приятно, когда вы видите это приветствие.
Теперь, когда вы познакомились с приложением, которое я хотел бы распространить в виде контейнера Docker, позвольте мне показать вам, как сделать это в 4 простых шага.
Имейте в виду, однако, что для того, чтобы использовать плагин gradle-docker, который я использую в этом примере, вам нужно будет установить Docker, так как плагин отправляется команде docker
.
Шаг 1: применить некоторые плагины
Прежде всего, чтобы Docker-ize ваше приложение, вам нужно использовать два плагина Gradle: docker
и application
.
Плагин Gradle-Docker от Transmode на самом деле является одним из 2 доступных плагинов для Dockering with Gradle. Другой плагин от Bendle Muscheko от Gradleware немного более продвинут с дополнительными функциями, однако, я считаю, что плагин Transmode самый простой и быстрый в использовании.
Плагин application
фактически включается автоматически через плагин spring-boot
в моем конкретном примере, однако, если вы не используете Boot, вам нужно добавить следующие два плагина в ваш файл build.gradle
:
1
2
|
apply plugin: 'application' apply plugin: 'docker' |
Поскольку подключаемый модуль docker
является сторонним модулем, вам нужно указать Gradle, как его найти с помощью предложения dependencies
.
Указание пути к классу для подключаемого модуля Docker
1
2
3
4
5
6
|
buildscript { repositories { mavenCentral() } dependencies { classpath 'se.transmode.gradle:gradle-docker:1.1' } } |
Теперь ваш скрипт Gradle готов к запуску Docker-ing. Далее вам нужно будет предоставить некоторые подсказки, чтобы плагин мог создать действительный Dockerfile
.
Шаг 2: укажите некоторые свойства
Плагин gradle-docker напрямую не создает контейнер Docker — он просто создает Dockerfile
а затем отправляет команду docker
для создания образа. Следовательно, вам нужно указать несколько свойств в вашем файле build.gradle
чтобы соответствующий Dockerfile
создавал допустимый контейнер, который автоматически запускает ваше приложение.
Вам необходимо предоставить:
- Класс для запуска, т.е. класс в вашем приложении, который содержит метод
main
- Целевая версия JVM (по умолчанию Java 7)
- При желании , идентификатор группы, который подается в соответствующий тег Docker.
Соответственно, мой build.gradle
определяет все три свойства следующим образом:
Определение свойств для подключаемого модуля Docker
1
2
3
|
group = 'aglover' sourceCompatibility = 1.7 mainClassName = 'com.github.aglover.galoshe.Application' |
Несколько заметок об этих свойствах. Во-первых, Java 8 в настоящее время недоступна для этого плагина. Если вы не укажете sourceCompatibility
, вы получите Java 7. Далее, свойство group
не требуется; однако, это помогает в тегировании Docker. Например, baseName
моего проекта называется galoshe
; следовательно, когда плагин создает изображение Docker, он помечает это изображение group/name
шаблона. Так что в моем случае соответствующее изображение помечено как aglover/galoshe
.
Наконец, mainClassName
не должно быть слишком удивительным — это крючок для вашего приложения. По правде говоря, плагин создаст скрипт, который ваш результирующий образ Docker вызовет при запуске. Этот скрипт по существу вызовет команду:
1
|
java -classpath your_class_path your_main_class |
На данный момент, вы почти закончили. Далее вам необходимо указать любые инструкции Dockerfile
.
Шаг 3: Укажите все необходимые инструкции Dockerfile
Dockerfile
содержит специальные инструкции для соответствующего образа, который они создают. Есть несколько важных ; тем не менее, моему загрузочному приложению требуется только один: port
, который задается с помощью метода exposePort
плагина.
Следовательно, чтобы убедиться, что мой контейнер Docker предоставляет порт 8080, как определено в моем файле application.properites
, я добавлю следующее предложение в мой файл build.gradle
:
Указание порта 8080
1
2
3
|
distDocker { exposePort 8080 } |
Несколько других аспектов, которые вы можете использовать с помощью плагина: addFile
который приводит к инструкции ADD
, runCommand
, которая приводит к runCommand
RUN
, и, наконец, setEnvironment
, который создает инструкцию ENV
.
Теперь вы закончили со сборкой Gradle. Все, что осталось сделать, это запустить свою сборку и запустить изображение!
Шаг 4: Постройте и запустите
При условии, что вы правильно настроили плагин gradle, осталось только запустить сборку. В этом случае команда просто distDocker
.
Запуск моей сборки
1
|
$ ./gradlew distDocker |
При первом запуске этой команды потребуется немного времени, так как будут загружены различные изображения. Последующие пробеги будут молниеносными.
После завершения сборки ваше изображение будет создано с тегом, который я отметил ранее. В моем случае, тег будет aglover/galoshe
, который я могу быстро увидеть, выполнив команду images
:
Список доступных локальных образов Docker
1
2
3
4
|
$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE aglover/galoshe latest 332e163221bc 20 hours ago 1.042 GB dockerfile/java latest f9793c257930 3 weeks ago 1.026 GB |
Впоследствии я могу запустить свой образ так:
Запуск моего контейнера
1
|
docker run 332e163221bc |
Естественно, я могу зайти в свой браузер, нажать localhost: 8080 и почувствовать себя вполне довольным тем, что мое изображение имеет отличное приветствие.
Конечно, мне нужно было бы опубликовать это изображение, чтобы другие могли его использовать; тем не менее, как вы можете видеть, плагин gradle позволяет быстро создавать контейнеры Docker для приложений Java.
Ссылка: | Контейнеры Docker с Gradle за 4 шага от нашего партнера JCG Эндрю Гловера в блоге The Disco Blog . |