Щоб запустити якись додаток у контейнері, цей додаток спочатку треба створити. Створимо простий додаток, котрий буде мати підключення до бази даних MongoDB та дасть змогу щось до неї писати та читати записане. А у наступному записі ми створемо 2 контейнери – один з базою даних, інший з додатком.
Створюємо простий додаток з використанням Spring Boot.
1. Створюємо об’єкт, котрий будемо зберігати у базі даних
package ua.net.maxx.demo.docker;
import org.springframework.data.annotation.Id;
public class Item {
@Id
private String id;
private String value;
private Item() {
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getId() {
return id;
}
@Override
public String toString() {
return "Item [id=" + id + ", value=" + value + "]";
}
}
2. Створюємо інтерфейс для бази даних
package ua.net.maxx.demo.docker;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface ItemRepository extends MongoRepository<Item, String> {
public Item findById(String id);
}
3. Створюємо контролер
package ua.net.maxx.demo.docker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/demo")
public class WebController {
@Autowired
private ItemRepository repository;
@RequestMapping(method = RequestMethod.GET)
public @ResponseBody Item getItem(@RequestParam(value = "id", required = true) String id) {
return repository.findById(id);
}
@RequestMapping(method = RequestMethod.POST)
public @ResponseBody Item getUpdateItem(@RequestBody Item item) {
return repository.save(item);
}
}
4. Створюємо клас щоб виконати додаток
package ua.net.maxx.demo.docker;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Starter {
public static void main(String[] args) {
SpringApplication.run(Starter.class, args);
}
}
5. Створюємо фай конфігурації
spring:
profiles.active: default
---
spring:
profiles: default
data:
mongodb:
host: db-host
database: demo-database
6. Створюємо конфігурація для maven
<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>ua.net.maxx.demo.docker</groupId>
<artifactId>docker-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Docker demo project</name>
<properties>
<java.version>1.8</java.version>
<spring.boot.version>1.4.0.RELEASE</spring.boot.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Тепер це можна запустити додаток за допомогою команди
clean package spring-boot:run
Тепер можна відкрити браузер та перейти за посиланням http://localhost:8080/demo/ та побачити таку відповідь:
Незважаючи на помилку, усе працює нормально. У цьому додатку немає функції, яка обробляє такий запит.
7. Наступним кроком додаємо до цього проекту документацію, яка буде сгенерована автоматично за допомогою бібліотеки Swagger
додаємо наступні рядки до файлу pom.xml
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
Та додаємо файл конфігурації Swagger
package ua.net.maxx.demo.docker;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2).select()
.apis(RequestHandlerSelectors.basePackage("ua.net.maxx.demo.docker")).paths(PathSelectors.any()).build()
.apiInfo(apiInfo());
}
private ApiInfo apiInfo() {
ApiInfo apiInfo = new ApiInfo("Demo service REST API", "API for demo", "1.0", "Terms of service",
"myeaddress@company.com", "License of API", "API license URL");
return apiInfo;
}
}
8. Тепер можна запустити додаток за допомогою тієї самої команди
clean package spring-boot:run
та перейти за посиланням http://localhost:8080/swagger-ui.html та навіть за допомогою Swagger спробувати відправити запит до додатка. У відповідь через деякий час ми отримаємо помилку. Це нормально, бо бази даних в нас досі немає.
9. Наступним кроком підготуємо наш додаток для запуску у контейнері. Для цього додаємо у конфігурацію pom.xml плагіни, котри зберуть усі бублиотеки у теку /lib та створять jar файл, котрий можна запускати.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>ua.net.maxx.demo.docker.Starter</mainClass>
</manifest>
</archive>
</configuration>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
<version>2.10</version>
</plugin>
10. Виконуємо команду
clean package install
після цього у теці /target можна буде побачити файл docker-demo-0.0.1-SNAPSHOT.jar та теку /lib з усіма бібліотеками, які необхідні цьому додатку.
У наступній частині ми створимо контейнер до docker та запустимо додаток у образі, котрий було зроблено у частині першій.
