Благодаря контейнеризации и использованию Docker разработчики больше не задумываются о том, в какой среде будет функционировать их приложение и будут ли в этой в среде необходимые для тестирования опции и зависимости. Достаточно упаковать приложение со всеми зависимостями и процессами в контейнер, чтобы запускать в любых системах: Linux, Windows и macOS. Платформа Docker позволила отделить приложения от инфраструктуры. Контейнеры не зависят от базовой инфраструктуры, их можно легко перемещать между облачной и локальной инфраструктурами.
Как устроен Docker и почему он популярен
Docker — это платформа контейнеризации с открытым исходным кодом, с помощью которой можно автоматизировать создание приложений, их доставку и управление.
Docker — популярная технология контейнеризации, появившаяся в 2013 году. Тогда одноименная компания предложила способ виртуализации ОС, при котором код приложения, среда запуска, библиотеки и зависимости упаковываются в единую «капсулу» — контейнер Docker.
Одной из реализаций идеи о разделении ресурсов стали Croot jail и операция Chroot, которые появились в 1979 году в UNIX версии 7. С помощью Chroot jail процесс и его дочерние элементы изолировались от основной ОС. Docker фактически можно считать продолжением этой идеи. Но корневой процесс мог выходить из chroot, а механизмов безопасности на тот момент еще не придумали.
Спустя 20 лет появился FreeBSD Jail — механизм виртуализации, позволяющий внутри одной ОС использовать несколько изолированных систем, которые назвали тюрьмами. Далее технологии контейнеризации развивались стремительно. В 2001 году появился Linux VServer, который использовал chroot-подобную утилиту и применялся для безопасного разделения ресурсов. Каждый раздел назывался «контекстом безопасности», а виртуализированная система внутри него — виртуальным частным сервером.
В 2005 году представили OpenVZ с виртуализацией на уровне ОС, благодаря которой усовершенствовалась технология изоляции. Но был и серьезный недостаток: у контейнеров и хоста была одна архитектура и версия ядра. Если требовалась другая, возникали проблемы.
В 2007 году компания Google представила функцию CGroups, ограничивающую использование ресурсов (CPU, ROM, дисковый ввод-вывод, сеть и т. д.) на уровне групп процессов. Спустя год выпустили Linux Containers (LXC), который имел много общего с OpenVZ и Linux-VServer, но использовал механизмы namespaces и CGroups из Linux-ядра вместо сторонних механизмов, внедряемых в ядро с помощью патчей.
В 2013 году компания Cloud Foundry создала Warden. Новая утилитапредназначалась для запуска приложений, которые получают все свои зависимости от частей ПО, называемых buildpacks
. Контейнеры Warden обычно имеют два слоя: слой только для чтения с корневой файловой системой ОС и неперсистентный слой чтения/записи самого приложения и его зависимостей. В 2013 году на рынке появился и Docker.
Что такое Docker
Docker — это платформа контейнеризации с открытым исходным кодом, с помощью которой можно автоматизировать создание приложений, их доставку и управление. Платформа позволяет быстрее тестировать и выкладывать приложения, запускать на одной машине требуемое количество контейнеров.
У контейнеризации и виртуализации есть сходство, но есть и различия. Виртуализация напоминает отдельный компьютер со своим оборудованием и ОС, внутри которого можно запустить еще одну ОС. А контейнеризация предполагает, что виртуальная среда запускается из ядра ОС, не предусматривает виртуализации оборудования и снижает потребление ресурсов.
Существуют решения вроде Yandex Serverless Containers которые позволяют запускать контейнеры без создания виртуальных машин и кластеров Kubernetes. Платформа избавляет пользователей от необходимости заниматься рефакторингом и отменяет ограничения на использование языков программирования.
Особенности контейнеров
-
Важнейшая особенность контейнеров — их сравнительно короткий жизненный цикл. Любой контейнер можно остановить, перезапустить или уничтожить, если это необходимо. Данные, которые содержатся в контейнере, при этом тоже пропадут. Так выработалось правило проектирования приложений: не хранить важные данные в контейнере. Такой подход называют Stateless.
-
Объем контейнеров измеряется в мегабайтах, поскольку в них упаковывают лишь те процессы и зависимости ОС, которые необходимы для выполнения кода. Легковесные контейнеры быстро запускаются и экономят место на диске.
-
Один контейнер соответствует одному запущенному процессу. Отключение отдельного контейнера для отладки или обновления никак не помешает нормальной работе всего приложения.
-
Контейнеризация обеспечивает надежную изоляцию процессов и повышает уровень безопасности систем. Приложения, которые работают внутри контейнера, не имеют доступа к основной ОС и не могут на неё влиять.
-
Благодаря контейнерам можно автоматизировать развертывание приложений на разных хостах.
-
Использование контейнеров позволяет перейти с монолита на микросервисную архитектуру. За счет этого ускоряется разработка новой функциональности, поскольку нет опасений, что изменения в одной компоненте затронут всю остальную систему.
-
С точки зрения эффективности контейнеры котируются выше виртуальных машин. На одинаковом оборудовании можно запустить большое количество контейнеров, тогда как ВМ будет в разы меньше. Это важно при использовании облачной инфраструктуры — потребуется меньше ресурсов.
Подробнее об экосистеме контейнеров рассказали в этом видео.
Преимущества использования Docker
Какие преимущества Docker приносит компаниям и разработчикам?
- Гибкость и адаптивность. Благодаря Docker можно легко запускать контейнер в облачной инфраструктуре и на любом локальном устройстве. Можно создать базовые шаблоны контейнеров и использовать повторно бесконечное число раз. Бесшовная переносимость и простота развертывания — важные преимущества этой технологии.
- Меньше ошибок и несовпадений окружений. В контейнерах Docker содержится всё, что требуется для запуска приложения, поэтому перенос приложений из одной среды в другую не вызывает затруднений. Исчезает проблема, когда у разработчиков всё функционирует как надо, а на боевом сервере — нет. Пример того, как это помогает в бизнесе, от компании «Бухта».
- Скорость развертывания. Так как настраивать окружение для разработки, тестирования и боевого режима больше не нужно, время развертывания сокращается в несколько раз.
- Рост универсальности. Docker позволяет использовать любые языки программирования и стек технологий на сервере, избавляя от проблемы несовместимости разных библиотек и технологий.
- Комьюнити и поддержка. Существует огромная библиотека контейнеров с открытым исходным кодом. Можно скачать нужный образ для конкретной задачи или обратиться за помощью к большому комьюнити разработчиков, которые используют Docker.
- Непрерывность работы. С учетом инструментов управления трафиком можно построить процесс обновления приложения так, чтобы обновление одних контейнеров не влияло на работоспособность системы и оказание услуг пользователям.
- Упрощение администрирования. С помощью Docker легче перенести контейнер с одного хоста на другой, запустить сразу несколько образов, обновить группы контейнеров и откатиться к старой версии.
- Повышение уровня безопасности. Контейнеры в Docker частично изолированы друг от друга на уровне процессов и ОС, поэтому запуск большого количества контейнеров на одной машине не несет рисков.
- Экономическая эффективность. Контейнеры легковесны и производительны, а благодаря использованию Docker можно эффективнее управлять имеющимися ресурсами и сократить расходы компании.
- Современный подход. Отказ от монолитной архитектуры в пользу микросервисной позволяет более гибко развивать продукт, добавлять в него новые функции. Эффективность такого подхода показывает история Sports24.ru.
Бесплатно поработать с Docker и контейнерами можно в Yandex Cloud. Сервис даёт новым пользователям грант на 4000 рублей. Этими деньгами можно оплатить используемые ресурсы. Есть и другие программы поддержки компаний, которые только осваивают эту технологию. Тестирование поможет понять, насколько Docker и другие облачные решения будут эффективны в бизнес-процессах компании.
Основные компоненты Docker
Dockerfile. Текстовый файл с последовательно расположенными инструкциями для создания образа Docker. Файл создаётся по принципу «одна строка — одна команда».
Daemon. Фоновая служба на хосте, которая отвечает за создание, запуск и уничтожение контейнеров.
Image. Неизменяемый файл (образ), из которого можно неограниченное количество раз развернуть контейнер.
Client. Утилита командной строки в Docker для управления демоном. Любое взаимодействие с контейнером проходит через Daemon.
Container. Запущенное приложение, которое развернули из образа.
Registry. Служба в Docker, выполняющая функции репозитория (хранилища). Позволяет следить за версиями образов, создавать приватные репозитории.
Docker Hub. Популярный публичный репозиторий, используемый по умолчанию в Docker. Обеспечивает интеграцию с GitHub и BitBucket.
Docker Desktop. Приложение, позволяющее локально собирать, выполнять и тестировать контейнеры. Работает на Windows и macOS.
Docker volumes. Тома для постоянного хранения информации. По умолчанию в Docker папки хранилищ создаются на хост-машине, но предусмотрена и возможность подключения удаленных хранилищ. Использование томов позволяет лучшим образом настроить хранение данных.
Как устроен образ Docker
Базовый образ — главный элемент контейнеризации в Docker. В нем содержатся процессы и зависимости, необходимые для нормальной работы приложения. Разработчики предпочитают скачивать готовые образы из репозиториев, а не создавать их с нуля, так как уже есть огромное количество готовых компонент для самых разных задачи. Например, в Docker Hub уже загружено свыше 100 000 образов.
На базовый образ в Docker один за другим накладываются доступные только для чтения слои, которые образуются после любых изменений в образе. Каждый новый слой — это актуальная версия образа. Получается, что финальный образ — это объединение всех слоев в один. Каждый слой образа сохраняется, чтобы при необходимости быстро откатываться назад. Такое решение экономит пространство диска и сокращает время сборки контейнера.
Если образ — это набор доступных только для чтения слоев, то контейнер представляет собой тот же образ, но с еще одним слоем сверху — с возможностью записи. Информация записывается в контейнер, а когда он уничтожается, верхний слой и содержащиеся в нем данные пропадают. В случае необходимости создается новый (чистый) контейнер из старого образа.
В любом образе Docker хранится Docker manifest. Это JSON-файл, содержащий информацию об образе: ссылки на каждый существующий слой, данные об их размере, хеш, а также сведения о платформе, на которой он будет работать.
Создание образа Docker
Развертывать образ можно любое количество раз на любом хосте. Для создания образа используется один из двух способов: интерактивный или через Dockerfile.
Интерактивный — простой способ, при котором разработчик сам изменяет среду окружения во время запуска контейнера. После запуска Docker в сессии терминала запустите оболочку контейнера (bash) командой docker run image_name: tag_name
. Имя тега можно не указывать, тогда задействуется текущая версия образа.
Вариант с Dockerfile сложнее. Вы уже знаете, что каждому образу присваивается свой Dockerfile. После указания нужных команд в Dockerfile, исключите в .dockerignore все файлы, не используемые в сборке. Затем создайте образ командой docker image build
, присвойте ему имя и тег.
Сервисы для работы с контейнерами
Использование образов и контейнеров позволяет организовывать сложную архитектуру приложений. Чем сложнее проект, тем труднее им управлять. Есть сервисы, позволяющие упростить и автоматизировать работу с контейнерами. О том, как эффективно использовать один из этих сервисов, мы рассказали в видео.
Yandex Serverless Containers
Yandex Container Registry
Простой и безопасный сервис для хранения и распространения образов Docker автоматически реплицирует все данные, упрощает переход на микросервисную архитектуру и интеграцию с облачными сервисами. Поддерживает управление через интерфейс консоли, командной строки (CLI) и командной строки Docker на основе Docker Registry HTTP API V2, работу через API.
Доступны контейнеры с ОС Linux и Windows, которые можно запускать локально или на виртуальных машинах Yandex Compute Cloud. Container Registry становится еще эффективнее, если пользоваться им в связке с сервисом для управления кластерами Kubernetes — Yandex Managed Service for Kubernetes.
Docker Compose
В составе Docker есть инструмент, который позволяет централизованно запускать большое количество сервисов: Docker Compose. Документирование и конфигурирование сервисов приложения осуществляется с помощью текстового YAML-файла. Команда docker‑compose up
развертывает сервисы приложений и создает из образа новые контейнеры, а также сети, тома и все конфигурации, указанные в файле Docker Compose.
На этапе тестирования разработчикам приходится создавать изолированные среды, а потом уничтожать их. Docker Compose позволяет создать и уничтожить среду путем ввода нескольких команд. К участию в проекте можно привлекать и сторонних пользователей.
Оркестрация
Когда контейнеров становится слишком много, ими трудно управлять. На помощь приходят системы оркестрации.
Docker Swarm
Стандартная система оркестрации контейнеров, достаточная для решения базовых задач. Позволяет быстро создать из нескольких хостов с контейнерами последовательный кластер Swarm, считая все кластерные хосты единым контейнерным пространством. В Docker-кластере должна быть как минимум одна управляющая нода (manager).
Kubernetes
Платформа для автоматизации работы с контейнерами на Ubuntu, CentOS и других ОС Linux. Позволяет централизованно группировать контейнеры, балансировать нагрузку, активировать сервисы из сотен приложений одновременно. Kubernetes предоставляет пользователям больше возможностей по сравнению со Swarm, но и настраивать его сложнее.»