Статьи

Распространяйте свои приложения с помощью Docker Images

С тех пор, как я начал этот блог, мне нужно было разработать несколько примеров приложений, чтобы продемонстрировать некоторые темы, которые я освещал. Обычно, какое-то приложение Java EE, которое необходимо развернуть в контейнере Java EE. Даже предоставляя инструкции по настройке среды, это может быть непросто для новичка. У некоторых из моих читателей нет контейнера Java EE, доступного на их локальной машине. В некоторых даже не установлен Java Development Kit. Если бы я мог предоставить всю среду, настроенную для вас, и вам нужно только как-то ее выполнить, разве это не здорово? Я так думаю! Вместо того, чтобы распространять только приложение, распространяйте также среду, необходимую для запуска приложения. Мы можем сделать это с помощью Docker .

работает-на-мой-машина-240x300

Пару недель назад я написал пост « Попасть в Докер» . Теперь в этом посте мы продолжим исследовать одну из самых интересных функций Docker : изображения Docker . Это ответ, чтобы предоставить моему читателю полную среду со всем готовым к работе.

Docker Image

Docker Image — это шаблон только для чтения, используемый для создания контейнеров Docker . Каждое изображение состоит из серии слоев, составляющих ваше окончательное изображение. Если вам нужно распространять что-то, используя Ubuntu и Apache, вы начинаете с базового образа Ubuntu и добавляете Apache сверху.

Создать файл образа Docker

Я собираюсь использовать одно из моих последних приложений, аукционный дом World of Warcraft , чтобы показать, как мы можем упаковать его в образ Docker и распространить среди других. Самый простой способ — создать Dockerfile . Это простой текстовый файл, содержащий набор инструкций, которые сообщают Docker, как создать наш образ. Инструкции, которые вы можете использовать, четко определены и просты. Проверьте страницу справки Dockerfile для списка возможных инструкций. Каждая инструкция добавляет новый слой к вашим изображениям Docker . Обычно Dockerfile называется Dockerfile . Поместите его в каталог по вашему выбору.

Базовое изображение

Каждый Dockerfile должен начинаться с инструкции FROM . Нам нужно начать откуда-то, так что это указывает на базовый образ, который мы собираемся использовать для построения нашей среды. Если вы создавали виртуальную машину, вам также нужно было начать откуда-то, и вы должны начать с выбора операционной системы, которую вы собираетесь использовать. С Dockerfile все по-другому. Давайте добавим следующее в Dockerfile :

1
FROM debian:latest

Наш базовый образ будет последней версией Debian, доступной здесь: Docker Hub Debian Repo .

Добавьте то, что вам нужно

Идея заключается в том, чтобы создать среду, которая извлекает код, создать и выполнить образец аукционного дома World of Warcraft . Вы можете понять, что вам нужно? JDK, конечно, для компиляции и запуска и Maven для выполнения сборки. Но этого недостаточно. Вам также нужен клиент командной строки Git для проверки кода. Для этой части вам нужно немного узнать о сценариях оболочки Unix.

Так как нам нужно установить JDK и Maven, нам нужно откуда-то загрузить их в наш образ. Вы можете использовать команду wget чтобы сделать это. Но wget недоступен в нашем базовом образе Debian, поэтому нам нужно сначала установить его. Для запуска команд оболочки мы используем инструкцию RUN в Dockerfile .

Установить wget:

1
RUN apt-get update && apt-get -y install wget git

Установите JDK:

1
2
3
4
5
6
RUN wget --no-check-certificate --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u40-b25/jdk-8u40-linux-x64.tar.gz && \
    mkdir /opt/jdk && \
    tar -zxf jdk-8u40-linux-x64.tar.gz -C /opt/jdk && \
    update-alternatives --install /usr/bin/java java /opt/jdk/jdk1.8.0_40/bin/java 100 && \
    update-alternatives --install /usr/bin/javac javac /opt/jdk/jdk1.8.0_40/bin/javac 100 && \
    rm -rf jdk-8u40-linux-x64.tar.gz

Установите Maven:

1
2
3
RUN wget http://mirrors.fe.up.pt/pub/apache/maven/maven-3/3.2.5/binaries/apache-maven-3.2.5-bin.tar.gz && \
    tar -zxf apache-maven-3.2.5-bin.tar.gz -C /opt/ && \
    rm -rf apache-maven-3.2.5-bin.tar.gz

Нам также нужно, чтобы Java и Maven были доступны из любой точки нашего изображения. Как и при настройке окружения, вы должны установить JAVA_HOME и добавить двоичный файл Maven в PATH . Вы можете сделать это с помощью инструкции Docker ENV .

1
2
3
ENV JAVA_HOME /opt/jdk/jdk1.8.0_40/
 
ENV PATH /opt/apache-maven-3.2.5/bin:$PATH

Добавить приложение

Теперь, когда у нас есть необходимая среда для аукционного дома World of Warcraft , нам просто нужно клонировать код и собрать его:

1
2
3
4
5
6
7
8
RUN cd opt && \
    git clone https://github.com/radcortez/wow-auctions.git wow-auctions
 
WORKDIR /opt/wow-auctions/
 
RUN mvn clean install && \
    cd batch && \
    mvn wildfly:start

