Статьи

Контейнеры Docker с Gradle в 4 шага

fourdoor Вам нужно создать образ 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 .