1. Обзор
В этом руководстве мы рассмотрим Jib и то, как он упрощает контейнеризацию Java-приложений.
Мы возьмем простое приложение Spring Boot и создадим его образ Docker с помощью Jib. Затем мы также опубликуем образ в удаленном реестре.
И не забудьте также обратиться к нашему руководству по докеризации приложений Spring Boot с помощью dockerfile
и docker
tool .
2. Введение в джиб
Jib
— это инструмент Java с открытым исходным кодом, поддерживаемый Google для создания образов Docker для приложений Java. Это упрощает контейнеризацию, поскольку с ним нам не нужно писать файл докеров.
И на самом деле нам даже не нужно устанавливать Docker
, чтобы самим создавать и публиковать образы Docker.
Google публикует Jib как плагин Maven и Gradle. Это хорошо, потому что это означает, что Jib будет ловить любые изменения, которые мы вносим в наше приложение при каждой сборке. Это избавляет нас от отдельных команд docker build/push и упрощает добавление этого в конвейер CI.
Также есть несколько других инструментов, таких как плагины Spotify docker-maven-plugin и dockerfile-maven , хотя первый сейчас устарел, а для второго требуется dockerfile
.
3. Простое приветственное приложение
Давайте возьмем простое приложение с пружинной загрузкой и докеризуем его с помощью Jib. Он предоставит простую конечную точку GET:
http://localhost:8080/greeting
Что мы можем сделать довольно просто с контроллером Spring MVC:
@RestController
public class GreetingController {
private static final String template = "Hello Docker, %s!";
private final AtomicLong counter = new AtomicLong();
@GetMapping("/greeting")
public Greeting greeting(@RequestParam(value="name",
defaultValue="World") String name) {
return new Greeting(counter.incrementAndGet(),
String.format(template, name));
}
}
4. Подготовка развертывания
Нам также нужно будет настроить себя локально для аутентификации в репозитории Docker, в который мы хотим выполнить развертывание.
В этом примере мы предоставим наши учетные данные DockerHub в .m2/settings.xml
:
<servers>
<server>
<id>registry.hub.docker.com</id>
<username><DockerHub Username></username>
<password><DockerHub Password></password>
</server>
</servers>
Существуют и другие способы предоставления учетных данных. Google рекомендует использовать вспомогательные инструменты, которые могут хранить учетные данные в зашифрованном формате в файловой системе. В этом примере мы могли бы использовать docker-credential-helpers вместо хранения учетных данных в виде простого текста в settings.xml
, что намного безопаснее, хотя и не входит в рамки этого руководства.
5. Развертывание в Docker Hub с помощью Jib
Теперь мы можем использовать jib-maven-plugin
или эквивалент Gradle для контейнеризации нашего приложения с помощью простой команды : ** **
mvn compile com.google.cloud.tools:jib-maven-plugin:2.5.0:build -Dimage=$IMAGE_PATH
где IMAGE_PATH — целевой путь в реестре контейнеров.
Например, чтобы загрузить изображение foreachjib/spring-jib-app
в DockerHub
, мы должны сделать:
export IMAGE_PATH=registry.hub.docker.com/foreachjib/spring-jib-app
Вот и все! Это создаст Docker-образ нашего приложения и отправит его в DockerHub
.
Мы, конечно, можем аналогичным образом загрузить образ в Google Container Registry или Amazon Elastic Container Registry .
6. Упрощение команды Maven
Кроме того, мы можем сократить нашу начальную команду, вместо этого настроив плагин в нашем pom
, как и любой другой плагин maven.
<project>
...
<build>
<plugins>
...
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>2.5.0</version>
<configuration>
<to>
<image>${image.path}</image>
</to>
</configuration>
</plugin>
...
</plugins>
</build>
...
</project>
С этим изменением мы можем упростить нашу команду maven:
mvn compile jib:build
7. Настройка аспектов Docker
По умолчанию Jib делает ряд разумных предположений о том, что нам нужно , например, FROM и ENTRYPOINT.
Давайте внесем в наше приложение пару изменений, которые более точно соответствуют нашим потребностям.
Во-первых, Spring Boot по умолчанию предоставляет порт 8080.
Но, скажем, мы хотим, чтобы наше приложение работало на порту 8082 и сделало его доступным через контейнер.
Разумеется, мы внесем соответствующие изменения в Boot. И после этого мы можем использовать Jib, чтобы сделать его видимым на изображении:
<configuration>
...
<container>
<ports>
<port>8082</port>
</ports>
</container>
</configuration>
Или, скажем, нам нужен другой FROM. По умолчанию Jib использует образ java без дистрибутива .
Если мы хотим запустить наше приложение на другом базовом образе, например alpine-java , мы можем настроить его аналогичным образом:
<configuration>
...
<from>
<image>openjdk:alpine</image>
</from>
...
</configuration>
Таким же образом настраиваем теги, тома и несколько других директив Docker .
8. Настройка аспектов Java
И, по ассоциации, Jib также поддерживает множество конфигураций среды выполнения Java:
jvmFlags
предназначен для указания того, какие флаги запуска передавать JVM.mainClass
предназначен для указания основного класса, который Jib попытается вывести автоматически по умолчанию.args
— это место, где мы указываем аргументы программы, передаваемыеосновному
методу.
Конечно, обязательно ознакомьтесь с документацией Jib, чтобы увидеть все доступные свойства конфигурации .
9. Заключение
В этом руководстве мы увидели, как создавать и публиковать образы докеров с помощью Google Jib, в том числе как получить доступ к директивам докеров и конфигурациям среды выполнения Java через Maven.
Как всегда, исходный код этого примера доступен на Github .