Статьи

Автоматизация развертывания Docker с использованием Jib и Payara Micro

Если вы похожи на меня, вы проводите большую часть дня в разработке приложений. В течение этого времени трудно выделить время для управления контейнерами. Написание Dockerfile в наши дни почти стало частью нормального процесса разработки, но есть и другой путь. Я предпочел бы потратить как можно больше времени на разработку своих приложений и оставить конфигурацию Docker как минимальную процедуру развертывания, которая автоматически завершается для меня.

Я считаю, что люди в Google думали так же, когда они производили Jib . Проект Jib позволяет автоматизировать создание образа Docker, чтобы контейнер можно было просто запустить после сборки проекта. Нет необходимости создавать Dockerfile, так как Jib позаботится об этом за вас. Jib работает как с Maven, так и с Gradle, и в этом посте я покажу, как использовать его с Maven и развертывать в Payara Micro. По умолчанию Jib включает в себя дистрибутив Jetty, в который приложение будет развернуто внутри контейнера. Тем не менее, я знаком с Payara Micro и довольно наслаждаюсь средой Payara Micro, поэтому я буду обходить использование Jetty и развертываться в Payara Micro в этом примере.

Для начала важно ознакомиться с процессом Jib Maven, прочитав документацию .

В этом примере я использую микросервис SportsTeamQueryService, который я создал для статьи о журнале Java в 2018 году, но просто изменяю файл POM для включения сборки Jib. Я не буду вдаваться в подробности о Jib в этом посте, так как сама документация работает довольно хорошо. Скорее, я объясню, как мне удалось собрать и развернуть этот проект в Docker на моем Mac. Если вы используете другую ОС, вам, возможно, придется настроить сеть хост-контейнер, чтобы контейнер мог взаимодействовать с базой данных хоста.

Для начала POM-файл выглядит следующим образом, включая только те зависимости, которые необходимы для проекта. Я обращаю ваше внимание на раздел <plugins> для Jib-хуков:

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<?xml version="1.0" encoding="UTF-8"?>
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>org.javamagazine</groupId>
    <artifactId>SportsTeamQueryService</artifactId>
    <version>1.0</version>
    <packaging>war</packaging>
 
    <name>SportsTeamQueryService</name>
 
    <properties>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
     
    <dependencies>
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>javax.persistence-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.jpa</artifactId>
            <version>2.5.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.1</version>
            <scope>provided</scope>
        </dependency>
         
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.core</artifactId>
            <version>2.5.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.ejb</groupId>
            <artifactId>javax.ejb-api</artifactId>
            <version>3.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.asm</artifactId>
            <version>2.5.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.antlr</artifactId>
            <version>2.5.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.jpa.jpql</artifactId>
            <version>2.5.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>javax.persistence</artifactId>
            <version>2.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId>
            <version>2.5.2</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <compilerArguments>
                        <endorseddirs>${endorsed.dir}</endorseddirs>
                    </compilerArguments>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <!-- Docker JIB Dependency-->
            <plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <version>0.10.0</version>
                <configuration>
                    <from>
                        <image>
                            payara/micro:latest
                        </image>
                    </from>
                    <to>
                        <image>sportsteamqueryservice</image>
                    </to>
                    <container>
                        <appRoot>/opt/payara/SportsTeamQueryService</appRoot>
                        <args>
                            <arg>
                                --addlibs
                            </arg>
                            <arg>
                                /jars/derbyclient.jar
                            </arg>
                            <arg>
                                --deploy
                            </arg>
                            <arg>
                                /opt/payara/SportsTeamQueryService
                            </arg>
                        </args>
                        <environment>                           
                            <DOCKER_HOST>docker.for.mac.localhost</DOCKER_HOST>
                            <DB_NAME>ACME</DB_NAME>
                            <DB_USER>acmeuser</DB_USER>
                            <DB_PASSWORD>password</DB_PASSWORD>
                        </environment>
                    </container>
                </configuration>
            </plugin>
        </plugins>
    </build>
     
</project>