Мы также хотим выставить порт, чтобы вы могли получить доступ к приложению. Вы должны использовать прослушивающий http порт сервера приложений. В данном случае это 8080. Вы можете сделать это в Docker с помощью инструкции EXPOSE :

Я должен был использовать небольшую хитрость здесь. Я не хочу загружать и устанавливать сервер приложений, поэтому я использую встроенную версию плагина Maven для Wildfly. Теперь, как я уже говорил, каждая инструкция Dockerfile добавляет новый слой к изображению. Здесь я заставляю запуск и остановку сервера только для Maven, чтобы загрузить необходимые зависимости и сделать их доступными в образе. Если бы я этого не делал, всякий раз, когда я хотел запустить образ, мне пришлось бы загружать все серверные зависимости, и запуск образа занимал бы значительно больше времени.

1
EXPOSE 8080

Запустите приложение

Последняя инструкция должна быть CMD для установки команды, которая будет выполняться при запуске образа:

1
CMD git pull && cd batch && mvn wildfly:run

В этом случае мы хотим убедиться, что мы используем самый последний код, поэтому мы делаем git pull и затем запускаем встроенный сервер Wildfly. Конфигурация развертывания уже настроена в плагине Wildfly Maven.

Полный Dockerfile

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
FROM debian:latest
MAINTAINER Roberto Cortez <[email protected]>
 
RUN apt-get update && apt-get -y install wget git
 
RUN wget --no-check-certificate --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u40-b25/jdk-8u40-linux-x64.tar.gz && \
    mkdir /opt/jdk && \
    tar -zxf jdk-8u40-linux-x64.tar.gz -C /opt/jdk && \
    update-alternatives --install /usr/bin/java java /opt/jdk/jdk1.8.0_40/bin/java 100 && \
    update-alternatives --install /usr/bin/javac javac /opt/jdk/jdk1.8.0_40/bin/javac 100 && \
    rm -rf jdk-8u40-linux-x64.tar.gz
 
ENV JAVA_HOME /opt/jdk/jdk1.8.0_40/
 
RUN wget http://mirrors.fe.up.pt/pub/apache/maven/maven-3/3.2.5/binaries/apache-maven-3.2.5-bin.tar.gz && \
    tar -zxf apache-maven-3.2.5-bin.tar.gz -C /opt/ && \
    rm -rf apache-maven-3.2.5-bin.tar.gz
 
ENV PATH /opt/apache-maven-3.2.5/bin:$PATH
 
RUN cd opt && \
    git clone https://github.com/radcortez/wow-auctions.git wow-auctions
 
WORKDIR /opt/wow-auctions/
 
RUN mvn clean install && \
    cd batch && \
    mvn wildfly:start
 
EXPOSE 8080
 
CMD git pull && cd batch && mvn wildfly:run

Создайте Dockerfile

Чтобы иметь возможность распространять свой образ, вам нужно создать свой Dockerfile . Что это собирается сделать, это прочитать каждую инструкцию, выполнить ее и добавить слой в ваши изображения Docker . Вам нужно сделать это только один раз, если вы не измените свой Dockerfile . Инструкция CMD не выполняется в сборке, поскольку она используется только тогда, когда вы фактически запускаете образ и выполняете контейнер.

Чтобы создать Dockerfile , я использую следующую команду в каталоге, содержащем ваш Dockerfile :

1
docker build -t radcortez/wow-auctions .

-t radcortez/wow-auctions должен пометить и назвать изображение, которое я создаю. Вам следует использовать формат user / name. Вы должны использовать то же имя пользователя, которое вы зарегистрировали в Docker Hub .

Нажав на изображение

Docker Hub — это хранилище Docker Image. Это та же концепция репозиториев Maven для библиотек Java. Загрузите или загрузите изображения, и все готово. Docker Hub уже содержит огромное количество готовых к использованию образов, от простых дистрибутивов Unix до полноценных серверов приложений.

Теперь мы можем выбрать изображение, которое мы создаем локально, и загрузить его в Docker Hub . Это позволит любому загружать и использовать это изображение. Мы можем сделать это так:

1
docker push radcortez/wow-auctions

В зависимости от размера изображения это может занять несколько минут.

Запустите изображение

Наконец, чтобы запустить образ и контейнер, мы выполняем:

1
docker run -it --name wow-auctions -p 8080:8080 radcortez/wow-auctions

Так как я сначала создал образ локально, он запустит CMD radcortez / wow-auction. Просто с помощью приведенной выше команды изображение будет загружено и выполнено в вашей среде.

Вывод

С помощью Docker можно распространять свои собственные приложения и иметь среду, необходимую для правильной работы приложения, созданного вами. Это не совсем тривиально, так как вам нужны некоторые знания Unix, но это не должно быть проблемой.

Моей основной мотивацией для использования Docker здесь было упрощение распространения моих примеров приложений. Нет ничего необычного в том, чтобы получать письма от читателей с просьбой помочь настроить их среду. Конечно, теперь вам нужно установить Docker , но это единственное, что вам нужно. Остальное, просто оставь это мне сейчас!

Ссылка: Распространяйте свои приложения с помощью Docker Images от нашего партнера по JCG Роберто Кортеса в блоге