Spring Boot + Docker: Hello World Example

ЦЕЛЬ

Создать простейшее Spring Boot приложение и развернуть его в Docker-е.

PREREQUISITES

У Вас должен быть установлен Docker.

Для проверки его наличия, можно выполнить в консоли:

docker --version

В случае отсутствия Docker его нужно установить (это остается за рамками инструкции).

STEP BY STEP INSTRUCTION

(1) Войти на Spring Initializr:

start.spring.io

(2) Создать проект с одной лишь зависимостью: web

spring-docker.jpg

(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:

docker-structure.jpg

со следующим содержимым:

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:

hello.jpg

Разбор инструкций в Dockerfile

Строка 1

FROM openjdk:11

Ключевое слово FROM сообщает Docker о том, какой использовать базовый образ (т.е. какую ОС). Например:

FROM ubuntu:18.04

или:

FROM alpine:3.8

ubuntu или alpine - это совсем "голые" образы с одной лишь операционной системой. Часто целесообразно использовать образы, с предустановленным ПО. Например:

FROM python:3.7.2-alpine3.8

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 — создаёт точку монтирования для работы с постоянным хранилищем.