В POM я добавил рабочий процесс Jib в разделе <plugins>. В этом проекте я использовал последнюю зависимость Jib на момент написания, используя следующие координаты maven:

1
2
3
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>0.10.0</version>

Часть <configuration> плагина определяет пользовательскую конфигурацию для моего проекта. Если я оставлю раздел <configuration> вне объявления, тогда файл WAR, сгенерированный проектом, будет развернут в образ Docker, содержащий сервер Jetty. Файл WAR будет доступен в Jetty ROOT. Вместо этого, поскольку я заинтересован в использовании Payara Micro, я настроил объявление Jib следующим образом:

1) Наследовать от последнего размещенного образа Payara Micro, используя теги <from> <image>.

2) Затем теги <to> <image> объявляют имя получающегося изображения Docker.

3) Добавьте раздел <container>, чтобы указать подробности о контейнере.

а) Сначала я добавил тег <appRoot>, чтобы указать, что файл WAR будет загружен в папку «/ opt / payara /», в каталоге «SportsTeamQueryService».

б) Затем я добавил ряд аргументов, указав <args> <arg> </ arg> </ args>.

Первый аргумент добавляет файл Apache Derby Jar к развертыванию. Следует отметить, что в самом проекте есть папка «src / main / jib / jars».
Вы должны добавить файл derbyclient.jar внутри этой папки «jib / jars», чтобы он был скопирован в изображение. По умолчанию Jib добавляет в образ проекта все, что находится в папке «src / main / jib».

Второй аргумент указывает аргумент «–deploy» Payara Micro и указывает на каталог «/ opt / payara / SportsTeamQueryService»… который представляет собой развернутую WAR для проекта.

c) Наконец, добавьте раздел <environment>, чтобы указать все переменные среды, которые будут переданы в образ. В этом случае я добавил переменные среды, специфичные для базы данных. Если вы посмотрите на файл glassfish-resources.xml в рамках проекта, вы увидите, что эти переменные среды используются для настройки источника данных.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>
    <jdbc-connection-pool ..abbreviated for brevity...>
        <property name="serverName" value="${ENV=DOCKER_HOST}"/>
        <property name="portNumber" value="1527"/>
        <property name="databaseName" value="${ENV=DB_NAME}"/>
        <property name="User" value="${ENV=DB_USER}"/>
        <property name="Password" value="${ENV=DB_PASSWORD}"/>
        <property name="URL" value="jdbc:derby://${ENV=DOCKER_HOST}:1527/acme"/>
        <property name="driverClass" value="org.apache.derby.jdbc.ClientDriver"/>
    </jdbc-connection-pool>
    <jdbc-resource enabled="true" jndi-name="java:app/jdbc/acme" object-type="user" pool-name="derby_net_acme_acmeuserPool"/>
</resources>

Обратите внимание, что вам может потребоваться изменить переменную окружения servername, если вы не используете Docker для Mac.

Вот и все для настройки Jib! Теперь все, что требуется, — это просто построить проект и развернуть образ в локальном хранилище Docker. В этом случае я открываю терминал и перехожу в каталог проекта SportsTeamQueryService-Jib и выдаю следующую сборку Maven:

1
mvn clean install

После сборки проекта вызовите сборку Jib, выполнив следующее:

1
mvn compile jib:dockerBuild

Теперь образ Docker должен быть готов к запуску в локальной среде Docker. Чтобы запустить контейнер, выполните следующее:

1
docker run -d -p 8080:8080 sportsteamqueryservice

Контейнер должен быть в рабочем состоянии. Посетите URL http: // localhost: 8080 / SportsTeamQueryService / rest / teamrosterqueryservice / findAll, чтобы увидеть список игроков.

Чтобы восстановить образ Docker, просто введите команду:

1
mvn compile jib:dockerBuild

Источники проекта: https://github.com/juneau001/SportsTeamQueryService-Jib

Опубликовано на Java Code Geeks с разрешения Джоша Джуно, партнера нашей программы JCG . См. Оригинальную статью здесь: Автоматизация развертывания Docker с использованием Jib и Payara Micro

Мнения, высказанные участниками Java Code Geeks, являются их собственными.