Докерская экосистема: обзор контейнеризации

Вступление

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

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

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

Краткая история контейнеризации Linux

Контейнерство и изоляция не являются новыми понятиями в вычислительном мире. Некоторые Unix-подобные операционные системы используют зрелые технологии контейнеризации более десяти лет.

В Linux, LXC, строительный блок, который лег в основу более поздних технологий контейнеризации, был добавлен в ядро ​​в 2008 году. LXC объединил использование cgroups ядра (позволяет изолировать и отслеживать использование ресурсов) и пространств имен (позволяет разделить группы, чтобы они не могли «видеть» друг друга), чтобы реализовать легкую изоляцию процесса.

Позже Docker был представлен как способ упрощения инструментов, необходимых для создания и управления контейнерами. Первоначально он использовал LXC в качестве исполняющего драйвера по умолчанию (с тех пор для этой цели была разработана библиотека под названиемlibcontainer). Docker, не представляя много новых идей, сделал их доступными для среднего разработчика и системного администратора, упрощая процесс и стандартизируя интерфейс. Это подстегнуло новый интерес к разработке контейнеров в мире Linux среди разработчиков.

Хотя некоторые темы, которые мы обсудим в этой статье, носят более общий характер, мы сосредоточимся в основном на контейнеризации Docker из-за его огромной популярности и стандартного принятия.

Что контейнеризация приносит на картину

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

Некоторые из большинства преимуществ перечислены ниже.

Абстракция хост-системы от контейнера приложения

Контейнеры должны быть полностью стандартизированы. Это означает, что контейнер подключается к хосту и всему, что находится за пределами контейнера, с использованием определенных интерфейсов. Контейнерное приложение не должно полагаться на подробности о ресурсах или архитектуре базового хоста или заботиться о них. Это упрощает предположения о разработке операционной среды. Аналогично, для хоста каждый контейнер является черным ящиком. Это не заботится о деталях приложения внутри.

Легкая Масштабируемость

Одним из преимуществ абстракции между хост-системой и контейнерами является то, что при правильной разработке приложения масштабирование может быть простым и понятным. Сервисно-ориентированный дизайн (обсуждается позже) в сочетании с контейнеризованными приложениями обеспечивает основу для легкой масштабируемости.

Разработчик может запустить несколько контейнеров на своей рабочей станции, в то время как эта система может быть масштабирована горизонтально в области подготовки или тестирования. Когда контейнеры поступают в производство, они могут снова масштабироваться.

Простое управление зависимостями и управление версиями приложений

Контейнеры позволяют разработчику объединять приложение или компонент приложения вместе со всеми его зависимостями как единое целое. Хост-система не должна заботиться о зависимостях, необходимых для запуска конкретного приложения. Пока он может запускать Docker, он должен иметь возможность запускать все контейнеры Docker.

Это упрощает управление зависимостями, а также упрощает управление версиями приложений. Хост-системы и рабочие группы больше не несут ответственности за управление потребностями приложений в зависимости, потому что, кроме зависимости от связанных контейнеров, все они должны содержаться в самом контейнере.

Чрезвычайно легкие, изолированные среды исполнения

Хотя контейнеры не обеспечивают такой же уровень изоляции и управления ресурсами, как технологии виртуализации, выигрыш от компромисса - чрезвычайно легкая среда исполнения. Контейнеры изолированы на уровне процесса, разделяя ядро ​​хоста. Это означает, что сам контейнер не включает в себя полную операционную систему, что приводит к почти мгновенному времени запуска. Разработчики могут легко запустить сотни контейнеров со своей рабочей станции без проблем.

Общий слой

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

Композиционность и предсказуемость

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

Использование Dockerfiles для повторяемых, последовательных сборок

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

Dockerfiles невероятно полезны и довольно просты в освоении. Некоторые из преимуществ, которые они предоставляют:

  • Easy versioning: сами файлы Dockerfiles можно передать в систему управления версиями, чтобы отслеживать изменения и исправлять любые ошибки.

  • Predicatability: Создание образов из файла Docker помогает устранить человеческую ошибку в процессе создания образа.

  • Accountability: если вы планируете делиться своими изображениями, часто бывает полезно предоставить Dockerfile, который создал образ, чтобы другие пользователи могли проверить этот процесс. Он в основном предоставляет историю команд шагов, предпринятых для создания изображения.

  • Flexibility: создание образов из файла Dockerfile позволяет вам переопределить значения по умолчанию, заданные для интерактивных сборок. Это означает, что вам не нужно предоставлять столько опций времени выполнения, чтобы изображение функционировало так, как задумано.

Dockerfiles - отличный инструмент для автоматизации создания образа контейнера для создания повторяющегося процесса.

Архитектура контейнерных приложений

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

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

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

  • Они не должны заботиться или полагаться на какие-либо особенности системы хоста.

  • Каждый компонент должен предоставлять согласованные API, которые потребители могут использовать для доступа к сервису.

  • Каждый сервис должен принимать сигналы от переменных среды во время начальной конфигурации

  • Данные приложения должны храниться вне контейнера на подключенных томах или в контейнерах данных

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

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

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

Использование Docker Registry для управления контейнерами

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

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

Заключение

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

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

Related