Контейнеры и микросервисы вместе стали де-факто в современной архитектуре. Эта статья поможет новичкам создавать образы, запускать контейнеры и выполнять докеризацию своих приложений.

Предпосылки:

Докер

JDK 1.8 или выше

Грэдл

Майскл

Здесь — это ссылка на образец студенческого приложения Spring Boot, которое используется в этой статье.

Создайте схему базы данных и необходимую таблицу, выполнив следующий SQL-запрос

-- Schema creation
CREATE DATABASE `practice`;

-- Table creation
CREATE TABLE student (
  id int(11) NOT NULL AUTO_INCREMENT,
  grade int(11) DEFAULT NULL,
  name varchar(255) DEFAULT NULL,
  place varchar(255) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Давайте запустим и протестируем приложение перед его докеризацией.

./gradlew clean build --refresh-dependenices -x test

Это очистит и добавит необходимые зависимости в путь к классам, упомянутый в файле build.gradle. Как только приведенная выше команда будет выполнена, мы увидим, что jar приложения создается из-за задачи gradle. Баночка будет находиться в /build/libs . Запустите банку через

java -jar <applicationName>.jar

Здесь команда будет следующей

java -jar student-0.1.jar

Вы можете видеть, что приложение весенней загрузки запущено на порту 8080.

2022-12-25 21:16:18.941  INFO 19264 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2022-12-25 21:16:18.957  INFO 19264 --- [           main] com.demo.student.Application             : Started Application in 5.948 seconds (JVM running for 6.339)

Давайте нажмем и протестируем API CRUD с помощью приведенных ниже команд curl.

CREATE — создание учащегося с помощью POST-запроса.

 curl -s --request POST 'http://localhost:8080/students' --header 'Content-Type: application/json' --data-raw '{
    "name": "Abc",
    "place": "Xyz",
    "grade": 90}'

#Response:
Student created successfully with the id 1.

ПРОЧИТАТЬ — получить данные об учащихся.

curl --request GET 'http://localhost:8080/students' | json_pp

Приведенный выше запрос возвращает список всех студентов. json_pp используется для красивого вывода вывод JSON.

#Response:
[
   {
      "grade" : 90,
      "id" : 1,
      "name" : "Abc",
      "place" : "Xyz"
   }
]

Получить конкретного студента по идентификатору

curl -s --request GET 'http://localhost:8080/students/1' | json_pp

#Response:
{
   "grade" : 90,
   "id" : 1,
   "name" : "Abc",
   "place" : "Xyz"
}

ОБНОВЛЕНИЕ: обновление оценки конкретного учащегося.

curl -s --request PATCH 'http://localhost:8080/students/1' --header 'Content-Type: application/json' --data-raw  
'{"grade": 80}' | json_pp

#Response:
{
   "grade" : 80,
   "id" : 1,
   "name" : "Abc",
   "place" : "Xyz"
}

УДАЛИТЬ — удалить определенного учащегося по идентификатору.

curl -I -s --request DELETE 'http://localhost:8080/students/1'

#Response:
HTTP/1.1 204
Content-Type: text/plain;charset=UTF-8

-I был добавлен для печати кода ответа на выходе.

Теперь давайте докеризуем приложение.

Перед этим обновим URL источника данных с

url: 'jdbc:mysql://localhost:3306/practice'

to

url: 'jdbc:mysql://host.docker.internal:3306/practice'

Изменение URL-адреса связано с подключением док-контейнера к базе данных practice на вашем локальном сервере MySQL. Подробнее здесь

Теперь давайте пересоберем приложение с помощью следующей команды gradle ./gradlew clean build --refresh-dependenices -x test. Как было сказано ранее, это создаст банку приложения в следующем каталоге build/libs.

СОЗДАЙТЕ образ докера с помощью приведенной ниже команды

docker build -t krithick10/student .

Приведенная выше команда создает изображение и помечает имя изображения как krithick10/student.

Определения сборки образа загружаются из Dockerfile. Команда FROM извлечет базовый образ JDK 11 из репозитория док-станции eclipse-temurin. Команда ARG используется для объявления переменной. Здесь объявляется переменная JAR_FILE со значением по умолчанию. Значение JAR_FILE указывает банку inbuild/libs в результате выполнения вышеуказанной команды оценивания. Команда COPY копирует банку из build/libs в место назначения app.jar. Команда ENTRYPOINT — это место, где выполнение начинается при запуске контейнера.

Выполните следующую команду docker images и вы увидите, как создается образ

ЗАПУСТИТЬ образ как контейнер с помощью следующей команды

docker run -p 8080:8080 krithick10/student

Мы могли видеть, что контейнер начал работать в порту 8080.

2022-12-28 16:50:58.106  INFO 1 --- [           main] com.demo.student.Application             : Starting Application using Java 11.0.17 on ff81eb3ded1e with PID 1
...
2022-12-27 16:51:03.243  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2022-12-27 16:51:03.261  INFO 1 --- [           main] com.demo.student.Application             : Started Application in 6.063 seconds (JVM running for 6.679)

Выполните следующую команду docker container ls, чтобы проверить запущенные активные контейнеры.

Мы могли видеть, что контейнер запущен и работает в порту 8080. Приведенные выше curl команды можно повторить и выполнить.

Таким образом, мы успешно докеризовали весеннее загрузочное приложение и запустили его как докер-контейнер.

Исходный код GitHub | Образ DockerHub