Давайте дружить в Телеграме: рассказываем про новые фичи, общаемся в комментах, прислушиваемся к вашим идеям Подписаться

Docker: контейнеризация приложений — обзор

Роман Андреев
Роман Андреев
Технический писатель
17 ноября 2022 г.
732
10 минут чтения
Средний рейтинг статьи: 5

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

Что Такое Docker (1)

О разделении ресурсов программисты задумывались уже очень давно: первые попытки изоляции процессов от операционной системы датируются концом 1970-х годов. Однако технология стала бурно развиваться только через 20 лет. Разработчикам продукта под названием FreeBSD Jail удалось добиться того, что несколько изолированных процессов (они назвали их «тюрьмы», Jails) запускались внутри одной операционной системы. При этом с ОС они не взаимодействовали, за исключением потребления системных ресурсов.

Затем последовал Linux VServer с виртуальными серверами, а в 2005 году появился OpenVZ, однако широкого распространения он не получил из-за того, что разработчикам не удалось решить проблему совместимости внутри семейства ОС: OpenVZ требовал конкретную версию ядра системы. Параллельно развивались проекты от других разработчиков (например, CGroups от Google и LXC). А в 2013 году на рынке появился продукт компании Docker, получивший такое же название.

Что такое Docker

Docker (или Docker CE: Community Edition) представляет собой платформу контейнеризации, позволяющую создавать, доставлять и управлять приложениями. Это ускоряет тесты и выкладку продуктов, ведь благодаря Докеру можно запускать в одной системе столько контейнеров, сколько необходимо разработчикам. Также Docker решает проблему совместимости с версией ОС и зависимостями. Для успешного запуска контейнера достаточно правильно настроить виртуальную среду, упаковав в образ всё зависимое ПО. 

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

  • Контейнеры легко останавливаются, перезапускаются и уничтожаются, но нужно учитывать, что вместе с этим удаляются и все данные. Поэтому ценные данные хранить в контейнере не рекомендуется.
  • Они мало весят (как правило, считанные мегабайты), так как, помимо самого приложения, в образ «зашивается» только минимально необходимая среда для запуска. Благодаря этому удается сократить использование системных ресурсов: прежде всего выделяемой памяти.
  • Прерывание работы одного контейнера не остановит работу приложения, поскольку контейнеризация работает по следующему принципу: 1 контейнер — 1 процесс.
  • Контейнеризация позволяет изолировать процессы, что положительно сказывается на безопасности, однако это не повод пренебрегать мерами сетевой безопасности. Во-первых, контейнеры задействуют ресурсы ОС, а значит, определенным образом с ней всё же связаны и потенциально уязвимы. А во-вторых, образы могут быть получены из разных источников, поэтому запускать следует только проверенные.
  • Контейнеры обеспечивают удобный переход с монолитной архитектуры на микросервисы. Это повышает скорость разработки новых функций приложений и сервисов, так как изменения в отдельных компонентах уже не будут затрагивать систему целиком.
  • Контейнеры предлагают более экономичное распределение ресурсов, чем виртуальные машины. И количество запущенных виртуальных машин на одних и тех же мощностях оказывается намного меньше, чем образов Docker.

Преимущества использования Docker

Платформа контейнеризации Docker предлагает целый ряд плюсов как для независимых разработчиков, так и для крупных компаний:

  • Docker обеспечивает простой запуск контейнеров как на обычных машинах, так и в облаке. А использование шаблонов при создании контейнеров позволяет создавать образы фактически бесконечно, причем разворачивать их можно где угодно.
  • Образы содержат весь необходимый функционал для запуска приложения, что исключает проблемы при их переносе между средами разработки. В результате удается избежать ситуаций, когда в среде разработки приложение работает штатно, а за ее пределами, то есть на устройствах пользователей, нет.
  • Docker позволяет в разы сокращать время развертывания приложений, поскольку нет необходимости в настройке окружения и предварительных тестах.
  • Также нет ограничений по языкам программирования, что исключает проблемы, возникающие из-за того, что отдельные библиотеки и другие элементы приложений несовместимы друг с другом.
  • За счет того, что у Docker открытый исходный код, вокруг платформы выросло большое и дружное комьюнити. Новым пользователям предлагается всесторонняя поддержка на тематических форумах, а также много полезных ресурсов для старта. Например, обширная библиотека контейнеров, из которой почти всегда можно выбрать приближенные к реальной задаче.
  • Docker содержит удобный инструментарий для управления трафиком, что обеспечивает безболезненное обновление образов без необходимости останавливать работу приложения.
  • Также на достойном уровне выполнены и функции администрирования, обеспечивающие несложный перенос между хостами, одновременный запуск любого количества контейнеров, обновление групп образов, откат к предыдущим версиям.
  • Отметим и безопасную работу, что достигается за счет изоляции образов на уровне процессов и операционной системы. Благодаря этому можно безопасно запускать любое число контейнеров (разумеется, учитывая те моменты, о которых уже было сказано в предыдущей главе).
  • Также, говоря об особенностях образов Docker, мы уже отмечали более экономичное распределение ресурсов в сравнении с виртуальными машинами. В результате при использовании контейнеризации разработчикам понадобится меньше виртуальных ресурсов, что позволит сэкономить на аренде.
  • Использование микросервисной архитектуры облегчает добавление нового функционала и масштабирование проекта.

Основные компоненты Docker

