По меткому выражению специалистов из IBM, контейнеризация «позволяет писать приложения один раз и запускать их где угодно».

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

В статье, написанной совместно с экспертами из компании Git in Sky, расскажем о том, как контейнерные технологии устраняют эту проблему.

Что такое контейнер и чем эта технология удобна для разработчиков приложений

Контейнер приложения — экземпляр исполняемого программного обеспечения (ПО), который объединяет двоичный код приложения вместе со всеми связанными файлами конфигурации, библиотеками, зависимостями и средой выполнения.

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

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

Контейнеры — небольшие, быстрые и портативные, потому что могут не включать в себя гостевую операционную систему (ОС), а используют функции и ресурсы основной ОС. Контейнеры используют не только для изоляции различных программных процессов, но и для контроля ресурсов, за которые эти процессы могут конкурировать. Это, например, объем памяти или ресурсы процессора.

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

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

Например, на сервере с Ubuntu Linux запущены контейнеры с приложениями, которым требуется Alpine Linux, а также другие контейнеры с приложениями, которым необходима определенная версия Debian.

Чтобы лучше понять, чем хороши контейнеры, стоит сравнить их с виртуальными машинами.

В чем разница между контейнерами и виртуальными машинами

  1. Виртуальные машины — абстракция на уровне физического оборудования, превращает один сервер в несколько

    На каждой виртуальной машине (ВМ) отдельная гостевая операционная система работает поверх операционной системы хоста с виртуализированным доступом к базовому оборудованию.

    Виртуальные машины с разными ОС могут работать на одном физическом сервере: ВМ UNIX может работать вместе с ВМ Linux и так далее. Микроядро и система виртуализации, которые создают и запускают виртуальные машины, называются гипервизорами или мониторами ВМ. Это то, что находится между оборудованием и ВМ и необходимо для виртуализации сервера, а также для изоляции операционных систем друг от друга.

  2. Контейнеры — абстракция на уровне приложения, объединяет код и зависимости

    Контейнеры устанавливаются поверх физического сервера и его ОС, например Linux или Windows. Каждый контейнер отделяет свое содержимое от операционной системы. Контейнеры «легкие» — весят всего мегабайты и запускаются за секунды, ведь они берут лишь небольшую часть памяти при совместном использовании ОС.



    Источник

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

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

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

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

  1. Решается проблема зависимостей в разных окружениях. Отлаженное на одном компьютере приложение можно легко развернуть на другом, ведь контейнер содержит все необходимые зависимости. В этом случае говорят о переносимости, гибкости контейнеров.
  2. Появляется возможность использовать микросервисные архитектуры. Контейнеры хорошо подходят для приложений на основе микросервисов: можно проверить работоспособность каждого контейнера, ограничить каждую службу определенными ресурсами, запускать и останавливать их независимо друг от друга.
  3. Можно заметно сократить время разработки приложения. Некоторые технологии, например кеширование слоев сборки, способствуют ускорению циклов разработки и тестирования.
  4. Снижение накладных расходов. Контейнеры совместно используют системное ядро операционной системы сервера, следовательно, запуск контейнера не требует запуска отдельного экземпляра ОС для каждого приложения. Это повышает эффективность сервера и снижает затраты на сервер и лицензирование.
  5. Легковесность и портативность благодаря тому, что каждый контейнер не содержит образ ОС.
  6. Эффективность. Контейнеры позволяют быстрее развертывать приложения, легче масштабировать их горизонтально, проще находить в них ошибки.
  7. Изоляция ошибок. Выход из строя одного контейнера не влияет на дальнейшую работу других контейнеров.

Безопасность контейнеров

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

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

  1. Добиться изолированности процессов с помощью принципа «каждый контейнер — для решения только одной задачи», его еще формулируют как «одно приложение — один контейнер».
  2. Не загружать готовые к использованию контейнеры из ненадежных источников, а в особых случаях использовать исключительно собственные непубличные репозитории с контейнерами (Container Registry), которые интегрируются в CI/CD-среды.
  3. Использовать внутренние функции сервиса контейнеризации по поиску уязвимостей во всем вспомогательном ПО — такое тестирование тоже легко автоматизируется в CI/CD-средах и позволяет исключить развертывание уязвимых контейнеров в продакшене.

Как управляют контейнерами: системы оркестрации

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

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

Также Kubernetes, как и некоторые другие платформы оркестровки контейнеров, предоставляет дополнительные возможности. Например, автоматическое масштабирование инфраструктуры. Автомасштабирование позволяет добавлять и отключать контейнеры с учетом нагрузки на приложение и сохранять стабильность его работы. Например, в крупном ритейле благодаря автоскейлингу в «черную пятницу» сервисы не лежат, а приложения не вылетают.

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

Для чего подходит и не подходит контейнеризация

Контейнеризация не подходит: если для работы приложения требуется другая ОС, а не та, что установлена на сервере.

Контейнеризация подходит:

  • для упрощения процесса развертывания и сопровождения приложений;
  • для запуска небезопасного или непроверенного кода с целью тестирования или отладки — для этого контейнеры подходят в 99% случаев;
  • для запуска приложений, требующих другого дистрибутива ОС (системные контейнеры);
  • для передачи отдельных компонентов приложения между членами команды в ходе цикла «разработка — тестирование — внедрение» и быстрого внесения изменений;
  • для микросервисов, которые можно разрабатывать и обновлять независимо;
  • для горизонтально масштабируемых приложений — когда запускается несколько одинаковых контейнеров на текущих ресурсах без увеличения стоимости этих ресурсов. В отличие от вертикального масштабирования, где увеличение количества ядер CPU, объемов RAM, размера HDD на сервере стоит денег;
  • для модернизации и миграции существующих приложений в более современные среды.

Контейнеризация сегодня — популярный подход к разработке приложений и управлению ими. Исследовательская компания Gartner прогнозировала, что к 2020 году 50% компаний будут использовать контейнерные технологии.

Но уже в 2017 году по результатам опроса IBM выяснилось, что внедрение технологии происходит еще быстрее, и уже 59% компаний улучшили качество приложений и сократили количество ошибок с помощью контейнеризации. По самым свежим прогнозам от Gartner, к 2023 году 70% международных компаний будут использовать более двух контейнерных приложений.