[Перевод] Погружение в контейнеризацию
Сегодня мы познакомимся с историей возникновения технологии контейнеризации, преимуществами и выгодами ее использования, а также с тем, как она связана с виртуализацией. Статья будет полезна начинающим IT-специалистам.
Что такое контейнеризация?
Контейнеризация — это упаковка программного кода с библиотеками операционной системы и всеми зависимостями, которые необходимы для выполнения кода. В результате создается единый легкий исполняемый файл, который стабильно работает на любой инфраструктуре — контейнер. Контейнеры отличаются более высокой портативностью и ресурсоэффективностью по сравнению с виртуальными машинами. Они фактически стали вычислительными единицами современных нативных облачных приложений.
Контейнеризация позволяет разработчикам создавать и развертывать приложения быстрее и безопаснее. При использовании традиционных методов код разрабатывается в конкретной вычислительной среде. Это часто приводит к появлению багов — например, когда разработчик переносит код с компьютера на виртуальную машину или с операционной системы Linux на Windows. Контейнеризация устраняет эту проблему, объединяя код приложения с соответствующими конфигурационными файлами, библиотеками и зависимостями, необходимыми для его работы. Этот единый пакет программ или «контейнер» позволяет абстрагироваться от операционной системы хоста, а значит, становится самостоятельным и переносимым, способным работать на любой платформе или в облаке без каких-либо проблем.
Концепция контейнеризации и изоляции процессов на самом деле насчитывает несколько десятилетий. Но в 2013 году был разработан открытый движок Docker Engine, который стал отраслевым стандартом для контейнеров с простыми инструментами разработчика и универсальным подходом к упаковке. Его появление ускорило внедрение технологии контейнеризации. Сегодня организации все чаще используют контейнеризацию для создания новых приложений и модернизации существующих приложений для работы в облаке. По данным исследования IBM, 61% компаний, использующих контейнеры, сообщили об использовании контейнеров в 50% и более новых приложений, созданных ими в течение предыдущих двух лет;, а 64% компаний, использующих контейнеры, ожидают, что в течение следующих двух лет 50% и более существующих приложений будут переведены на контейнеры.
Контейнеры часто называют «легковесными». Это означает, что они совместно используют ядро операционной системы машины и не требуют дополнительных расходов на установку ОС в каждое приложение. Контейнеры имеют меньшую емкость, чем виртуальные машины, и требуют меньше времени на запуск — это позволяет запускать гораздо больше контейнеров на той же вычислительной мощности, что и одна виртуальная машина. Это повышает эффективность работы серверов и снижает затраты на их лицензирование.
И, пожалуй, самое главное — контейнеризация позволяет реализовать принцип WORA (англ. written once and run anywhere) — пишите один раз и запускаете где угодно. Такая переносимость ускоряет разработку, предотвращает привязку к поставщикам облачных решений и дает другие заметные преимущества. Например, такие как изоляция ошибок, простота управления, упрощенная безопасность и т.д.
Контейнеризация приложений
Контейнеры представляют собой единый исполняемый пакет программного обеспечения. В нем код приложения объединен со всеми связанными с ним конфигурационными файлами, библиотеками и зависимостями. Контейнерные приложения являются «изолированными», поскольку не содержат в себе копию операционной системы. Вместо этого на операционной системе хоста устанавливается среда выполнения с открытым исходным кодом (например, Docker), которая становится каналом для совместного использования операционной системы с другими контейнерами на той же вычислительной системе.
Другие уровни контейнеров, такие как общие контейнеры и библиотеки, также могут быть общими для нескольких контейнеров. Это устраняет накладные расходы на запуск операционной системы в каждом приложении и позволяет уменьшить емкость контейнеров и ускорить их запуск. Это повышает эффективность работы сервера. Если изолировать приложения в виде контейнеров, мы также снизим вероятность того, что вредоносный код, присутствующий в одном контейнере, повлияет на другие контейнеры или попадет в хост-систему.
Абстрагирование от операционной системы хоста делает контейнерные приложения переносимыми и способными единообразно и последовательно работать на любой платформе или в облаке. Контейнеры можно легко переносить с компьютера на виртуальную машину или с Linux на Windows, и они будут стабильно работать как в виртуализированных инфраструктурах, так и на традиционных физических серверах, как локальных, так и в облаке. Таким образом, разработчики программного обеспечения могут продолжать использовать наиболее удобные для себя инструменты и процессы.
Становится понятно, почему предприятия стремительно внедряют контейнеризацию как лучший подход к разработке и управлению приложениями. Контейнеризация позволяет разработчикам быстрее и надежнее создавать и развертывать приложения, будь то традиционный монолит (одноуровневое программное приложение) или модульное приложение, построенное на микросервисной архитектуре. Новые облачные приложения можно создавать с нуля в виде контейнерных микросервисов, разбивая сложное приложение на ряд небольших специализированных и управляемых сервисов. Существующие приложения можно переупаковать в контейнеры (или контейнеризированные микросервисы), которые более эффективно используют вычислительные ресурсы.
Преимущества контейнеризации
Контейнеризация дает значительные преимущества разработчикам и целым командам.
Переносимость: Контейнер создает исполняемый пакет программного обеспечения, абстрагированный от операционной системы хоста (не привязанный к ней и не зависящий от нее), а значит, переносимый и способный единообразно и последовательно работать на любой платформе или в облаке.
Гибкость: движок Docker Engine для запуска контейнеров стал отраслевым стандартом для контейнеров с простыми инструментами разработчика и универсальным подходом к упаковке, который работает как на Linux, так и на Windows. В настоящее время контейнерная экосистема перешла на движки, управляемые Open Container Initiative (OCI). Разработчики могут продолжать использовать инструменты и процессы Agile или DevOps для быстрой разработки и совершенствования приложений.
Скорость: Контейнеры часто называют «легковесными», то есть они используют ядро операционной системы компьютера и не потребляют лишние ресурсы. Это не только повышает эффективность работы сервера, но и снижает затраты на лицензирование и ускоряет время запуска, поскольку нет необходимости загружать операционную систему.
Защита от сбоев: Каждое контейнерное приложение изолировано и работает независимо от других. Отказ одного контейнера не влияет на дальнейшую работу других. Команды разработчиков могут выявлять и устранять любые технические проблемы в одном контейнере, не допуская простоя других контейнеров. Кроме того, контейнерный движок может использовать любые методы изоляции безопасности ОС (например, контроль доступа SELinux) для изоляции сбоев внутри контейнеров.
Эффективность: Программное обеспечение, работающее в контейнерных средах, использует ядро ОС машины, а уровни приложений внутри контейнера могут быть общими для всех контейнеров. Контейнеры имеют меньшую емкость, чем виртуальные машины, и требуют меньше времени на запуск, что позволяет использовать гораздо больше контейнеров на тех же вычислительных мощностях, что и одна виртуальная машина. Это повышает эффективность работы серверов, снижая затраты на их лицензирование.
Простота управления: Платформа оркестровки контейнеров позволяет автоматизировать установку, масштабирование и управление контейнерными рабочими нагрузками и сервисами. Эти платформы облегчают такие задачи управления, как масштабирование контейнерных приложений, развертывание новых версий приложений, мониторинг, логирование и отладка, а также другие функции. Kubernetes — пожалуй, самая популярная система оркестровки контейнеров — представляет собой технологию с открытым исходным кодом, которая изначально автоматизирует функции контейнеров Linux. Kubernetes работает со многими контейнерными движками, такими как Docker, а также с любыми контейнерными системами, которые соответствуют стандартам Open Container Initiative (OCI) для форматов образов контейнеров и рантайма.
Безопасность: Изоляция приложений в виде контейнеров предотвращает проникновение вредоносного кода в другие контейнеры или хост-систему. Кроме того, можно определить настройки безопасности, чтобы автоматически блокировать проникновение нежелательных компонентов в контейнеры или ограничить взаимодействие с ненужными ресурсами.
Виды контейнеров
Стремительный рост интереса к контейнерным решениям и их использование привели к необходимости разработки стандартов в области контейнерных технологий и подхода к упаковке программного кода. Инициатива Open Container Initiative (OCI), созданная в июне 2015 года компанией Docker и другими лидерами отрасли, способствует распространению общих, минимальных, открытых стандартов и спецификаций в области контейнерных технологий. Благодаря этому OCI способствует расширению возможностей выбора движков с открытым исходным кодом. Пользователи не будут привязаны к технологиям конкретного производителя, а смогут воспользоваться преимуществами сертифицированных OCI технологий, которые позволят им создавать контейнерные приложения с использованием разнообразных инструментов DevOps и последовательно запускать их на выбранной ими инфраструктуре.
Сегодня Docker является одной из наиболее известных и широко используемых технологий контейнерных движков. Но это не единственный доступный вариант. Экосистема стандартизирует containerd и другие альтернативы, такие как CoreOS rkt, Mesos Containerizer, LXC Linux Containers, OpenVZ и crio-d. Функции и настройки по умолчанию могут различаться, но принятие и использование спецификаций OCI по мере их развития позволит обеспечить нейтральность решений по отношению к производителям, их сертифицированность для работы на различных ОС и возможность использования в различных средах.
Контейнеризация и микросервисы
Компании-разработчики используют микросервисы как более эффективный подход к разработке и управлению приложениями по сравнению с прежней монолитной моделью, которая объединяет программное приложение с пользовательским интерфейсом и базой данных в единое целое на одной серверной платформе. В микросервисах сложное приложение разбивается на ряд более мелких специализированных сервисов, каждый из которых имеет собственную базу данных и бизнес-логику. Микросервисы взаимодействуют друг с другом через общие интерфейсы (например, API) и REST-интерфейсы (например, HTTP). Благодаря использованию микросервисов команды разработчиков могут сосредоточиться на обновлении отдельных областей приложения, не затрагивая его в целом, что ускоряет разработку, тестирование и развертывание.
Концепции микросервисов и контейнеризации схожи — они обе представляют собой методы разработки программного обеспечения, которые по сути превращают приложения в наборы небольших сервисов или компонентов, которые являются переносимыми, масштабируемыми, эффективными и более простыми в управлении.
Более того, микросервисы и контейнеризация хорошо работают вместе. Контейнеры обеспечивают легкую инкапсуляцию любого приложения, будь то традиционный монолит или модульный микросервис. Микросервис, разработанный в контейнере, получает все преимущества, присущие контейнеризации:
портативность процесса разработки и совместимость с производителями (отсутствие привязки к производителю),
гибкость разработчика,
изоляцию от сбоев,
эффективность сервера,
автоматизацию установки, масштабирования и управления,
уровни безопасности и т.д.
Современные коммуникации стремительно переходят в облако, где пользователи могут быстро и эффективно разрабатывать приложения. Доступ к облачным приложениям и данным возможен с любого устройства, подключенного к интернету, что позволяет сотрудникам работать удаленно и без отрыва от производства. Поставщики облачных услуг (CSP) управляют базовой инфраструктурой. Это позволяет организациям экономить на стоимости серверов и другого оборудования, а также обеспечивает автоматическое резервное копирование сети для дополнительной надежности. Облачные инфраструктуры масштабируются по требованию и могут динамически регулировать вычислительные ресурсы, мощность и инфраструктуру по мере изменения нагрузки. Кроме того, CSP регулярно обновляют предложения, предоставляя пользователям постоянный доступ к новейшим технологиям.
Контейнеры, микросервисы и облачные вычисления в совокупности позволяют вывести разработку и доставку приложений на новый уровень — ранее недостижимый при использовании традиционных методологий и сред. Эти подходы нового поколения повышают гибкость, эффективность, надежность и безопасность жизненного цикла разработки, что приводит к ускорению доставки приложений и улучшений конечным пользователям и на рынок.
Безопасность
Контейнерные приложения обладают определенным уровнем безопасности, поскольку они могут выполняться как изолированные процессы и работать независимо от других контейнеров. Такая изоляция позволяет предотвратить воздействие вредоносного кода на другие контейнеры или вторжение в хост-систему. Однако прикладные уровни внутри контейнера часто являются общими для всех контейнеров. С точки зрения эффективности использования ресурсов это является плюсом, но в то же время открывает возможности для вмешательства в работу контейнеров и нарушения их безопасности. То же самое можно сказать и об общей операционной системе, поскольку несколько контейнеров могут быть связаны с одной и той же операционной системой хоста. Угрозы безопасности общей операционной системы могут повлиять на все связанные с ней контейнеры, и, наоборот, нарушение безопасности контейнера может привести к проникновению в операционную систему хоста.
Но как быть с самим образом контейнера? Как приложения и компоненты с открытым исходным кодом, упакованные в контейнер, могут повысить уровень безопасности? Поставщики контейнерных технологий, такие как Docker, продолжают активно решать проблемы безопасности контейнеров. Контейнеризация использует подход «secure-by-default», считая, что безопасность должна быть присуща платформе, а не отдельно развертываемому и настраиваемому решению. С этой целью контейнерный движок поддерживает все свойства изоляции по умолчанию, присущие базовой операционной системе. Можно определить разрешения безопасности, чтобы автоматически блокировать доступ нежелательных компонентов в контейнеры или ограничить взаимодействие с ненужными ресурсами.
Например, Linux Namespaces позволяет обеспечить изолированное представление системы для каждого контейнера, включая:
сетевое взаимодействие,
точки монтирования,
идентификаторы процессов, идентификаторы пользователей,
межпроцессное взаимодействие и
настройки имени хоста.
Namespaces можно использовать для ограничения доступа к любым из этих ресурсов через процессы внутри каждого контейнера. Как правило, подсистемы, не имеющие поддержки Namespace, недоступны из контейнера. Администраторы могут легко создавать и управлять этими «ограничениями изоляции» для каждого контейнеризованного приложения с помощью простого пользовательского интерфейса.
Исследователи работают над дальнейшим укреплением безопасности контейнеров Linux, и в настоящее время существует широкий спектр решений для автоматизации обнаружения угроз и реагирования на них в масштабах предприятия, мониторинга и обеспечения соответствия отраслевым стандартам и политикам безопасности, обеспечения безопасного потока данных через приложения и конечные точки и многое другое.
Прочитать о стратегии масштабирования контейнерной безопасности в организациях любого размера можно в этой статье.
Виртуализация vs. контейнеризация
Контейнеры часто сравнивают с виртуальными машинами, поскольку обе технологии позволяют значительно повысить эффективность вычислений за счет возможности запуска нескольких типов программного обеспечения (на базе Linux или Windows) в одной среде. Однако контейнерная технология, как показывает практика, дает значительные преимущества по сравнению с виртуализацией и чаще всего становится наиболее предпочтительной для ИТ-специалистов.
Технология виртуализации позволяет одновременно запускать несколько операционных систем и программных приложений и совместно использовать ресурсы одного физического компьютера. Например, ИТ-организация может запускать на одном сервере как Windows, так и Linux или несколько версий операционной системы, а также несколько приложений. Каждое приложение и связанные с ним файлы, библиотеки и зависимости, включая копию операционной системы, упаковываются в виртуальную машину. Использование нескольких виртуальных машин на одной физической машине позволяет добиться значительной экономи эксплуатационных и энергетических затрат.
С другой стороны, контейнеризация позволяет использовать вычислительные ресурсы еще более эффективно. Контейнер создает единый исполняемый пакет, который объединяет код приложения со всеми сопутствующими конфигурационными файлами, библиотеками и зависимостями, необходимыми для его работы. Однако, в отличие от виртуальных машин, контейнеры не содержат копию операционной системы. Вместо этого на ОС хост-системы устанавливается среда выполнения контейнера, который становится каналом, через который все контейнеры на вычислительной системе используют одну и ту же ОС.
Как мы уже сказали ранее, контейнеры часто называют «легковесными» — они совместно используют ядро ОС машины и не требуют накладных расходов на ассоциацию ОС с каждым приложением (как в случае с ВМ). Другие уровни контейнеров (общие контейнеры и библиотеки) также могут быть общими для нескольких контейнеров, что делает контейнеры по своей сути менее емкими, чем виртуальные машины, и более быстрыми в запуске. При этом несколько контейнеров могут работать на тех же вычислительных мощностях, что и одна виртуальная машина, что еще больше повышает эффективность работы сервера и снижает затраты на серверы и лицензирование.
Напоследок приглашаем всех желающих на открытый урок, на котором поближе познакомимся с Docker. Узнать подробнее и записаться можно на странице курса Administrator Linux.