Статьи

Сценарии развертывания Java EE для контейнеров Docker

контейнер Некоторое время я публиковал некоторый контент вокруг Docker, и мне вообще нравится играть с контейнерами. Вы можете найти дополнительную информацию о том, как запустить Docker-Machine в Windows, а также о том, как использовать клиент Docker 1.6 . Одной из первых публикаций в блоге была сборка всех видов ресурсов о Java EE, Docker и Maven для разработчиков Java EE . Работа более подробно и часто с контейнерами поднимает вопрос о том, как должны распространяться приложения Java EE и как разработчики должны использовать контейнеры. Это пытается уточнить немного и дать вам хороший обзор о различных вариантах.

Базовое изображение против пользовательского изображения и некоторые основы

Скорее всего, ваш сервер приложений доступен в публичном реестре, известном как Docker Hub . Это верно для WildFly. Первое решение, которое вы должны сделать, это то, хотите ли вы использовать одно из базовых изображений или собираетесь испечь свое собственное изображение. Бег с базой в значительной степени:

1
docker run -p 8080 -it jboss/wildfly

и ваш экземпляр будет запущен через секунду после загрузки базового образа. Но что это значит? И как это работает? В основе каждого контейнера лежит Linux. Подросток один. В обычном Linux ядро ​​сначала монтирует корневую файловую систему только для чтения, проверяет ее целостность, а затем переключает весь том rootfs в режим чтения-записи. Подростковый Linux в контейнере Docker делает это по-другому. Вместо того, чтобы переключать файловую систему в режим чтения-записи, она использует преимущество монтирования для добавления файловой системы чтения-записи поверх файловой системы только для чтения. На самом деле может быть несколько файловых систем, доступных только для чтения, расположенных друг над другом. Если вы посмотрите на изображение jboss / wildfly, это то, что вы видите на первый взгляд:

равнинно-wildfly0

Вы видите четыре разных уровня на этой картинке. Давайте не будем называть их слоем, потому что они еще не. Это иерархия изображений, которые являются основой для нашего изображения jboss / wildfly. Каждое из этих изображений состоит из Dockerfile . Это пустой текстовый файл с кучей инструкций. Вы можете думать об этом как о некоем pom-файле, который нужно обрабатывать с помощью инструмента « Builder ». Он может содержать различные команды и параметры для добавления пользователей, томов, добавления программного обеспечения, загрузок и многого другого. Если вы посмотрите на файл Docker jboss / wildfly, вы увидите команды, которые составляют изображение:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
# Use latest jboss/base-jdk:7 image as the base
FROM jboss/base-jdk:7
 
# Set the WILDFLY_VERSION env variable
ENV WILDFLY_VERSION 8.2.0.Final
 
# Add the WildFly distribution to /opt, and make wildfly the owner of the extracted tar content
# Make sure the distribution is available from a well-known place
RUN cd $HOME && curl http://download.jboss.org/wildfly/$WILDFLY_VERSION/wildfly-$WILDFLY_VERSION.tar.gz | tar zx && mv $HOME/wildfly-$WILDFLY_VERSION $HOME/wildfly
 
# Set the JBOSS_HOME env variable
ENV JBOSS_HOME /opt/jboss/wildfly
 
# Expose the ports we're interested in
EXPOSE 8080
 
# Set the default command to run on boot
# This will boot WildFly in the standalone mode and bind to all interface
CMD ["/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0"]

Первая строка определяет базу, из которой получено изображение. Глядя на jboss / base-jdk: 7 Dockerfile показывает корень, который является jboss / base .

Теперь представьте, что каждая из этих строк что-то делает с файловой системой. Самый очевидный пример — загрузка. Это добавляет что-то к этому. Но вместо записи в уже смонтированный раздел, он складывается как новый слой. Глядя на все слои jboss / wildfly, мы суммируем до 19 уникальных слоев общим размером 951mb .

Используя базовый образ, вы можете ожидать, что под рукой будет конфигурация по умолчанию. И это отличное место для начала. Мы в JBoss стараемся сделать наши проекты (и продукты тоже!) Готовыми к использованию для максимально возможного количества вариантов использования, но не существует способа, чтобы одна конфигурация могла удовлетворить потребности каждого. Например, мы поставляем 4 варианта конфигурационного файла standalone.xml вместе с WildFly, поскольку существует очень много различных сценариев развертывания. Но этого все еще недостаточно. Мы должны быть в состоянии настроить его в любой момент. Изображение jboss / wildfly здесь не исключение.

Создание собственного изображения с

1
2
# Use latest jboss/wildfly as a base
FROM jboss/wildfly

ваш первый шаг в слове индивидуального изображения. Если вы хотите узнать, как это сделать, есть замечательный пост в блоге, который охватывает почти все детали .

Приложения Java EE — в Docker

Один из основных принципов Docker — «Воссоздать — не изменять». Поскольку контейнер является неизменяемой частью инфраструктуры, доступной только для чтения, с очень ограниченными возможностями, которые можно изменять во время выполнения, вас могут заинтересовать различные варианты развертывания приложения.

Dockerize It

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

1
RUN curl -L https://github.com/user/project/myapp.war?raw=true -o /opt/jboss/wildfly/standalone/deployments/myapp.war

Готово. Создайте, нажмите и запустите свой собственный образ. Если один экземпляр умирает, не волнуйтесь и запустите новый.

Недостатки:

  • Нет повторных развертываний. каждый
  • Без изменений
  • Новая версия, новая версия изображения
  • Не типичная модель операций на данный момент.
  • Возможно, понадобятся дополнительные инструменты (плагины для Maven / Jenkins)

Преимущества:

  • Докер Путь
  • Легко интегрировать в ваш проект .
  • Простота развертывания и настройки

Контейнеры как инфраструктура

Там нет реального термина для этого. В основном это означает, что вам все равно, как работает ваша инфраструктура. Это может быть так называемая старомодная операционная модель. Вам нужно будет иметь какой-то доступ к инфраструктуре. Либо общая файловая система с хостом для развертывания приложений через сканер развертывания, либо порты управления должны быть открыты, чтобы использовать CLI или другой инструмент для развертывания ваших приложений в контейнере.

Недостатки:

  • Более сложное наслоение для сохранения состояния в контейнерах
  • Не путь докера
  • Не модно.
  • Централизованное управление и администрация

Преимущества:

  • Вряд ли есть какие-либо изменения в том, что вы привыкли как разработчик на предприятиях сегодня
  • Не нужно вообще интегрироваться в вашу сборку. Это просто экземпляр где-то работает
  • Никаких дополнительных инструментов.

Рекомендация

Это трудно. Я бы посоветовал вам посмотреть, что лучше всего подходит для вашей ситуации. Большинство корпоративных компаний склонны придерживаться решения «Контейнеры как инфраструктура». У этого есть много недостатков, чтобы смотреть на это с точки зрения разработчиков. Приличным промежуточным решением может быть OpenShift v3, которое оптимизирует операции для контейнеров и принесет много удобства и простоты в мир Java EE PaaS.

Если вы свободны в выборе, вы можете полностью пойти по пути «Dockerize». Имейте в виду, что на сегодняшний день это привязка к поставщику, и на горизонте уже есть несколько более перспективных и открытых решений .