Несмотря на большое разнообразие уже настроенных шаблонов Docker, доступных в Registry Hub, разработчики часто сталкиваются с необходимостью выполнять дополнительные настройки после развертывания настроек контейнера в соответствии со своими конкретными задачами и потребностями. Наиболее очевидным решением для избавления от таких повторяющихся постконфигураций является подготовка выделенного образа Docker. Однако это представляет собой довольно сложную задачу и требует определенных специальных знаний.
Сегодня мы покажем, как этот процесс может быть значительно упрощен путем создания вашего собственного изображения на основе уже существующего. Таким образом, вы сможете пропустить все шаги, которые уже выполнены в этом «родительском» шаблоне, и добавить только необходимые корректировки.
Наиболее распространенный способ построения образов Docker — это создание Dockerfile — специального манифеста, который позволяет добиться дополнительной автоматизации путем перечисления желаемых команд в простой текстовый файл, который будет считываться и выполняться демоном Docker. Таким образом, новый шаблон будет создан автоматически на основе входящих в него инструкций (в противном случае вам придется вызывать каждую необходимую операцию вручную, одну за другой).
Ниже мы рассмотрим процедуру создания такого файла на примере подготовки собственного изображения WildFly 9 — гибкого и легкого сервера приложений Java, который является прямым преемником популярного сервера JBoss. Мы построим его на основе базового шаблона Jelastic CentOS 7 и раскроем все особенности его работы на нашей платформе, так что в результате вы получите готовую к работе док-версию этого сервера прямо внутри Облако.
Составление Dockerfile
Для начала создайте пустой текстовый файл — мы объявим все соответствующие операции непосредственно в нем — и перейдем к следующим инструкциям.
Примечание. Этот раздел носит ознакомительный характер и включает только необходимую основу для подготовки вашего файла Dockerfile. Однако, если вы хотите углубиться в специфику процесса и получить более подробное руководство, вы можете изучить официальные ссылки на докер-файлы .
Кроме того, вы можете заранее загрузить уже подготовленный файл dockerfile (с нашим примером изображения WildFly) и просто просмотреть этот раздел для объяснения выполненных действий, пропуская ручное создание файла.
1. На начальном этапе указывается базовый шаблон, который будет использоваться для построения нашего изображения. Для этой инструкции мы выберем самый последний шаблон jelasticdocker / jelastic-centos7-base с уже настроенной операционной системой CentOS 7 внутри. Чтобы установить это в dockerfile, нужно использовать команду FROM :
FROM jelasticdocker/jelastic-centos7-base:latest
2. Затем вы можете указать общую информацию об изображении (например, об авторе и других внутренних переменных), которая потребуется во время дальнейших настроек. Используйте пример ниже, чтобы установить необходимые значения:
MAINTAINER Jelastic,Inc
ENV WILDFLY_VERSION 9.0.1.Final
ENV ADMIN_USER jelastic
ENV ADMIN_PASSWORD jelastic
где:
- MAINTAINER — позволяет указать автора образа Docker, который будет сгенерирован из этого файла (здесь можно указать любое предпочтительное значение)
- ENV —устанавливает основные переменные среды, а именно:
- WILDFLY_VERSION — версия WildFly для сборки; может быть изменено на другое , при необходимости освобождения (доступная в настоящее время версия перечислена здесь )
- ADMIN_USER — произвольное имя администратора для последующего доступа к админ-панели WildFly
- ADMIN_PASSWORD — желаемый пароль для указанного пользователя
3. Теперь вы можете начать объявлять необходимые конфигурации с помощью команд оболочки — для этого следует использовать оператор RUN .
Прежде всего, необходимо установить Java Development Kit ( OpenJDK на 8 — й версии в нашем случае) и гудрона архиватора (который будет использоваться для распаковки загруженных файлов):
RUN yum -y install java-1.8.0-openjdk-devel tar && yum -y update;
Эта команда заканчивается вызовом общего обновления установленных пакетов.
4. Далее, давайте объявим несколько дополнительных операций по загрузке исходного кода WildFly с официального сайта и его извлечению в папку / opt .
RUN cd /opt && curl -O https://download.jboss.org/wildfly/$WILDFLY_VERSION/wildfly-$WILDFLY_VERSION.tar.gz \
&& $(which tar) xf wildfly-$WILDFLY_VERSION.tar.gz \
&& rm wildfly-$WILDFLY_VERSION.tar.gz
5. На этом этапе вам нужно создать символическую ссылку, чтобы сократить путь к главному каталогу WildFly и, как следствие, сделать его легко доступным:
RUN ln -s /opt/wildfly-$WILDFLY_VERSION /opt/wildfly
6. Давайте приступим к созданию основного файла конфигурации для нашего сервера WildFly и добавим в него все необходимые параметры:
RUN echo -en "JAVA_HOME=\"/usr/lib/jvm/java\""'\n'\
"JBOSS_HOME=\"/opt/wildfly\""'\n'\
"JBOSS_USER=wildfly"'\n'\
"JBOSS_MODE=standalone"'\n'\
"JBOSS_CONFIG=standalone.xml"'\n'\
"STARTUP_WAIT=60"'\n'\
"SHUTDOWN_WAIT=60"'\n'\
"JBOSS_CONSOLE_LOG=\"/var/log/wildfly/console.log\""'\n'\
"JBOSS_OPTS=\"-b 0.0.0.0 -bmanagement=0.0.0.0\"" >> /etc/default/wildfly.conf
7. CentOS 7 запускается с использованием сценария инициализации Systemd по умолчанию, но для сервера WildFly требуется более традиционный сценарий инициализации SystemV , поэтому вам необходимо скопировать initscript по умолчанию в папку /etc/init.d и отредактировать соответствующие конфиги, чтобы избежать Переадресация systemd:
RUN cp /opt/wildfly/bin/init.d/wildfly-init-redhat.sh /etc/init.d/wildfly; sed -i "/# Source function library/a\SYSTEMCTL_SKIP_REDIRECT=1" /etc/init.d/wildfly
8. Далее мы установим WildFly для запуска при запуске контейнера, добавив соответствующего системного пользователя и изменив для него владельца файлов:
RUN chkconfig --add wildfly; chkconfig wildfly on; mkdir -p /var/log/wildfly; adduser wildfly; chown -R wildfly:wildfly /opt/wildfly-$WILDFLY_VERSION; chown wildfly:wildfly /opt/wildfly; chown wildfly:wildfly /var/log/wildfly
9. Кроме того, давайте добавим учетные данные пользователя, которые мы определили в 1-м шаге инструкции для доступа к панели администратора сервера:
RUN /opt/wildfly/bin/add-user.sh --user $ADMIN_USER --password $ADMIN_PASSWORD --silent --enable
10. Теперь мы можем исправить ссылку на саму панель администратора на странице index.html по умолчанию , определив соответствующий редирект (как в случае, если наш образ будет развернут в контейнер без внешнего IP — адреса , 4949-го порта и HTTP-соединения). следует использовать здесь):
RUN sed -i "s/<a href=\"\/console\">/<a href=\"\/console\" onclick=\"javascript:event.target.port=4949;event.target.protocol=\'http:\';\">/" /opt/wildfly/welcome-content/index.html
11. Кроме того, правила iptables по умолчанию необходимо изменить на правила с соответствующими разрешениями и ограничениями, объявленными для обеспечения доступности WildFly для внешних запросов.
Известно, что для обработки запросов используются следующие порты:
- 8080 — для HTTP-запросов
- 8743 — для запросов HTTPS
- 8009 — для запросов AJP
- 9990 — для HTTP-доступа к админ-панели
- 9993 — для HTTP-доступа к панели администратора
И для того, чтобы изображение работало правильно, необходимо установить следующие перенаправления:
- От 80 до 8080 — для HTTP-запросов
- От 443 до 8743 — для запросов HTTPS
- От 4848 до 9993 — для HTTPS-доступа к панели администратора
- С 4949 по 9990 — для HTTP-доступа к панели администратора
Итак, давайте заменим содержимое существующего файла / etc / sysconfig / iptables следующим:
RUN rm -f /etc/sysconfig/iptables && touch /etc/sysconfig/iptables && chmod 600 /etc/sysconfig/iptables;
RUN echo -en "*mangle"'\n'\
":PREROUTING ACCEPT [3:204]"'\n'\
":INPUT ACCEPT [3:204]"'\n'\
":FORWARD ACCEPT [0:0]"'\n'\
":OUTPUT ACCEPT [3:260]"'\n'\
":POSTROUTING ACCEPT [3:260]"'\n'\
"COMMIT"'\n'\
"*nat"'\n'\
":PREROUTING ACCEPT [0:0]"'\n'\
":POSTROUTING ACCEPT [0:0]"'\n'\
":OUTPUT ACCEPT [0:0]"'\n'\
"-A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080"'\n'\
"-A PREROUTING -p tcp -m tcp --dport 4949 -j REDIRECT --to-ports 9990"'\n'\
"-A PREROUTING -p tcp -m tcp --dport 4848 -j REDIRECT --to-ports 9993"'\n'\
"-A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 8443"'\n'\
"COMMIT"'\n'\
"*filter"'\n'\
":INPUT ACCEPT [0:0]"'\n'\
":FORWARD ACCEPT [0:0]"'\n'\
":OUTPUT ACCEPT [0:0]"'\n'\
"-A INPUT -p tcp -m tcp --dport 9993 -j ACCEPT"'\n'\
"-A INPUT -p tcp -m tcp --dport 9990 -j ACCEPT"'\n'\
"-A INPUT -p tcp -m tcp --dport 8443 -j ACCEPT"'\n'\
"-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT"'\n'\
"-A INPUT -p tcp -m tcp --dport 8009 -j ACCEPT"'\n'\
"-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT"'\n'\
"-A INPUT -p icmp -j ACCEPT"'\n'\
"-A INPUT -i lo -j ACCEPT"'\n'\
"-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT"'\n'\
"-A INPUT -j REJECT --reject-with icmp-host-prohibited"'\n'\
"-A FORWARD -j REJECT --reject-with icmp-host-prohibited"'\n'\
"COMMIT" >> /etc/sysconfig/iptables;
12. Еще одно обязательное действие — настроить наш образ Docker для прослушивания необходимых портов во время выполнения. Команда EXPOSE предназначена для этого:
EXPOSE 80 443 8080 8743 9990 9993 8009 4848 4949
13. Наконец, вам нужно установить ENTRYPOINT для определения контейнера, который будет запускаться как исполняемый. В нашем случае оболочка bash должна быть указана:
ENTRYPOINT ["/bin/bash"]
Это все! Только не забудьте сохранить все заявленные настройки, чтобы получить готовый файл Docker.
Добавление изображения в репозиторий
После того, как правильный файл Docker подготовлен, вы готовы построить свой образ WildFly на его основе и затем отправить его в хранилище.
Примечание: Перед начала, убедитесь , что вы имеете соответствующую версию двигателя Docker ( в соответствии с используемым типом ОС) , установленной для выполнения описанных ниже команд в настоящее время используется машина.
Итак, выполните следующие шаги для достижения этой цели:
1. Запустите команду сборки docker с необходимыми параметрами, чтобы создать новый образ локально:
сборка sudo docker -t {image_name} {dockerfile_location}
где
- {image_name} — наименование репозитория изображений; опционально, тег версии может быть добавлен послеразделителя« :» (например, jelastic / wildfly: latest )
- {dockerfile_location} — либо локальный путь, либо URL-адрес вашего файла dockerfile (может быть установлен как « . », если файл находится в текущем каталоге)
2. Вы должны получить сообщение об успешной сборке вместе с идентификатором вашего нового изображения. Чтобы убедиться, что он доступен на вашей рабочей станции, вы можете запросить вывод списка всех локальных шаблонов с помощью:
изображения доко sudo
3. Наконец, вам нужно отправить (загрузить) ваше изображение в реестр с помощью соответствующей команды:
sudo docker push {image_name}
Здесь {image_name} должно быть указано так же, как вы указали при создании изображения на 1-м шаге.
Вам будет дополнительно предложено подтвердить владение вашей учетной записью (указав соответствующее имя пользователя, пароль и адрес электронной почты), чтобы выполнить эту операцию.
Совет: Вы можете заранее войти в реестр, используя соответствующую команду входа в систему docker (в результате ваши учетные данные будут сохранены в файле ~ / .docker / config.json в домашнем каталоге вашего локального пользователя).
Развернуть изображение на Jelastic
Как только ваше изображение будет успешно сохранено в хранилище, оно станет доступным для использования через платформу Jelastic и может быть добавлено в среду через выделенную панель докеров, интегрированную в разделы панели инструментов Marketplace и мастера топологии .
Итак, нажмите кнопку « Создать среду» на верхней панели инструментов и перейдите на вкладку Docker в мастере открытой среды, нажав кнопку « Выбрать контейнер» .
1. Здесь вы можете использовать вкладку « Поиск » (для добавления изображения из любого общедоступного репозитория) или перейти в пользовательский раздел, где вы можете работать с изображениями любого типа (включая частные) и хранить ваши шаблоны для удобства их использования. доступны.
Мы рассмотрим последний, поэтому, находясь внутри, выберите необходимый слой среды слева ( в нашем случае App. Servers ) и нажмите кнопку Add New Image .
2. В открывшемся фрейме « Добавить новое изображение» введите свой идентификатор изображения в поле « Имя» , например:
{имя_хоста_реестра} (можно пропустить для официального реестра концентратора) / { учетная запись} / { имя_изображения}
Кроме того, в случае использования частного хранилища, должны быть указаны соответствующие имя пользователя и пароль .
Мы используем общедоступный репозиторий, расположенный в центральном концентраторе реестра, поэтому требуется только короткое имя репозитория. Нажмите Добавить, когда будете готовы.
3. После этого ваше изображение появится в списке. Отсюда его можно добавить в топологию одним щелчком мыши. Более того, этот шаблон будет запомнен и останется в списке здесь, чтобы его можно было легко найти во время последовательного выбора контейнера (пока вы не удалите его из пользовательского списка вручную).
Установите все остальные необходимые конфигурации самостоятельно (подробности о доступных опциях можно прочитать здесь ) и завершите создание среды.
4. После того как на панели инструментов появится ваша среда на основе Docker с соответствующим изображением внутри, к ней можно немедленно получить доступ, используя соответствующую кнопку « Открыть в браузере» .
Примечание. Если вы не поместили шаблон в слой среды App.Servers или Balancing , вам потребуется использовать кнопку с тем же именем рядом с конкретным контейнером, чтобы открыть его.
В результате вы увидите начальную страницу WildFly по умолчанию, что означает, что все настроено правильно, и ваш недавно созданный контейнер Docker полностью работоспособен.
Подобно описанному выше, вы можете создать любое другое предварительно настроенное изображение в соответствии с вашими целями и, следовательно, легко разместить его в облаке. Не верьте нам на слово — просто попробуйте простоту работы с изображениями Docker в Jelastic PaaS с помощью собственной пробной учетной записи совершенно бесплатно и получите все преимущества в полной мере!