Статьи

Java EE, Docker и Maven (Технический совет № 89)

Приложения Java EE обычно создаются и упаковываются с использованием Maven. Например, github.com/javaee-samples/javaee7-docker-maven является тривиальным приложением Java EE 7 и показывает зависимость Java EE 7:

1
2
3
4
5
6
7
8
<dependencies>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

И два плагина Maven, которые компилируют исходный код и создают файл WAR:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <configuration>
        <source>1.7</source>
        <target>1.7</target>
    </configuration>
</plugin>
<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.3</version>
    <configuration>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </configuration>
</plugin>

Затем это приложение можно развернуть в контейнере Java EE 7, таком как WildFly , с помощью wildfly-maven-plugin :

1
2
3
4
5
<plugin>
    <groupId>org.wildfly.plugins</groupId>
    <artifactId>wildfly-maven-plugin</artifactId>
    <version>1.0.2.Final</version>
</plugin>

Тесты могут быть вызваны с использованием Arquillian, снова с использованием Maven. Поэтому, если вы хотите упаковать это приложение в образ Docker и запустить его в контейнере Docker, должен быть механизм для плавной интеграции в рабочий процесс Maven.

Docker Maven Плагин

Встречайте Docker-Maven-плагин !

Этот плагин позволяет вам управлять образами Docker и контейнерами из вашего pom.xml . Это идет с предопределенными целями:

Цель Описание
docker:start Создать и запустить контейнеры
docker:stop Останови и уничтожь контейнеры
docker:build Строить изображения
docker:push Push изображения в реестр
docker:remove Удалить изображения с локального хоста докера
docker:logs Показать журналы контейнеров

Введение представляет собой введение в плагин высокого уровня, включая создание образов, запуск контейнеров и конфигурацию.

Запустите приложение Java EE 7 как Docker-контейнер, используя Maven

TLDR;

  1. Создайте и настройте Docker Machine, как описано в разделе Docker Machine для настройки Docker Host.
  2. Клонировать рабочую область как: git clone https://github.com/javaee-samples/javaee7-docker-maven.git
  3. Создайте образ Docker как: mvn package -Pdocker
  4. Запустите контейнер Docker как: mvn install -Pdocker
  5. Узнайте IP-адрес Docker Machine как: docker-machine ip mydocker
  6. Доступ к вашему приложению
    1
    2
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?><collection><person><name>Penny</name></person><person><name>Leonard</name></person><person><name>Sheldon</name></person><person><name>Amy</name></person><person><name>Howard</name></person><person><name>Bernadette</name></person><person><name>Raj</name></person><person><name>Priya</name></person></collection>

Настройка подключаемого модуля Docker Maven

Давайте посмотрим немного глубже в нашем примере приложения.

pom.xml добавлен docker-maven-plugin :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<plugin>
    <groupId>org.jolokia</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.11.5-M1</version>
    <configuration>
        <images>
            <image>
                <alias>user</alias>
                <name>arungupta/javaee7-docker-maven</name>
                <build>
                    <from>arungupta/wildfly:8.2</from>
                    <assembly>
                        <descriptor>assembly.xml</descriptor>
                        <basedir>/</basedir>
                    </assembly>
                    <ports>
                        <port>8080</port>
                    </ports>
                </build>
                <run>
                    <ports>
                        <port>8080:8080</port>
                    </ports>
                </run>
            </image>
        </images>
    </configuration>
    <executions>
        <execution>
            <id>docker:build</id>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
        <execution>
            <id>docker:start</id>
            <phase>install</phase>
            <goals>
                <goal>start</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Каждая конфигурация изображения состоит из трех частей:

  • Название изображения и псевдоним
  • <build> который определяет, как создается изображение. Базовый образ, артефакты сборки и их зависимости, порты, которые будут выставлены, и т. Д., Которые будут включены в образ, указаны здесь. Формат дескриптора сборки используется для указания включаемых артефактов и определяется в каталоге src/main/docker . assembly.xml в нашем случае выглядит так:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    <assembly . . .>
      <id>javaee7-docker-maven</id>
      <dependencySets>
        <dependencySet>
          <includes>
            <include>org.javaee7.sample:javaee7-docker-maven</include>
          </includes>
          <outputDirectory>/opt/jboss/wildfly/standalone/deployments/</outputDirectory>
          <outputFileNameMapping>javaee7-docker-maven.war</outputFileNameMapping>
        </dependencySet>
      </dependencySets>
    </assembly>
  • <run> который определяет, как выполняется контейнер. Порты, которые должны быть выставлены, указаны здесь.

Кроме того, фаза package связана с docker:build цель docker:build и фаза install связана с docker:start цель docker:start .

Есть четыре Docker-Maven-плагин, и вы можете прочитать больше деталей в перестрелке о том, что служит вашим целям лучше всего.

Как вы создаете образы Docker из существующих приложений?

Наслаждайтесь!

Ссылка: Java EE, Docker и Maven (Tech Tip # 89) от нашего партнера по JCG Аруна Гупта в блоге Miles to go 2.0… .