5.3.7. Развертывание с помощью Docker

Данный раздел описывает развертывание приложения CUBA в Docker-контейнерах.

Мы возьмем проект Sales, мигрируем его на базу данных PostgreSQL, и соберем UberJAR для запуска в контейнере. В принципе, приложение, собранное в виде WAR-файла также можно использовать в контейнере с сервером Tomcat, но это требует несколько больше конфигурирования, поэтому для целей демонстрации мы ограничимся вариантом UberJAR.

Конфигурирование и сборка UberJAR

Клонируйте проект из https://github.com/cuba-platform/sample-sales-cuba7 и откройте его в CUBA Studio.

Сначала смените тип базы данных на PostgreSQL:

  1. Выберите CUBA > Main Data Store Settings… в главном меню.

  2. Выберите PostgreSQL в поле Database type и нажмите OK.

  3. Выберите CUBA > Generate Database Scripts в главном меню. Studio откроет диалог Database Scripts со сгенерированными скриптами. Нажмите Save and close.

  4. Выберите CUBA > Create Database в главном меню. Studio создаст базу данных sales на локальном сервере PostgreSQL.

Теперь сконфигурируйте задачу Gradle для сборки UberJAR.

  1. Выберите пункт CUBA > Deployment > Edit UberJAR Settings главного меню.

  2. Отметьте флажки Build Uber JAR и Single Uber JAR.

  3. Нажмите Generate рядом с полем Logback configuration file.

  4. Нажмите Configure рядом с полем Custom data store configuration.

  5. Проверьте, что URL в группе Database Properties начинаетсяс префикса jdbc:postgresql://. Установите хост postgres вместо localhost в первом текстовом поле URL. Это необходимо для работы с базой данных, работающей в отдельном контейнере, который описан ниже.

  6. Нажмите OK. Studio добавит задачу buildUberJar в файл build.gradle.

  7. Откройте сгенерированный файл etc/uber-jar-logback.xml или другой файл, используемый как конфигурация Logback, и убедитесь, что свойство logDir имеет следующее значение:

    <property name="logDir" value="${app.home}/logs"/>

    Кроме того, убедитесь что конфигурация Logback ограничивает уровень логгера org.eclipse.jetty как минимум до INFO. Если такого логгера в файле не задано, то добавьте его:

    <logger name="org.eclipse.jetty" level="INFO"/>

Запустите задачу сборки JAR-файла через главное меню: CUBADeploymentBuild UberJAR, или выполнив следующую команду в терминале:

./gradlew buildUberJar
Создание Docker-образа

Теперь создадим файл Dockerfile и соберем образ с нашим приложением.

  1. Создайте каталог docker-image в корне проекта.

  2. Скопируйте JAR-файл из build/distributions/uberJar в этот каталог.

  3. Создайте файл Dockerfile со следующими инструкциями:

    FROM openjdk:8
    
    COPY . /opt/sales
    
    CMD java -Dapp.home=/opt/sales-home -jar /opt/sales/app.jar

Системное свойство Java app.home задает домашний каталог приложения, в котором хранятся логи приложения и другие файлы, создаваемые приложением. После запуска контейнера мы сможем отобразить данный каталог на каталог хост-компьютера для доступа к логам и другим данным, в том числе файлам, загружаемым в FileStorage.

Теперь соберем образ:

  1. Откройте терминал в корневом каталоге проекта.

  2. Запустите команду сборки, передавая имя образа в опции -t, и каталог, в котором находится файл Dockerfile:

    docker build -t sales docker-image

Проверьте, что образ sales отображается при выполнении команды docker images.

Запуск контейнеров приложения и базы данных

Приложение готово к запуску в контейнере, но нам необходима база данных PostgreSQL, работающая также в контейнере. Для управления двумя контейнерами - одним с приложением и другим с базой данных, мы будем использовать Docker Compose.

Создайте в корне проекта файл docker-compose.yml со следующим содержимым:

version: '2'

services:
  postgres:
    image: postgres:12
    environment:
      - POSTGRES_DB=sales
      - POSTGRES_USER=cuba
      - POSTGRES_PASSWORD=cuba
    ports:
      - "5433:5432"
  web:
    depends_on:
      - postgres
    image: sales
    volumes:
      - /Users/me/sales-home:/opt/sales-home
    ports:
      - "8080:8080"

Обратите внимание на следующие части данного файла:

  • Секция volumes отображает путь /opt/sales-home внутри контейнера, являющийся домашним каталогом приложения, на путь /Users/me/sales-home хост-компьютера. Это означает, что логи приложения будут доступны в каталоге /Users/me/sales-home/logs хост-компьютера.

  • Внутренний порт контейнера 5432, на котором работает PostgreSQL, отображен на порт 5433 хост-компьютера для избежания конфликта с сервером PostgreSQL, работающим на хосте. Используя этот порт, вы можете обращаться к базе данных извне, например, чтобы сделать бэкап:

    pg_dump -Fc -h localhost -p 5433 -d sales -U cuba > /Users/me/sales.backup
  • Контейнер приложения выставляет порт 8080, так что UI приложения будет доступен по адресу http://localhost:8080/app на хост-компьютере.

Для запуска приложения и базы данных откройте терминал в каталоге, содержащем файл docker-compose.yml и запустите команду:

docker-compose up