Статья также доступна на украинском (перейти к просмотру).
Оглавление
- Виртуальные среды управления приложениями
- Развертывание среды Docker на Ubuntu
- Запуск и использование справочной системы Docker
- Управление контейнерами в среде Docker
Разработка и использование многокомпонентных разветвленных приложений вызывает немало сложностей из-за высоких потребностей в машинных ресурсах и проблем совместимости программных сред выполнения кода. Существует много средств , которые направлены на уменьшение влияния указанных факторов на качество разработки и использования приложений. Одним из них является программная платформа Docker, опирающаяся на более высокий уровень абстракции виртуальной среды – контейнеризацию. Рассмотрим подробнее ее возможности и продемонстрируем работу с ней.
Виртуальные среды управления приложениями
Несмотря на разнообразие существующих средств разработки разветвленных приложений, далеко не все из них отвечают OCI (Open Container Initiative) – стандарту виртуализации на уровне операционной системы (ОС). Некоторые вообще его игнорируют, другие соответствуют только одной из двух имеющихся спецификаций OCI – времени исполнения (runtime) или образа (image). Именно указанный стандарт открывает перспективы создания автономных, независимых от любой платформы сред разработки и выполнения кода.
Ключевым отличием указанных сред от «обычных» виртуальных машин является значительная их компактность и кроссплатформенность, то есть полная независимость от оборудования. На уровне операционной системы здесь образуется общая виртуальная среда для всех отдельных независимых модулей или контейнеров, которые в ней запускаются и работают. Каждый такой контейнер, по сути, представляет собой отдельную виртуальную машину со своей мини средой и настройками. Он активизируется сразу же после запуска своего образа – специального шаблона, содержащего исходный код вместе с определениями любых программных зависимостей и библиотек. Контейнеры являются более мобильными сущностями по сравнению с классическими виртуальными машинами. Управление их работой в пределах общей виртуальной машины производится с помощью набора базовых команд среды разработки.
Стандарт OCI и определяет правила формирования общей среды выполнения для контейнеров (runc), а также правила создания, сохранения и обработки их образов.Стандарт OCI и определяет правила формирования общей среды выполнения для контейнеров (runc), а также правила создания, сохранения и обработки их образов.
Платформа Docker – одна из основных реализаций указанного стандарта наряда с системой Podman от компании Red Hat. Основным отличием между ними является наличие у Docker общего демона для всех контейнеров, в то время как у Podman общий процесс отсутствует и, соответственно, контейнеры запускаются только как дочерние процессы. Также отличаются подходы к управлению системой – у Docker по умолчанию управление системой устанавливается только для root-доступа, в то время как у Podman «работает» обычный доступ. Хотя в последнее время и у Docker появился rootless-режим, то есть здесь системы почти сравнялись.
Docker обеспечивает существование указанной выше общей среды для контейнеров и предоставляет инструменты для управления им работу которых мы здесь и протестируем. Кроме того, он предоставляет средства для создания образов и управления ими в соответствии со спецификацией OCI.
Существует много промежуточных разработок, которые обеспечивают сервисные функции для работы некоторых из модулей Docker-системы. К примеру, в AWS уже реализован высокопроизводительный сервис управления контейнерами ECS (Amazon Elastic Container Service). А многие хостер-провайдеры имеют собственные шаблоны программы. К примеру, компания FREEhost.UA имеет собственный шаблон VPS с Docker на основе ОС Debian, который можно развернуть в один клик.
Релизы Docker выпускаются двух видов – свободно распространяемое программное обеспечение (Community Edition) и для коммерческого использования (Enterprise). Он поддерживает работу в большинстве существующих операционных систем – Mac, Windows, Linux и других. В частности, Ubuntu Docker CE поддерживает следующие программы-драйверы для хранилищ образов: Overlay2, btrfs и aufs, что создает весьма комфортные условия для работы с ним именно в среде Linux-систем.
Развертывание среды Docker на Ubuntu
Установим «с нуля» Docker CE на ОС Ubuntu. Устанавливать программу будем из официального репозитория Docker, а не из репозитория Ubuntu, чтобы гарантированно получить последнюю версию программы. Последовательность действий будет следующей:
- Обновление версий пакетов ОС;
- Установка пакетов, необходимых для работы менеджера apt через протокол https;
- Копирование в нашу систему ключа GPGиз официального репозитория Docker для возможности производить загрузку;
- Установка и развертывание программы.
Итак, обновим версии пакетов нашей ОС. Для этого наберем в терминале команды:
$ sudo apt update
$ apt list –upgradable
Установим дополнительные пакеты для менеджера apt:
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
Добавим ключ из репозитория Docker:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Добавим репозиторий программы к источникам apt-менеджера. Это расширит базу пакетов нашей системы за счет новых пакетов Docker:
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
Теперь нужно убедиться, что загрузка будет осуществляться именно с официального репозитория программы, вместо репозитория Ubuntu, который, как известно, установлен по умолчанию. Для этого наберем соответствующую команду:
apt-cache policy docker-ce
В результате мы получили список подготовленных к закачке менеджером пакетов ресурсов, где указан адрес именно официального репозитория:
https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
Это означает, что пакеты будут загружены с указанного адреса, что нам и нужно.
Теперь начнем процесс установки программы. Наберем в терминале:
sudo apt install docker-ce
После подтверждения согласия на выделение дополнительных 401 Mb процесс инсталляции продолжится:
Как видим, процесс инсталляции успешно завершен. Теперь проверим статус программы, чтобы убедиться, что главный процесс запущен и программа готова к выполнению задач. Введем:
$ sudo systemctl status docker
Можно видеть, что процесс запущен, PID = 630938. Также указан путь к месту сохранения информации для группы Docker. Следует отметить, что для возможности пользоваться сервисом необходимо иметь права root или быть членом соответствующей группы. Поэтому целесообразно заранее добавить пользователей программы в указанную группу. К примеру, добавим пользователя нашей системы с именем new_user в группу Docker. Это можно сделать с помощью следующей конструкции:
$ sudo usermod -aG docker new_user
Всё прошло успешно. После этого указанный пользователь сможет управлять приложением, не вводя команды sudo.
Запуск и использование справочной системы Docker
Общий формат запуска приложения выглядит следующим образом:
docker [опції] [команда] [аргументи]
Сначала запустим приложение без параметров. В этом случае будет показан список доступных команд для работы со средой и образами. Введем в терминале:
$ docker
Чтобы просмотреть параметры определенной команды, например, images (работа с образами) введем в терминале:
$ docker images --help
Можно убедиться в том, что справочная система вывела полный список аргументов и синтаксис для указанной конструкции.
Для просмотра более широкой информации о программном средстве воспользуемся следующей конструкцией:
$ docker info
В результате мы получили достаточно полные сведения об установленном приложении, со всеми путями, сведениями о ресурсах и другой информацией.
Управление контейнерами в среде Docker
Как отмечалось, для запуска любого контейнера необходимо иметь его образ в виде шаблона специальной формы. Шаблоны могут храниться локально на нашей машине или же содержаться в сети в репозитории Docker Hub, используемого по умолчанию. Оттуда можно загружать на локальную машину. Для того чтобы загружать шаблоны на Docker Hub, нужно иметь на нем личную учетную запись, и это понятно.
Например, попробуем найти образ ОС Ubuntu. Для этого введем:
$ docker search ubuntu
Мы видим, что у репозитории есть несколько вариантов шаблонов для ОС Ubuntu, которые при желании мы можем загрузить на локаль. Загрузим официальную версию Ubuntu с помощью следующей конструкции:
$ docker pull ubuntu
Итак, указанный шаблон теперь находится на нашей машине, и мы сможем в любое время его активизировать и превратить в контейнер. Однако сначала найдем еще один шаблон, например, для языка программирования perl:
$ docker search perl
Теперь загрузим на машину официальную версию языка perl, обозначенную ОК в разделе OFFICIAL:
$ docker pull perl
Следовательно, еще один шаблон есть в нашем распоряжении. Кстати, все доступные шаблоны мы можем теперь просмотреть с помощью инструкции images:
$ docker images
Как видим, каждому шаблону присваивается свой идентификатор, чтобы им потом можно было управлять – запускать, удалять и т. д. Теперь с помощью конструкции run попытаемся запустить какой-нибудь из шаблонов для превращения его в рабочий контейнер в среде Docker. Введем в терминале:
$ docker run -it perl
Аргумент -it позволил нам включить интерактивный режим работы с нашим контейнером. В данном случае мы получили интерактивный отладчик языка perl. Просмотрим справочную информацию по отладчику с помощью инструкции h:
При помощи композиции клавиш Ctrl+D выйдем из интерактивного режима работы с контейнером perl.
Так же запустим контейнер для ОС Ubuntu:
$ docker run -it ubuntu
Обратите внимание на его идентификатор после символа «@». Его мы затем используем для управления модулем. Теперь мы можем работать с Ubuntu в отдельном контейнере. Для примера, инсталлируем язык java
$ apt install java
Инсталляция прошла удачно. Теперь выйдем из него:
$ exit
Теперь мы снова в нашей обычной среде Ubuntu.
После работы с несколькими контейнерами в пределах одной машины обычно будут накапливаться контейнеры, которые могут быть как активными, так и пассивными. Для выяснения того, какие из них активны, а какие пассивны, существует подходящее средство. Проверим сначала активные на данный момент времени модули:
docker ps
Следовательно, активен только модуль из Ubuntu. Теперь выведем все имеющиеся в системе контейнеры:
docker ps -a
Их оказалось три – два из perl и один из Ubuntu. Теперь выясним, какой из них запускался последним:
$ docker ps -l
Это контейнер с идентификатором 270c0219c951. Теперь запустим его еще раз:
$ docker start confident_wozniak
Обратите внимание, что для управления контейнерами можно использовать как числовые идентификаторы, так и символьные (указанные в столбце NAME).
Запустим еще один модуль с языком perl:
$ docker start peaceful_snyder
После этого проверим список активных модулей:
docker ps
Можно убедиться, что их уже три – два из perl и один из Ubuntu. Остановим последний с помощью его идентификатора:
$ docker stop 4939fb8b85fd
Проверим список активных:
Как видим, осталось всего два контейнера, и оба с языком perl.Также обратим внимание на то обстоятельство, что оба контейнера производны от одного и того же шаблона. Это говорит о том, что из любого шаблона может быть создано множество контейнеров с разными модификациями их содержимого. Так вышло и у нас с модулями perl.
Теперь попробуем реализовать обратную задачу – создать из модифицированного контейнера новый шаблон, то есть образ. Общий формат такой команды выглядит следующим образом:
docker commit -m "Описание внесенных изменений" -a "Имя автора" container_id repository/new_image_name
Где repository/new_image_name – путь к месту сохранения нового шаблона; container_id – идентификатор модуля.
Создадим новый шаблон на основе внесенных нами изменений в контейнер с Ubuntu. Для этого введем в терминале:
$ docker commit -m "added Java" -a "new_user" 4939fb8b85fd new_user/ubuntu-java
Убедимся, что количество наших шаблонов увеличилось:
$ docker images
Таким образом мы получили новый шаблон с Ubuntu на базе внесенных нами изменений в запущенный контейнер.
Итак, мы могли убедиться, что возможности манипуляций с данными в среде Docker почти не ограничены. И это при том, что код в контейнерах компактен, то есть запустить таких модулей можно гораздо больше, чем в классических виртуальных средах при тех же объемах машинных ресурсов.
Приглашаем Вас воспользоваться нашей услугой облачного хостинга с Docker. Установка ОС Debian и Docker выполняется автоматически. Уже через несколько минут вы можете начинать работу. Помимо базового программного обеспечения устанавливается Porteiner, это удобный UI, с помощью которого Вы сможете управлять контейнерами прямо из браузера.
Подписывайтесь на наш телеграм-канал https://t.me/freehostua, чтобы быть в курсе новых полезных материалов.
Смотрите наш канал Youtube на https://www.youtube.com/freehostua.
Мы в чем-то ошиблись, или что-то пропустили?
Напишите об этом в комментариях на сайте и в телеграм-канале. Мы с удовольствием ответим и обсудим Ваши замечания и предложения.
Дата: 02.06.2023 Автор: Евгений
|
|
Авторам статьи важно Ваше мнение. Будем рады его обсудить с Вами:
comments powered by Disqus