Контейнеры и виртуальные машины

Контейнеры разработаны по технологии контейнеризации и схожи с виртуальными машинами (англ. virtual machine, далее — VM), применяемыми в виртуализации.

Виртуальные машины

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

Рис. 1. Сервер без виртуализации Сервер без виртуализации

На изображённом сервере установлена одна операционная система, например Linux или Windows Server, а поверх неё работают все не изолированные друг от друга приложения. Если возникнет какая-либо проблема в одном из них, это повлияет на все остальные. Можно их изолировать, установив отдельный физический сервер для каждого конкретного приложения, но это крайне неэффективно с точки зрения финансовых расходов. В качестве решения такой задачи может выступить развёртывание виртуальной машины.

VM позволяют запускать несколько операционных систем на одном физическом сервере, а затем устанавливать в них приложения.

Рис. 2. Сервер с VM Сервер с VM

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

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

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

Гипервизор второго типа, также известный, как хостовый гипервизор, работает поверх хостовой операционной системы, например Microsoft Windows, macOS или Linux. Он продемонстрирован в нижней части рис. 2. Поверх аппаратного обеспечения находятся хостовая операционная система с гипервизором второго типа и его виртуальными машинами, установленными поверх хостовой операционной системы. Гипервизоры второго типа обычно работают на персональных устройствах.

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

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

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

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

Рис. 3. Разница между двумя типами гипервизоров Разница между двумя типами гипервизоров

Первый тип работает непосредственно на оборудовании, а второй — на хостовой операционной системе.

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

Контейнеры

Рис. 4. Базовая архитектура работы контейнеров Разница между двумя типами гипервизоров

Контейнеры — это пакеты программного обеспечения, которые содержат приложения и все зависимости (двоичные файлы и библиотеки продемонстрированы на рис. 4), необходимые для запуска содержащегося приложения. В одном контейнере можно запускать несколько приложений, хотя как правило, один контейнер означает одно приложение.

Контейнеры работают на клиент-серверных приложениях Container Engine («движок»), например Docker Engine, который является самым популярным. Он запускается в операционной системе хоста, обычно это Linux, которая работает на оборудовании.

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

Теперь несколько слов об оркестраторе контейнеров. Это программная платформа для автоматизации развёртывания, управления, масштабирования контейнеров и т. д. Например Kubernetes, самый популярный оркестратор контейнеров. У Docker также есть один, который называется Docker Swarm.

Зачем нужен оркестратор контейнеров? В небольших количествах контейнеров возможно ручное управление ими. Но крупномасштабные системы, например, с использованием микросервисов, могут потребовать тысячи контейнеров. Таким количеством контейнеров невозможно управлять вручную.

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

Отличия контейнеров от виртуальных машин

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

  • Загрузка виртуальных машин может занять несколько минут, тогда как контейнеры могут загружаться за миллисекунды. Это делает контейнеры более гибкими. Например, если один контейнер выходит из строя, другому требуется очень мало времени, чтобы взять управление на себя.
  • Виртуальные машины занимают больше дискового пространства, зачастую десятки гигабайт, тогда как контейнеры обычно занимают лишь десятки мегабайт.
  • Виртуальные машины используют больше ресурсов CPU (RAM) по сравнению с контейнерами.
  • Виртуальные машины достаточно портативны и могут перемещаться между физическими системами, на которых работает один и тот же гипервизор, а с контейнерами этот процесс происходит еще проще. Они меньше по размеру, быстрее загружаются, а некоторые контейнеры (например Docker) можно запускать практически в любом контейнерном сервисе.

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