Чтобы собрать и развернуть свое веб-приложение, необходимо организовать среду для разработки, включающую в себя создание репозитория, в котором будет храниться исходный код разрабатываемого приложения, настройку CI/CD-процессов (а также выбор CI/CD-платформу) для сборки и выкатки готового приложения на production-серверы. Также необходимо арендовать доменное имя и сервер.
Однако, существует способ, который поможет значительно упростить и ускорить развертывание вашего приложения. В данной статье мы рассмотрим процесс публикации нескольких приложений с применением Dockerfile при помощи сервиса Apps облачного провайдера Timeweb Cloud.
Самый простой способ развернуть приложение, которое использует систему контейнеризации Docker, — использовать готовые решения типа Platform as a Service (PaaS). PaaS — это услуга, при помощи которой пользователь получает уже готовую платформу, где можно публиковать различные приложения, написанные на разных языках программирования с использованием различных фреймворков, и управлять ими, не занимаясь подготовкой и обслуживанием инфраструктуры, включая серверы, балансировщики, сети и т.д. Это очень удобный подход, поскольку он позволяет сосредоточиться только на написании кода приложения, при этом не затрачивая время и ресурсы на настройку и поддержку серверного оборудования.
Одним из таких решений является сервис Timeweb Cloud Apps. В нём достаточно указать ссылку на репозиторий с исходным кодом программы и при необходимости указать переменные для запуска приложения. Дальнейшие шаги, включая сборку и публикацию вашего проекта, платформа сделает за вас.
Этапы, которые требуются выполнить со стороны пользователя, сводятся к следующим:
В качестве типа приложения выбрать Dockerfile;
Выбрать систему контроля версий. На выбор доступны три системы: GitHub, GitLab, Bitbucket. Также если ваша система контроля версий отсутствует в списке, то подключить репозиторий можно, введя URL. Поддерживаются как публичные так и частные репозитории с исходным кодом. При этом для последних необходимо ввести логин и пароль/токен от учетной записи;
Выбрать регион, в котором будет находиться сервер с запущенным приложением. На выбор доступно три региона: Россия (Санкт-Петербург), Польша и Нидерланды;
Выбрать конфигурацию для сервера, на котором будет развернуто приложение;
При необходимости указать переменные, например, для хранения чувствительных данных (логины, пароли, ключи, токены и т.д.);
При желании можно указать имя приложения, комментарий и выбрать проект.
Перед тем как начать использовать сервис Apps для разворачивания приложений при помощи Dockerfile, необходимо учесть следующие требования:
Dockerfile должен быть размещен в корневой папке проекта (репозитория) и содержать корректные команды для сборки и запуска вашего приложения;
В Dockerfile должен присутствовать параметр EXPOSE
, чтобы сервис мог быть доступен для Nginx. Если EXPOSE
отсутствует, то по умолчанию будет задействован порт 8080;
Сервис Apps не поддерживает docker-compose-файлы. Можно использовать только обычные Docker-файлы.
Чтобы воспользоваться услугой Apps в Timeweb Cloud, необходимо пройти регистрацию.
Переходим по ссылке для регистрации нового пользователя. Мы выберем регистрацию на физическое лицо и заполним следующие данные:
ФИО,
адрес электронной почты,
номер телефона.
После регистрации на указанный адрес почты придет сообщение с ссылкой для активации аккаунта и входа в панель — перейдите по ней.
В качестве теста мы развернем несколько приложений.
Первое приложение представляет из себя простейший сервис, написанный при помощи JavaScript-библиотеки React, который отображает веб-страницу с сообщением, что образ с React успешно собран и готов к дальнейшему использованию.
Второе приложение представляет собой сервис на языке программирования GO, которое выводит в браузере фразу “Hello, world!” и использует переменные окружения типа ARG
.
Третье приложение — это сервис, написанный при помощи Node.js, который приветствует пользователя. При этом имя пользователя будет задано в переменной на этапе конфигурации приложения в сервисе Apps.
Шаги, предоставленные ниже, являются универсальным решением для развертывания приложений через Dockerfile и подойдут для деплоя всех приложений в сервисе Apps, которые будут описаны далее в данной статье.
1) После того как регистрация в системе Timeweb cloud завершена, можно приступать к использованию сервиса Apps. Для этого войдите в свой аккаунт. Далее на панели слева выберите раздел «Apps»:
В открывшемся окне нажмите на кнопку «Создать».
2) Первым шагом выбираем тип нашего приложения. В нашем случае переходим в раздел Dockerfile:
3) Выбираем репозиторий, где хранится исходный код веб-приложения. Также можно подключить репозиторий по URL нажав на кнопку «Подключите git-репозиторий по URL»:
В нашем случае код проекта хранится в системе GitHub. При выборе GitHub система предложит предоставить доступ до всех репозиториев, которые присутствуют в вашей учетной записи или только к одному конкретному репозиторию. Прежде чем выбрать репозиторий, необходимо войти в ваш аккаунт на GitHub. Далее выбираем пункт «Only select repositories» и указываем необходимый репозиторий при помощи кнопки «Select repositories»:
Далее нажимаем на кнопку «Install & Authorize».
При необходимости пройдите двухфакторную аутентификацию одним из предложенных способов:
4) После того как аутентификация в сервисе GitHub была успешно пройдена, возвращаемся обратно в сервис Apps. На шаге с выбором репозитория была добавлена новая информация, включающая в себя выбранный репозиторий и ветку.
По умолчанию всегда выбирается ветка main
, однако вы можете выбрать любую другую ветку, которая присутствует в вашем репозитории. Для этого достаточно кликнуть по имени ветки и в выпадающем списке выбрать нужную:
Также можно настроить такой параметр, как «Сборка по последнему выполненному коммиту». Если данный параметр включен, то сборка приложения будет выполняться с последнего коммита, т.е. с момента последнего внесения изменений в ваше приложение. При добавлении нового коммита система автоматически будет запускать сборку вашего приложения. Если же выключить данную опцию, то можно выбрать любой другой доступный коммит:
5) Далее необходимо выбрать регион, в котором будет находиться сервер с приложением. Выбирать рекомендуется тот регион, который ближе всего находится к вам физически. У каждого доступного региона справа вверху отображается ping, т.е. время, необходимое для передачи данных с вашего компьютера на сервер. Чем меньше указанное время, тем быстрее будет осуществляться передача данных:
6) Выбираем необходимую конфигурацию для сервера.
Так как в данной статье упор делается только на демонстрации возможностей сервиса Apps без использования реальной нагрузки на демонстрируемые приложения, мы выберем минимальную конфигурацию, включающую в себя одноядерный процессор, 1 ГБ оперативной памяти и 15 ГБ жесткого диска.
В реальности вам необходимо выбирать ту конфигурацию, которая будет удовлетворять потребностям при развертывании вашего контейнеризированного приложения.
Выбираем соответствующий тариф:
7) При необходимости добавьте переменные окружения, если они используются в вашем Dockerfile. В переменных окружения обычно хранят чувствительные данные, такие как логины, пароли, ключи, токены и т.д:
Работа с переменными окружения будет продемонстрирована в следующем примере.
8) В последнем разделе «Информация о приложении» можно задать необходимое имя для приложения, которое будет отображаться в панели управления, а также выбрать проект:
9) Для запуска деплоя приложения необходимо нажать на кнопку «Запустить деплой»:
Если на вашем аккаунте недостаточно средств, то будет выведено предупреждение о необходимости пополнить баланс. После оплаты и запуска деплоя откроется Дашборд приложения, где можно отслеживать состояние деплоя, а также следить за логами приложения:
Первоначальная настройка может занять до 10 минут.
После того как деплой приложения будет полностью завершен, в разделе «Деплой» будет отображен соответствующий статус — «Успешно»:
При успешном деплое в логах будет отображена строка «Deployment successfully completed».
Также вы можете подключиться к оболочке контейнера (аналог команды docker exec
). Для этого перейдите в раздел «Консоль»:
10) Для того чтобы перейти в веб-интерфейс вашего приложения, необходимо открыть раздел «Дашборд». Справа снизу будет отображено доменное имя, при клике на которое оно будет скопировано:
Далее при переходе по доменному имени будет отображен интерфейс запущенного сервиса так, как его видят пользователи:
Стоит отметить, что сгенерированный домен это общедоступный домен, и любой пользователь может по нему перейти. При каждом переходе по доменному имени, в логах (раздел «Логи приложения») будет отображаться соответствующая строка:
Теперь рассмотрим деплой другого приложения с помощью Dockerfile — на этот раз с использованием переменных окружения. Как уже было упомянуто ранее, переменные окружения в основном используют для того, чтобы скрыть чувствительные данные, например, пароль от базы данных или ключ от API-сервиса.
Синтаксис Dockerfile поддерживает два типа переменных окружения — ARG
и ENV
.
ARG
— ключевое слово, используемое для создания переменных окружения, которые используются только во время сборки образа. В отличие от ENV
-переменных, ARG
-переменные недоступны во время запуска контейнера;ENV
— ключевое слово, используемое для создания переменных окружения, которые доступны ТОЛЬКО во время запуска контейнера.Рассмотрим использование переменных окружения на примере ARG
. Код, который используется далее, доступен по ссылке. Воспользуемся Dockerfile, в котором происходит сборка приложения на языке программирования GO:
ARG GOLANG_VERSION=1.21-bookworm
ARG DEBIAN_VERSION=bookworm-slim
FROM golang:$GOLANG_VERSION as builder
WORKDIR /app
COPY go.* ./
RUN go mod download
COPY . ./
RUN go build -v -o server
FROM debian:$DEBIAN_VERSION
RUN set -x && apt update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
ca-certificates && \
rm -rf /var/lib/apt/lists/*
COPY --from=builder /app/server /app/server
EXPOSE 8080
CMD ["/app/server"]
В самом начале Dockerfile объявлены две переменные: GOLANG_VERSION
и DEBIAN_VERSION
, в которых хранятся теги для используемых образов Golang и Debian. Для использования переменных типа ARG
в Dockerfile необходимо использовать символ доллара $
и указать имя переменной, например, $GOLANG_VERSION
или $DEBIAN_VERSION
.
Если собрать данный образ, то во время процесса сборки можно увидеть что переменные были успешно применены и были использованы образы с теми тегами, которые были указаны в Dockerfile:
docker build -t arg_go_app .
Запустим данный образ при помощи команды:
docker run -dit -p 80:80 arg_go_app
Проверяем статус запущенного контейнера:
docker ps
Контейнер успешно запущен. Так как у контейнера открыт порт 80 и он проброшен, то мы можем открыть страницу в браузере, используя IP-адрес сервера:
На странице отобразилась фраза «Hello, world!», которая сообщает о том, что приложение было успешно собрано и запущено.
Теперь запустим приложение содержащее в себе переменную типа ARG
в сервисе Apps.
Для этого выполняем все шаги, которые были описаны в предыдущей главе.
После того как деплой приложения будет полностью завершен, в разделе «Деплой» будет отображен соответствующий статус — «Успешно»:
Также при успешном деплое в логах будет отображена строка «Deployment successfully completed».
Для того чтобы перейти в веб-интерфейс приложения, необходимо открыть раздел «Дашборд» и скопировать доменное имя:
Далее при переходе по доменному имени будет отображен интерфейс запущенного сервиса так, как его видят пользователи:
Приложение, использующее при сборке переменные типа ARG
, успешно задеплоено.
Выше мы рассмотрели пример с использованием переменных, которые указываются непосредственно в Dockerfile при помощи ключевого слова ARG
. Однако переменные окружения могут присутствовать и в коде разрабатываемого приложения. С помощью сервиса Apps можно объявить такие переменные на этапе подготовки приложения к деплою. Тем самым в коде приложения не надо указывать чувствительные данные. В качестве примера воспользуемся сервисом, написанным на Node.js, который приветствует пользователя когда он открывает страницу в браузере. Код приложения доступен по ссылке.
Выполняем все шаги, описанные в главе «Публикация приложения в Apps c помощью Dockerfile». При этом в панели управления на шаге «5. Настройка приложения» нам нужно задать переменную окружения. Для этого необходимо нажать на кнопку «Добавить». Далее добавить ключ (имя переменной) и ее значение:
В данном примере у нас в коде указана переменная NAME
. Указываем ее в соответствии с регистром — большими буквами, иначе система не сможет ее считать. Значение переменной можно указывать любым регистром.
После того как деплой приложения будет полностью завершен, в разделе «Деплой» будет отображен соответствующий статус — «Успешно»:
Также при успешном деплое в логах будет отображена строка «Deployment successfully completed».
Для того чтобы перейти в веб-интерфейс приложения, откройте «Дашборд» и скопируйте доменное имя:
Далее при переходе по доменному имени будет отображен интерфейс запущенного сервиса так, как его видят пользователи:
Как можно увидеть на скриншоте выше, приложение было успешно запущено а также была применена ранее заданная переменная NAME
со значением Alex
.
В рамках данной статьи мы подробно познакомились с процессом развертывания приложений, «упакованных» в Dockerfile, с помощью сервиса Apps.
При использовании сервиса Apps можно легко развернуть свое приложение, прикладывая минимум усилий, так как платформа сама проделает все необходимые шаги и вам лишь останется только проверить финальный вариант.