/ Java

Spring Boot с Docker

Перевод статьи + некоторые комментарии

Вы пройдете с этой инструкцией через процесс построения Docker образа для запуска Spring Boot приложения.

Что Вы построите

Docker это инструмент управления Linux контейнерами с "социальным" аспектом, позволяющим пользователям публиковать свои образы и использовать опубликованные другими. Docker образ это рецепт для запуска контейнеризованного процесса, и в этой инструкции мы построим один для простого Spring Boot приложения.

Что Вам понадобиться

Приблизительно 15 минут

Ваша любимая IDE или текстовый редактор

JDK 1.8 or новее

Gradle 2.3+ или Maven 3.0+

Вы также можете импортировать код из этой инструкции как есть, прямо в Spring Tool Suite (STS).

Советую просто использовать intellij idea или eclipse

В оригинале статьи говорилось, что если у Вас нет linux машины, то вы могли бы поставить решение от Docker, позволяющее использовать Docker запущенный на VirtualBox. Теперь вышел из беты Docker for Windows, и Docker for Mac,их я и рекомендую. В настоящее время на можно использовать Win10 x64. Подробнее читайте она официальном сайте, как установить Docker под Вашу платформу.

Проверьте, набрав ко терминале команду (на Win используйте PowerShall): docker

Как завершить данную инструкцию

Как и большинство инструкций Spring Getting Started, Вы можете начать с наброска и завершить каждый шаг, или вы можете обойти простые шаги если это уже Вам знакомо.

В любом случае, вы завершите с работающим кодом.

Чтобы начать с шаблона, перейдите к Build with Gradle.

Чтобы пропустить основы, сделайте следующее:

Скачайте и разархивируйте репозиторий с исходниками для этой инструкции или клонируйте это используя Git:

git clone https://github.com/spring-guides/gs-spring-boot-docker.git

cd gs-spring-boot-docker/initial

и переходите к разделу Создание Spring Boot приложения

Когда вы закончите, вы можете проверить Ваш результат с кодом в gs-spring-boot-docker/complete

Сборка с использованием Gradle

Для начала напишите простой build-скрипт. Вы можете использовать любую систему сборки, какую хотите когда собираете приложение с использованием Spring, но здесь приведен только код для работы с Gradle и Maven. Если Вы не знакомы с любой из них, почитайте Building Java Projects with Gradle или Building Java Projects with Maven.

Создайте структуру директорий

Выберите где Вы будете хранить проект, создайте следующую систему поддиректорий; например с использованием mkdir -p src/main/java/hello на *unix системах:

└── src
    └── main
        └── java
            └── hello
Создайте сборочный файл Gradle

Внизу приведен начальный сборочный файл Gradle

build.gradle
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.4.0.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'

jar {
    baseName = 'gs-spring-boot-docker'
    version =  '0.1.0'
}

repositories {
    mavenCentral()
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile("org.springframework.boot:spring-boot-starter-test")
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.3'
}

Spring Boot gradle плагин предоставляет множество удобных особенностей:

  • Он собирает все jar-файлы из classpath и сборки в один, запускаемый "über-jar", что делает более удобным запуск и транспортировку Вашего сервиса.
  • Он ищет public static void main() метод, чтобы пометить его как запускаемый класс.
  • Он предоставляет встроенный dependency resolver, который устанавливает номер версии совместимый с Spring Boot зависимостями. Вы можете переопределить каждую версию по своему желанию, но он будет выбирать по умолчанию выбранные Boot-ом версии.

Сборка с помощью Maven

Для начала напишите простой build-скрипт. Вы можете использовать любую систему сборки, какую хотите когда собираете приложение с использованием Spring, но здесь приведен только код для работы с Gradle и Maven. Если Вы не знакомы с любой из них, почитайте Building Java Projects with Gradle или Building Java Projects with Maven.

Создайте структуру директорий

Выберите где Вы будете хранить проект, создайте следующую систему поддиректорий; например с использованием mkdir -p src/main/java/hello на *unix системах:

└── src
    └── main
        └── java
            └── hello
Создайте сборочный файл Maven
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.springframework</groupId>
    <artifactId>gs-spring-boot-docker</artifactId>
    <version>0.1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.0.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Spring Boot maven плагин предоставляет множество удобных особенностей:

  • Он собирает все jar-файлы из classpath и сборки в один, запускаемый "über-jar", что делает более удобным запуск и транспортировку Вашего сервиса.
  • Он ищет public static void main() метод, чтобы пометить его как запускаемый класс.
  • Он предоставляет встроенный dependency resolver, который устанавливает номер версии совместимый с Spring Boot зависимостями. Вы можете переопределить каждую версию по своему желанию, но он будет выбирать по умолчанию выбранные Boot-ом версии.