Пришло время познакомиться с устройством платформы. Вы будете работать со следующими файлами, службами, утилитами, модулями и приложениями:

  • Dockerfile — этот текстовый файл содержит все необходимые инструкции для создания контейнера, расположенные последовательно. Файл создаётся по принципу «одна строка — одна команда».
  • Daemon — служба, благодаря которой контейнеры создаются, запускаются и уничтожаются.
  • Client — утилита, используемая для управления демоном.
  • Image — готовый образ, предназначенный для развертывания любого количества экземпляров контейнера. Созданный Image не изменяется.
  • Container — само развернутое приложение.
  • Docker Desktop — приложение, необходимое для сборки, исполнения и тестирования контейнеров. Позволяет Docker работать в Windows и macOS.
  • Registry — локальный репозиторий, при помощи Registry можно отслеживать версии образов, а также создавать приватные хранилища.
  • Docker Hub — публичный репозиторий, нужен для интеграции с GitHub и BitBucket.
  • Docker volumes — тома для настройки хранения данных.

Как устроен образ Docker

Образ (Image) — центральный элемент в процессе контейнеризации. В образ упакованы все процессы и зависимости, необходимые для запуска и штатной работы приложения. Образы можно создавать самостоятельно, но нередко разработчики пользуются уже готовыми, которые скачивают с того же Docker Hub. Этот способ позволяет сэкономить немало времени, однако подходит только тем, кто решает типовые задачи.

Конечный образ состоит из объединенных слоев, представляющих собой результаты промежуточных изменений. Особенность этих слоев в том, что они неизменны и доступны только для чтения, однако их можно удалять по отдельности, то есть откатываться к предыдущим версиям образа. В отличие от образа, контейнер содержит дополнительный внешний слой, позволяющий записывать данные. Однако при уничтожении контейнера исчезает и записанная информация, поскольку контейнеры удаляются целиком. Также в образах хранится файл manifest, где содержатся следующие данные: ссылки на имеющиеся слои, размер каждого, хеш и информация о платформе, на которой предполагается запуск контейнера.

Создание образа Docker

Это достаточно простой процесс, и выполняется он двумя способами: посредством Dockerfile или в интерактивном режиме. Последний работает так: запускается контейнерная оболочка и вводится инструкция docker run. Но в ряде случае понадобится создать образ через Dockerfile, что несколько сложнее, поэтому сделали небольшой гайд.

Создание образа через Dockerfile

  1. Размещаем Dockerfile в какой-либо директории при помощи команды mkdir -p с последующим указанием пути.
  2. Переходим в эту директорию и создаем сам файл (устройство Dockerfile подробно описано в технической документации Docker).
  3. Запускаем сборку инструкцией docker build -t name/assembly:v1, где вместо name указываем имя владельца из Dockerfile, а вместо assembly — название сборки. v1 — это указание на номер версии.
  4. После этого Docker приступит к сборке образа, а по завершении операции должно высветиться сообщение, начинающееся со слов Successfully built, что будет свидетельствовать об успешном создании.
  5. Далее можно просмотреть созданные образы при помощи docker images, а создание контейнеров осуществляется по инструкции docker run -d -p.
  6. Сами контейнеры просматриваются через docker ps -a, а их запуск и остановка осуществляются командами docker start и docker stop соответственно.
  7. А если понадобится исключить неиспользуемые файлы, это делается через редактирование .dockerignore.

Сервисы для работы с контейнерами

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

  • Один из них создан разработчиками платформы и называется Docker Compose. Он предназначен для централизованного запуска группы сервисов. Документировать и конфигурировать их позволяет файл YAML, а разворачиваются сервисы при помощи инструкции docker‑compose up. Эта инструкция позволяет создавать новые контейнеры и всё необходимое окружение, отмеченное в Docker Compose. Одним из плюсов этого сервиса является возможность создания и уничтожения среды с использованием минимального набора инструкций.
  • Другой сервис был создан разработчиками Яндекса, а называется он Yandex Container Registry. Он позволяет выполнять автоматическую репликацию данных, а также без проблем переходить на архитектуру микросервисов. Кроме того, YCR поддерживает интеграцию в облаке. Управление выполняется через консоль или непосредственно через командную строку. Из других особенностей этого сервиса отметим возможность создания контейнеров под оба популярных семейства ОС: Windows и Linux. Также контейнеры ожидаемо поддерживают запуск на виртуальной инфраструктуре Яндекса. А еще YCR совместим с популярным решением для оркестрации — Kubernetes. И как раз об оркестраторах, без которых невозможна нормальная разработка сложных сервисов и приложений, мы и поговорим далее.

Оркестрация

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

  • Возможности Docker Swarm покрывают базовые потребности разработчиков. Эта система предназначена для быстрого создания кластера, организованного контейнерного пространства, состоящего из многих единиц. DS прост в настройке и развертывании, но при этом не подходит для масштабных проектов.
  • Kubernetes предназначен для автоматизации контейнеризации на ОС семейства Linux. Эта платформа обладает расширенным функционалом и может использоваться для централизованной группировки контейнеров, балансировки нагрузки, а также одновременной активации сотен и тысяч приложений. Однако платой за расширенные возможности является более сложная настройка Kube.

Мы подробно описывали Docker Swarm и Kubernetes в отдельной статье.

Заключение

Docker — простое и эффективное решение для контейнеризации, облегчающее задачи разработчикам по созданию, доставке и управлению приложениями. Функциональные возможности платформы расширяют сервисы и решения для оркестрации, причем разработчики могут выбирать те, которые лучше отвечают их задачам и требованиям.

Зарегистрируйтесь и начните пользоваться
сервисами Timeweb Cloud прямо сейчас

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону