Spring Boot + Docker: Hello World Example
ЦЕЛЬ
Создать простейшее Spring Boot приложение и развернуть его в Docker-е.
PREREQUISITES
У Вас должен быть установлен Docker.
Для проверки его наличия, можно выполнить в консоли:
docker --version
В случае отсутствия Docker его нужно установить (это остается за рамками инструкции).
STEP BY STEP INSTRUCTION
(1) Войти на Spring Initializr:
(2) Создать проект с одной лишь зависимостью: web
(3) В application.properties установить значение:
server.address=0.0.0.0
Если этого не сделать, потом могут быть проблемы с маппингом внешнего урла на урл приложения внутри контейнера.
(4) Создать класс TestController:
package com.example.springdocker.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping
public class TestController {
@GetMapping(value = "/")
public String test() {
return "Hello from Docker Example";
}
}
(5) Собрать проект maven-ом
mvnw clean install
(6) В корне проекта создать файл Dockerfile:
со следующим содержимым:
FROM openjdk:11
ADD target/spring-docker-0.0.1-SNAPSHOT.jar dock.jar
ENTRYPOINT ["java","-jar","/dock.jar"]
(7) Из корня проекта запустить сборку:
sudo docker build --tag=spring-docker:latest .
(8) Убедиться, что образ появился в списке образов Docker:
sudo docker images
(9) Запустить образ
sudo docker run -d -p8080:8080 dock:latest
(10) Войти через браузер на localhost:8080 и увидеть приветствие нашего приложения, запущенного через Docker:
Разбор инструкций в Dockerfile
Строка 1
FROM openjdk:11
Ключевое слово FROM сообщает Docker о том, какой использовать базовый образ (т.е. какую ОС). Например:
FROM ubuntu:18.04
или:
FROM alpine:3.8
ubuntu или alpine - это совсем "голые" образы с одной лишь операционной системой. Часто целесообразно использовать образы, с предустановленным ПО. Например:
FROM python:3.7.2-alpine3.8
- здесь используется образ, на котором поверх ОС Alpine установили еще и Python (github.com/docker-library/python/blob/ab8b8..)
FROM adoptopenjdk/openjdk11:jdk-11.0.5_10-alpine
- а здесь - базовый образ на основе Alpine с уже установленным JDK
Строка 2
ADD target/dock-0.0.1-SNAPSHOT.jar dock.jar
Эта строка копирует jar-ку в рабочую директорию Docker.
Строка 3
ENTRYPOINT ["java","-jar","/dock.jar"]
Эта строка запуска приложения.
На заметку: после сборки проекта Maven-ом мы можем перейти в папку target и запустить его простой командой: java -jar someproject-0.0.1-SNAPSHOT.jar
В данному случае мы учим Docker тому же самому.
СПРАВКА ПО ДИРЕКТИВАМ DOCKER-ФАЙЛА
FROM — задаёт базовый (родительский) образ.
LABEL — описывает метаданные. Например — сведения о том, кто создал и поддерживает образ.
ENV — устанавливает постоянные переменные среды.
RUN — выполняет команду и создаёт слой образа. Используется для установки в контейнер пакетов.
COPY — копирует в контейнер файлы и папки.
ADD — копирует файлы и папки в контейнер, может распаковывать локальные .tar-файлы.
CMD — Описывает команду с аргументами, которую нужно выполнить когда контейнер будет запущен. Аргументы могут быть переопределены при запуске контейнера. В файле может присутствовать лишь одна инструкция CMD.
WORKDIR — задаёт рабочую директорию для следующей инструкции.
ARG — задаёт переменные для передачи Docker во время сборки образа.
ENTRYPOINT — предоставляет команду с аргументами для вызова во время выполнения контейнера. Аргументы не переопределяются.
EXPOSE — указывает на необходимость открыть порт.
VOLUME — создаёт точку монтирования для работы с постоянным хранилищем.