5.3.7. Развертывание с помощью Docker
Данный раздел описывает развертывание приложения CUBA в Docker-контейнерах.
Мы возьмем проект, созданный в результате прохождения раздела Быстрый старт, мигрируем его на базу данных PostgreSQL, и соберем UberJAR для запуска в контейнере. В принципе, приложение, собранное в виде WAR-файла также можно использовать в контейнере с сервером Tomcat, но это требует несколько больше конфигурирования, поэтому для целей демонстрации мы ограничимся вариантом UberJAR.
- Конфигурирование и сборка UberJAR
-
Клонируйте проект из https://github.com/cuba-platform/sample-sales-cuba7 и откройте его в CUBA Studio.
Сначала смените тип базы данных на PostgreSQL:
-
Выберите CUBA > Main Data Store Settings… в главном меню.
-
Выберите PostgreSQL в поле Database type и нажмите OK.
-
Выберите CUBA > Generate Database Scripts в главном меню. Studio откроет диалог Database Scripts со сгенерированными скриптами. Нажмите Save and close.
-
Выберите CUBA > Create Database в главном меню. Studio создаст базу данных
sales
на локальном сервере PostgreSQL.
Теперь сконфигурируйте задачу Gradle для сборки UberJAR.
-
Выберите пункт CUBA > Deployment > UberJAR Settings главного меню.
-
Отметьте флажки Build Uber JAR и Single Uber JAR.
-
Нажмите Generate рядом с полем Logback configuration file.
-
Нажмите Generate рядом с полем Custom Jetty environment file. Проверьте, что выбран PostgreSQL и установите значение
postgresql
вместоlocalhost
в поле Database URL. Это необходимо для работы с базой данных, работающей в отдельном контейнере, который описан ниже. -
Нажмите OK. Studio добавит задачу buildUberJar в файл
build.gradle
. -
Для настройки расположения файлов логов, откройте сгенерированный файл
etc/uber-jar-logback.xml
и измените значение свойстваlogDir
следующим образом:<property name="logDir" value="${app.home}/logs"/>
Кроме того, убедитесь что конфигурация Logback ограничивает уровень логгера
org.eclipse.jetty
как минимум доINFO
. Если такого логгера в файле не задано, то добавьте его:<logger name="org.eclipse.jetty" level="INFO"/>
Запустите задачу сборки JAR-файла:
./gradlew buildUberJar
-
- Создание Docker-образа
-
Теперь создадим файл
Dockerfile
и соберем образ с нашим приложением.-
Создайте каталог
docker-image
в корне проекта. -
Скопируйте JAR-файл из
build/distributions/uberJar
в этот каталог. -
Создайте файл
Dockerfile
со следующими инструкциями:FROM openjdk:8 COPY . /opt/sales CMD java -Dapp.home=/opt/sales-home -jar /opt/sales/app.jar
Системное свойство Java
app.home
задает домашний каталог приложения, в котором хранятся логи приложения и другие файлы, создаваемые приложением. После запуска контейнера мы сможем отобразить данный каталог на каталог хост-компьютера для доступа к логам и другим данным, в том числе файлам, загружаемым в FileStorage.Теперь соберем образ:
-
Откройте терминал в корневом каталоге проекта.
-
Запустите команду сборки, передавая имя образа в опции
-t
, и каталог, в котором находится файлDockerfile
:docker build -t sales docker-image
Проверьте, что образ
sales
отображается при выполнении командыdocker images
. -
- Запуск контейнеров приложения и базы данных
-
Приложение готово к запуску в контейнере, но нам необходима база данных PostgreSQL, работающая также в контейнере. Для управления двумя контейнерами - одним с приложением и другим с базой данных, мы будем использовать Docker Compose.
Создайте в корне проекта файл
docker-compose.yml
со следующим содержимым:version: '2' services: postgres: image: postgres:9 environment: - POSTGRES_DB=sales - POSTGRES_USER=cuba - POSTGRES_PASSWORD=cuba ports: - "5433:5432" web: 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
-