Docker: определение и практическое применение технологии контейнеров
Динамичность и масштабируемость — ключевые факторы успеха приложений в современном мире, поэтому инструменты, обеспечивающие быструю разработку и легкое развертывание, представляют большую ценность для рынка и бизнеса. Технология контейнеризации Docker стала одной из главных в арсенале сегодняшних IT-специалистов и DevOps-инженеров в частности. Она позволяет оптимизировать процесс создания, тестирования и запуска программного обеспечения за счет унификации сред исполнения и революционного подхода к упаковке и транспортировке приложений (applications или app). В статье говорим о плюсах и минусах Докера, а также рассказываем, как он работает и чем контейнеризация помогает на практике.
Что такое Docker
Технология Docker (Докер) — это программная платформа с открытым исходным кодом, которая помогает автоматизировать развертывание, перенос и выполнение приложений с помощью контейнеризации. Проще говоря, это программа, позволяющая объединить код, системные инструменты, библиотеки, настройки и другие зависимости приложения в одну изолированную среду — контейнер, который затем можно запустить в любой системе с поддержкой контейнерной виртуализации.
Как свободное программное обеспечение, Docker впервые был выпущен в 2013 году. Изначально его работа строилась на использовании возможностей уже существовавшей тогда системы контейнеризации Linux Containers (LXC), но позже, в 2015 году, компания-разработчик Docker (бывшая dotCloud) создала собственную библиотеку libcontainer, которая используется в Докере по сей день. О принципе его работы мы еще поговорим подробнее чуть дальше. Сначала давайте разберемся, что представляет собой понятие «контейнера».
Изображение от fullvector на Freepik.
Что такое контейнер
Процесс виртуализации подразумевает под собой абстракцию, отделение вычислительных ресурсов машины от физических устройств, которые эти вычисления производят. Благодаря такой технологии на одном настоящем компьютере можно запустить несколько виртуальных. Контейнеризация — это вид виртуализации, при котором создаются не полноценные компьютеры с отдельной операционной системой (виртуальные машины), а программные среды, существующие в одной общей ОС, но изолированные друг от друга и от самой этой ОС. Эти среды называются контейнерами.
В Docker контейнер является автоматически исполняемым пакетом, включающим в себя всё необходимое для запуска конкретного приложения: его код и все зависимости вместе с настройками среды. В отличие от аппаратной виртуализации, контейнеризация не требует наличия гипервизора и большого количества мощностей, поскольку контейнерам не нужно эмулировать работу целого компьютера и поддерживать собственную операционку. Они используют ресурсы одной и той же системы, но при этом выполняют заложенные в них процессы независимо.
Преимущества использования Docker
Переносимость приложений. Docker-контейнеры решают проблему несовместимости версий программного обеспечения и настроек системы, требующихся для разных приложений. Включив Докер в свою инфраструктуру, компания обеспечит согласованность данных в различных средах и ОС, окружающих приложение.
Изоляция процессов. Контейнеризация гарантирует, что приложение вместе со своими зависимостями будет работать только внутри контейнера, не затрагивая внешнее окружение, не влияя ни на операционную систему, ни на другие контейнеры. Это в свою очередь повышает безопасность всей системы.
Оптимизация разработки. Docker дает возможность упаковывать все нужные настройки в контейнеры, которые легко перенести и развернуть в любой другой среде и даже нескольких, в том числе тестовой и продакшене. Развертывание приложений ускоряется и происходит в автоматическом режиме, без необходимости проверки совместимости, настройки окружения и проведения других отнимающих время процедур.
Экономия ресурсов. Благодаря контейнеризации и Докеру в частности, можно запустить несколько приложений/процессов на одном хосте, даже если они предъявляют взаимоисключающие технические требования, что позволяет более эффективно использовать ресурсы.
Организация микросервисов. Поскольку каждый Docker-контейнер содержит и изолирует одно приложение, построить микросервисную архитектуру, где процессы работают независимо, с их помощью становится проще.
Недостатки Docker
Необходимость оркестратора. Встроенный инструмент для работы с многоконтейнерными приложениями Docker Compose подходит для управления небольшими проектами, состоящими из нескольких контейнеров. Но если архитектура включает полсотни или больше изолированных микросервисов, то ресурсов платформы контейнеризации может не хватить. В таких случаях в систему внедряют технологию оркестрации вроде Kubernetes или OpenShift, чтобы обеспечить лучшую надежность.
Снижение производительности. Из-за появления дополнительного слоя абстракции тратится больше вычислительных ресурсов. Без контейнеризации приложение работает в среднем на 2-4% быстрее.
Принцип работы Docker
Основная идея Докера заключается в создании контейнеров, он представляет собой прослойку между операционной системой хоста и выполняемыми приложениями. Docker использует клиент-серверную архитектуру, причем клиент (Docker client) может быть физически расположен на отличной от сервера (Docker daemon, dockerd) машине. Клиентская часть создает задачу, а демон выполняет ее с помощью встроенных механизмов изоляции ядра. Именно Докер демон управляет созданием, запуском, остановкой и удалением контейнеров.
Также важными компонентами внутренней структуры данной платформы контейнеризации являются образы (Docker image), хранилище образов (Docker registry) и файл по их сборке (Dockerfile). Ниже мы разберем эти понятия подробнее.
Как устроен образ Docker
Образ Docker (Image) — это шаблон, содержащий все, что требуется для запуска приложения. Он считается ключевым элементом в технологии контейнеризации, поскольку из него впоследствии и создаются работающие изолированные контейнеры. В образ упакованы процессы и зависимости, которые нужны для стабильной работы приложения, и сам он представляет собой объединение слоев, что доступны лишь для чтения и не могут быть изменены. Однако удалять слои можно — это позволяет откатиться к предыдущей версии образа. Контейнер, в отличие от образа, имеет дополнительный внешний слой, позволяющий записывать данные. Но и удаляется контейнер целиком, а не слоями, поэтому вся записанная информация уничтожается вместе с ним.
Еще в Докер-образе имеется файл manifest, хранящий в себе данные для управления слоями: ссылки на их расположение, размер, хеш и сведения о платформе, на которой планируется запуск контейнера. С его помощью можно структурировать образ, отслеживать и контролировать изменения в приложении.
Создание образа Docker
Чаще всего образ создается по инструкции, которая записана в Dockerfile. Это текстовый файл, где каждая строка представляет собой одну команду. Выполняя их по порядку, Docker собирает образ, т. е. устанавливает и настраивает все необходимые приложению зависимости. Делает он это автоматически после команды docker build.
Написать Dockerfile можно самостоятельно, но для решения стандартных задач обычно используют публичный репозиторий Docker Hub. Готовые образы скачиваются оттуда при помощи команды docker pull и затем просто разворачиваются в контейнеры.
Также создать образ можно в интерактивном режиме: базовый образ скачивают из Registry, запускают из него контейнер, вносят изменения и сохраняют/отправляют их в образ через commit.
Как Docker помогает на практике
Как мы уже сказали, контейнеризация и Docker в частности решают проблему зависимостей и рабочего окружения: благодаря изоляции можно не беспокоиться о том, что процессы будут конфликтовать друг с другом из-за разных требований к программному обеспечению и системным настройкам. Также переносимые контейнеры позволяют ускорить и упростить тестирование приложений, ведь не нужно тратить время на подготовку среды, установку зависимостей и пр. Развертывание происходит автоматически. Соответственно, публикация приложения тоже осуществляется гораздо быстрее.
Платформа Docker позволяет оптимизировать все ключевые этапы разработки: от написания кода приложения до его выпуска в продакшен. Давайте рассмотрим, как конкретно Докер применяется на практике.
Разработка приложений с зависимостями
С помощью Docker разработчик может удобно и эффективно управлять компонентами приложениями. Традиционно установка и настройка библиотек или других зависимостей требовали ознакомления с официальной инструкцией и пошагового следования ей. Этот процесс мог быть крайне трудоемким и занимающим много времени, особенно в случае изменения зависимостей. Но с Докером все куда проще.
Разработчику нужно лишь скачать подходящий образ из Docker Hub, куда компании-разработчики софта сами выкладывают свои продукты, а затем развернуть его на своем устройстве. Докер установит и настроит зависимость самостоятельно, чем освободит специалиста от рутины. Если фреймворк или базу данных потребуется удалить, то это также легко сделать через остановку и уничтожение контейнера: в системе не останется ни следа.
Автоматизация тестирования
Докер обеспечивает более гибкий и безопасный подход к тестированию приложений. Если в обычной ситуации перед запуском автотестов нужно установить и настроить зависимости на сервере сборки — что требует внимания к деталям, ибо любая ошибка на этом этапе может привести к нестабильности или поломке данных, — то применение Docker позволяет развернуть весь необходимый софт автоматически, просто запустив образ. Таким образом контейнеризация ускоряет автотестирование, а также гарантирует, что после выполнения тестов все контейнеры могут быть легко удалены, чтобы избежать оставления лишних данных или настроек на сервере. Особенно это полезно в случае, если тестирование каким-то образом повредит данные. Докер обезопасит систему и минимизирует риск негативных последствий.
Публикация приложения
Использование Docker в процессе разработки обеспечивает также более удобную и стандартизированную передачу приложения клиентам или инженерам инфраструктуры. Публиковать продукт становится проще и безопаснее за счет его упаковки в Докер-образ. Не нужно писать инструкции и кучу документации о том, как и какие зависимости надо установить или что делать с настройками системы: клиент может просто развернуть образ в контейнере и работать. Это избавляет его от непредвиденных ошибок при установке. Обновлять образ тоже можно через одни и те же команды, без детального понимания, какие компоненты и настройки требуются для работы проекта.
Кроме того, контейнеризация делает среду для деплоя универсальной: она оперирует только контейнерами, так что разворачивать в ней можно какие угодно приложения без оглядки на их совместимость.
Заключение
Платформа Docker стала ключевым инструментом в разработке и развертывании приложений, поскольку предоставляет высокую степень их переносимости и изоляции, обеспечивает эффективное использование ресурсов и упрощает многие процессы создания программных продуктов благодаря контейнеризации. Несмотря на некоторые недостатки, преимущества Docker делают его неотъемлемой частью современной IT-инфраструктуры.
Оцените статью