Docker является популярной платформой для создания контейнеров — набора стандартизированных модулей программного обеспечения, которые собирают код, среду выполнения, зависимости, настройки и инициализацию в одном пакете, который можно надежно запускать из одной вычислительной среды в другую. Развертывание приложений в виде контейнеров Docker позволяет плавно перемещать приложения в нескольких средах (например, dev, QA, staging, production).
Из этого туториала Вы узнаете, как использовать Docker для развертывания приложения Spring Boot.
Что вам нужно:
- Java 8+: установить с помощью SDKMAN или напрямую из AdoptOpenJDK
- Docker: я рекомендую Docker Desktop
- Бесплатная учетная запись разработчика Okta : подробнее позже
Вы также можете быть заинтересованы в: Spring Boot: Run and Build в Docker
Создать приложение Spring Boot
Вы будете использовать Spring Initializr для создания своего проекта Spring Boot с помощью HTTPie , простого HTTP-клиента командной строки.
Вы можете использовать веб-сайт Spring Initializr напрямую, если не хотите использовать командную строку.
Из командной строки просто введите:
Джава
xxxxxxxxxx
1
http https://start.spring.io/starter.zip \
2
dependencies==web,okta \
3
groupId==com.okta.spring-docker.demo \
4
packageName==com.okta.spring-docker.demo \
5
--download
А затем распакуйте загруженный файл.
Джава
xxxxxxxxxx
1
unzip demo.zip -d spring-boot-docker
2
cd spring-boot-docker
Затем вы добавите веб-контроллер, создав файл src/main/java/com/okta/springdocker/demo/WebController.java:
Джава
xxxxxxxxxx
1
package com.okta.springdocker.demo;
2
import org.springframework.web.bind.annotation.RequestMapping;
4
import org.springframework.web.bind.annotation.ResponseBody;
5
import org.springframework.web.bind.annotation.RestController;
6
8
public class WebController {
9
("/")
11
public String home() {
12
return "Welcome!";
13
}
14
}
Вам также необходимо настроить параметры безопасности для этого проекта. На данный момент вы хотите разрешить все запросы, поэтому обновите ваш DemoApplication.javaфайл следующим образом:
Джава
xxxxxxxxxx
1
package com.okta.springdocker.demo;
2
import org.springframework.boot.SpringApplication;
4
import org.springframework.boot.autoconfigure.SpringBootApplication;
5
import org.springframework.context.annotation.Configuration;
6
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
7
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
8
10
public class DemoApplication {
11
public static void main(String[] args) {
13
SpringApplication.run(DemoApplication.class, args);
14
}
15
17
static class OktaOAuth2WebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
18
20
protected void configure(HttpSecurity http) throws Exception {
21
http.authorizeRequests().anyRequest().permitAll();
22
}
23
}
24
}
Вы можете скомпилировать и запустить ваше приложение с:
Джава
xxxxxxxxxx
1
./mvnw package
2
java -jar target/demo-0.0.1-SNAPSHOT.jar
Тогда, если вы нажмете http://localhost:8080, вы должны увидеть «Добро пожаловать!» сообщение.
Запустите приложение Spring Boot в качестве Docker-контейнера.
Чтобы запустить ваше приложение в качестве контейнера Docker, первым делом необходимо установить Docker .
После установки самое время собрать свой контейнер. Для этого Docker использует файл, который описывает, как собрать контейнер, который называется Dockerfile. DockerfileСостоит из шага за шагом инструкции для выполнения в контейнере.
Примечание. Обратитесь к справочнику Dockerfile для объяснения всех команд, которые вы можете использовать.
Для вашего приложения Spring Boot вы будете использовать простой Dockerfileфайл:
Примечание . Вы можете просматривать множество контейнеров сообщества, чтобы использовать их в качестве базы на DockerHub .
Теперь вы можете собрать контейнер в командной строке. Выполните следующие действия , замещая okta:spring_boot_dockerс тегом по своему вкусу, он будет служить в качестве имени для ссылки на контейнере вы строите:
Джава
xxxxxxxxxx
1
docker build . -t okta:spring_boot_docker
Если все прошло хорошо, вы можете запустить приложение Dockerized (используя тот же тег, что и раньше):
Джава
xxxxxxxxxx
1
docker run --publish=8080:8080 okta:spring_boot_docker
Чтобы остановить контейнер, нажмите CTRL-C . Убедитесь, что контейнер не запущен, выполните:
Джава
xxxxxxxxxx
1
docker ps
Это перечислит все контейнеры, работающие на вашем компьютере. Если ваше приложение Spring Boot все еще работает, вы можете завершить контейнер с помощью (используйте идентификатор контейнера, напечатанный с помощью docker ps):
Джава
xxxxxxxxxx
1
docker kill <CONTAINER_ID>
Поскольку ваш JAR-файл копируется в контейнер при его создании, вам нужно будет перестраивать свой контейнер каждый раз, когда вы захотите использовать более новую версию приложения. Таким образом, цикл будет:
- Измени свой код
- Создайте приложение
./mvnw package - Построить контейнер
docker build . -t okta:spring_boot_docker - Запустить контейнер
docker run --publish=8080:8080 okta:spring_boot_docker - Остановить контейнер
- петля
Теперь вы знаете основы использования контейнеров Docker для запуска вашего приложения! В будущем вы можете опубликовать свой встроенный контейнер в реестрах Docker (например, DockerHub), чтобы другие могли получить контейнер, и он будет готов к запуску.
Далее мы защитим приложение с помощью Okta и поймем, как мы можем передавать конфиденциальные данные в контейнер.
Защитите приложение Spring Boot and Docker
Вам понадобится бесплатный аккаунт разработчика в Okta . Okta - провайдер SaaS (программное обеспечение как услуга) для управления идентификацией. Мы упрощаем добавление в ваше приложение таких функций, как единый вход, социальный вход и OAuth 2.0. Зарегистрируйте аккаунт на нашем сайте, если вы этого еще не сделали.
Выполните следующие шаги, чтобы создать приложение OpenID Connect (OIDC).
- Войдите в свою учетную запись разработчика на developer.okta.com.
- Перейдите в Приложения и нажмите Добавить приложение
- Выберите Web и нажмите Next
- Дайте приложению имя (.eg,
Java Spring Boot Docker) - Добавьте в качестве URI перенаправления входа следующее: http: // localhost: 8080 / login / oauth2 / code / okta
- Нажмите Готово
Okta требует, чтобы некоторые свойства работали правильно, мы отправим их через Docker как переменные окружения.
Изменить DemoApplicationкласс, заменив .authorizeRequests().anyRequest().permitAll()на .authorizeRequests().anyRequest().authenticated(). Это скажет Spring, что все конечные точки вашего приложения будут требовать аутентифицированного пользователя.
Джава
xxxxxxxxxx
1
2
protected void configure(HttpSecurity http) throws Exception {
3
http.authorizeRequests().anyRequest().authenticated();
4
}
Давайте попробуем!
Сначала скомпилируйте и соберите свой контейнер. Чтобы процесс сборки работал правильно, вам нужно будет предоставить информацию о Okta как часть командной строки, заменив <org_url>, <client_id>и <client_secret>. Вы найдете эти значения в своей учетной записи Okta. org_urlОтображается в правом верхнем углу панели. Символы client_idи client_secretотображаются в настройках вашего приложения.
Джава
xxxxxxxxxx
1
./mvnw package
Затем создайте контейнер:
Джава
xxxxxxxxxx
1
docker build . -t okta:spring_boot_docker
Чтобы запустить контейнер сейчас, вы передадите свою информацию Okta контейнеру как переменные среды. Это делается с помощью параметра -eкомандной строки. Вот так:
Джава
xxxxxxxxxx
1
docker run --publish=8080:8080 \
2
-e OKTA_OAUTH2_ISSUER=<org_url>/oauth2/default \
3
-e OKTA_OAUTH2_CLIENT_ID=<client_id> \
4
-e OKTA_OAUTH2_CLIENT_SECRET=<client_secret> \
5
okta:spring_boot_docker
Теперь, если вы нажмете, http://localhost:8080вы увидите форму входа, и после предоставления вашего имени пользователя и пароля вы сможете снова увидеть страницу приветствия. Зависимость и пара свойств необходимы для защиты вашего приложения с помощью OIDC / OAuth 2.0!
Узнайте больше о Spring, Docker и безопасности!
Из этого руководства вы узнали, как создать Docker-контейнер для приложения Spring Boot, написав Dockerfile вручную. Есть также плагин Maven, который может подготовить контейнер для вас. Он называется Jib, и мы рассмотрим его более подробно на Get Jibby With Java, Docker и Spring Boot .
Исходный код этого поста доступен на GitHub .
Если у вас есть какие-либо вопросы по поводу этого поста, пожалуйста, добавьте комментарий.
Дальнейшее чтение
Развертывание микросервиса Spring Boot в Docker: краткое руководство