Докеризация Java-приложений с использованием Jib

В этом уроке мы рассмотрим Jib и то, как она упрощает контейнеризацию Java-приложений.

Мы возьмем простое приложение Spring Boot и создадим его образ Docker с помощью Jib. И затем мы также опубликуем изображение в удаленном реестре.

И не забудьте также обратиться к нашему руководству по докеризации Spring Загрузка приложений с использованием инструментов dockerfile и d _ocker _ .

Jib - это инструмент Java с открытым исходным кодом, поддерживаемый Google для создания образов Docker приложений Java. Это упрощает контейнеризацию, так как с ней нам не нужно писать dockerfile .

И на самом деле нам даже не нужно устанавливать docker , чтобы самим создавать и публиковать образы докеров.

Google публикует Jib как плагин Maven и Gradle. Это хорошо, потому что это означает, что Jib будет отслеживать любые изменения, которые мы вносим в наше приложение каждый раз, когда мы создаем. Это избавляет нас от отдельных команд сборки/отправки Docker и упрощает добавление этого в конвейер CI.

Есть также несколько других инструментов, таких как docker-maven-plugin от Spotify и https://github.com/spotify/dockerfile-maven . плагины[dockerfile-maven], хотя первый сейчас устарел, а второй требует dockerfile .

Давайте возьмем простое приложение с весенней загрузкой и добавим его в док с помощью 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));
    }
}

Нам также необходимо настроить себя локально для аутентификации в репозитории 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 , что значительно безопаснее, хотя и просто выходит за рамки этого урока.

Теперь мы можем использовать jib-maven-plugin или Gradle эквивалента , для контейнеризации нашего приложения с помощью простой команды :

mvn compile com.google.cloud.tools:jib-maven-plugin:0.9.10:build -Dimage=$IMAGE__PATH

где IMAGE__PATH - целевой путь в реестре контейнера.

Например, чтобы загрузить изображение baeldungjib/spring-jib-app в DockerHub , мы должны сделать:

export IMAGE__PATH=registry.hub.docker.com/baeldungjib/spring-jib-app

И это все! Это создаст образ докера нашего приложения и отправит его в DockerHub .

ссылка:/uploads/JibDocker-1-1024x640-100x63.jpg%20100w[]

6. Упрощение команды Maven

Кроме того, мы можем сократить нашу начальную команду, настроив вместо этого плагин в нашем pom , как и любой другой плагин maven.

<project>
    ...
    <build>
        <plugins>
            ...
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <version>0.9.10</version>
                <configuration>
                    <to>
                        <image>${image.path}</image>
                    </to>
                </configuration>
            </plugin>
            ...
        </plugins>
    </build>
    ...
</project>

С этим изменением мы можем упростить нашу команду maven:

mvn compile jib:build

По умолчанию Jib делает ряд разумных предположений о том, что мы хотим , например, ОТ и ВХОДНАЯ ТОЧКА.

Давайте внесем пару изменений в наше приложение, которые более соответствуют нашим потребностям.

Во-первых, Spring Boot предоставляет порт 8080 по умолчанию.

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

Конечно, мы внесем соответствующие изменения в Boot. И после этого мы можем использовать Jib, чтобы сделать его видимым на изображении:

<configuration>
    ...
    <container>
        <ports>
            <port>8082</port>
        </ports>
    </container>
</configuration>

Или, допустим, нам нужен другой ОТ. По умолчанию Jib использует distro-less java image .

Если мы хотим запустить наше приложение в другом базовом образе, например alpine-java , мы можем настроить его аналогичным образом:

<configuration>
    ...
    <from>
        <image>openjdk:alpine</image>
    </from>
    ...
</configuration>

Мы настраиваем теги, тома и several другие директивы Docker таким же образом.

8. Настройка аспектов Java

Кроме того, Jib также поддерживает множество конфигураций среды выполнения Java:

  • __jvmFlags __is для указания того, какие флаги запуска нужно передать JVM.

  • __mainClass __is для указания основного класса, который ** Jib будет

попытаться сделать вывод автоматически по умолчанию. args - это место, где мы указываем аргументы программы, передаваемые

__main __method.

Конечно, обязательно ознакомьтесь с документацией Jib, чтобы увидеть все доступные configuration .

В этом руководстве мы увидели, как создавать и публиковать образы докеров с помощью Google Jib, в том числе как обращаться к директивам докеров и настройкам среды выполнения Java через Maven.

Как всегда, исходный код для этого примера доступен over на Github .