Что такое контейнер? Обзор технологии контейнеризации

1 Ноября 2017

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

Все компоненты, необходимые для запуска приложения, упаковываются как один образ и могут быть использованы повторно. Приложение в контейнере работает в изолированной среде и не использует память, процессор или диск хостовой операционной системы. Это гарантирует изолированность процессов внутри контейнера.os-virtualization-3dc0f783ebbd0da25183f5af863e1c2b.jpg

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

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

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

windows-server-virtual-machines-vs-containers.png

Какие проблемы решаются контейнерами?

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

Преимущества контейнеров

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

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

Управление версиями позволяет отслеживать версии контейнера, следить за различиями между ними и т. д.

Переносимость среды вычислений. Контейнеры инкапсулируют все соответствующие детали, такие как зависимости приложений и операционные системы, необходимые для запуска приложения. Это облегчает переносимость образа контейнера из одной среды в другую. Например, один и тот же образ можно использовать для работы в среде Windows/Linux или dev/test/stage.

Стандартизация. Большинство контейнеров основаны на открытых стандартах и ​​могут работать во всех основных дистрибутивах Linux, Microsoft и т. д.

Безопасность. Контейнеры изолируют процессы одного контейнера от другого и от базовой инфраструктуры. Таким образом, любое обновление или изменение в одном контейнере не влияет на другой контейнер.

Недостатки контейнеров

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

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

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

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

Классификация контейнеров

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

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

Для создания контейнеров ОС мы можем использовать такие контейнерные технологии, как LXC, OpenVZ, Linux VServer, BSD Jails и Solaris.

os-vs-app-containers-a3f09c304838c7687273371874f61.jpg

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

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

Контейнерные технологии, такие как Docker и Rocket, являются примерами контейнеров для приложений.

Хотите сравнить виртуальные машины и контейнеры на практике? Воспользуйтесь бесплатным тестовым доступом к облаку Cloud4Y.

Источник: https://dzone.com/articles/container-technologies-overview