Создание Spring Boot приложения

Как Вы можете создать простое приложение. src/main/java/hello/Application.

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.bind.RelaxedPropertyResolver;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class Application {

	@RequestMapping("/")
	public String home() {
		return "Hello Docker World";
	}


	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}

}

Класс помеченный как @SpringBootApplication и как @RestController, значит что он готов к использованию Spring MVC для обработки веб запросов. @RequestMapping связывает адрес / с методом home(), который просто посылает 'Hello World' в ответ. Метод main() используется Spring Boot-товым SpringApplication.run() методом для запуска приложения.

Как мы можем запустить приложение без Docker контейнера (т.е. на нашей ОС).

Если вы используете Gradle, запустите в терминале:

./gradlew build && java -jar build/libs/gs-spring-boot-docker-0.1.0.jar

Если вы используете Maven, запустите:

mvn package && java -jar target/gs-spring-boot-docker-0.1.0.jar

и перейдите к localhost:8080 чтобы увидеть ваше Hello Docker World сообщение.

Контейнерезируем это

В Docker есть простой Dockerfile формат, который используется для указаний 'слоям' образа. И так, давайте пойдем вперед и создадим Dockerfile внутри Вашего Spring Boot проекта: src/main/docker/Dockerfile

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD gs-spring-boot-docker-0.1.0.jar app.jar
RUN sh -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

Этот Dockerfile очень простой, но этого достаточно чтобы запустить Spring Boot приложение без излишеств: просто Java и JAR файл. JAR файл проекта добавлен в контейнер как "app.jar" и затем запускается в ENTRYPOINT (точке входа).

Мы добавили VOLUME указывающий на "/tmp" потому что, именно сюда Spring Boot приложение создает рабочие директории для Tomcat по умолчанию. Результат - создать временный файл на Вашем хосту под "/var/lib/docker" и залинковать это с контейнером под "/tmp". Этот шаг не обязательный для простого приложения, которое мы пишем здесь, но это может быть необходимо для других Spring Boot приложений если им нужно на самом деле писать в файловую систему

.

Вы можете использовать RUN команду чтобы прикасаться к jar файлу, в результате файл будет иметь время изменения (Docker создает все файлы контейнера в "не модифицируемом" состоянии по умолчанию). Это не очень важно для простого приложения что мы написали, но любой статический контент (например "index.html") может потребовать файл, который хранит время изменения.

.

Чтобы сократить время запуска Tomcat мы добавили системное свойство указывающее на "/dev/urandom" как источник энтропии.

.

Если Вы используете boot2docker Вам нужно запустить его перед тем, как Вы будете делать что-либо с Docker через командную строку или через инструменты сборки (он запускает docker демон, который управляет Вашей работой в виртуальной машине.

Для сборки образов Вы можете использовать некоторые инструменты для Maven или Gradle от сообщества (большое спасибо Transmode и Spotify за то что сделали эти инструменты доступными).

Построение Docker образа с помощью Maven

В pom.xml вы должны добавить плагин, как показано здесь (смотри документацию плагина для настроек):

<properties>
    <docker.image.prefix>springio</docker.image.prefix>
 </properties>
 <build>
     <plugins>
<plugin>
	<groupId>com.spotify</groupId>
	<artifactId>docker-maven-plugin</artifactId>
	<version>0.2.3</version>
	<configuration>
		<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
		<dockerDirectory>src/main/docker</dockerDirectory>
		<resources>
			<resource>
				<targetPath>/</targetPath>
				<directory>${project.build.directory}</directory>
				<include>${project.build.finalName}.jar</include>
			</resource>
		</resources>
	</configuration>
</plugin>
     </plugins>
 </build>

В конфигурациях определено 3 вещи:

  • Название образа (или тег), который получится в результате, здесь получим springio/gs-spring-boot-docker
  • Директорий в которой искать Dockerfile
  • Ресурсы (файлы) которые нужно скопировать из target директории в docker build (там где Dockerfile) - для этого примера нам нужен только jar-файл.

Перед работай с следующими шагами (где мы используем CLI инструменты Docker), убедитесь что Docker запущен, набрав команду docker ps. Если вы получили сообщение об ошибке, что-то настроено не правильною Используете Mac? Добавьте $(boot2docker shellinit 2> /dev/null) снизу вашего .bash_profile (или в похожий файл настроек окружения) и обновите ваш shall чтобы переменные окружения были сконфигурированны.

<<продолжение будет скоро>>

Spring Boot с Docker
Share this

Subscribe to Yet another blog