в чем разница между виртуальной машиной и контейнерной виртуализацией
Сравнение контейнеров и виртуальных машин
Узнайте о различиях между контейнерами и виртуальными машинами (ВМ), их популярных поставщиках и способах их совместного применения.
Контейнеры и виртуальные машины — очень похожие между собой технологии виртуализации ресурсов. Виртуализация — это процесс, при котором единичный системный ресурс, такой как оперативная память, ЦП, диск или сеть, может быть «виртуализирован» и представлен в виде множества ресурсов. Основное отличие контейнеров и виртуальных машин заключается в том, что виртуальные машины виртуализируют весь компьютер вплоть до аппаратных уровней, а контейнеры — только программные уровни выше уровня операционной системы.
Что такое контейнер?
Контейнеры — это легкие программные пакеты, содержащие все зависимости, необходимые для запуска автономного программного приложения. К этим зависимостям относятся системные библиотеки, сторонние пакеты кода и другие приложения уровня операционной системы. Зависимости, входящие в контейнер, находятся на уровнях стека выше уровня операционной системы.
Плюсы
Минусы
Популярные поставщики контейнеров
Что такое виртуальная машина?
ВМ — это тяжелые программные пакеты, которые обеспечивают полную эмуляцию низкоуровневых аппаратных устройств, таких как ЦП, дисковые и сетевые устройства. ВМ также могут включать дополнительный программный стек для запуска на эмулируемых аппаратных средствах. Эти аппаратные и программные пакеты позволяют получить полнофункциональный снимок вычислительной системы.
Плюсы
Минусы
Популярные поставщики виртуальных машин
Какой вариант подходит для вас?
Если вы выставляете определенные требования к оборудованию для вашего проекта или ведете разработку на одной аппаратной платформе, но целевой является другая платформа, например Windows или macOS, используйте виртуальную машину. Большинство других требований, предъявляемых только к программному обеспечению, можно удовлетворить с помощью контейнеров.
Как использовать контейнеры в связке с виртуальными машинами?
Ничто не мешает использовать контейнеры и виртуальные машины вместе, хотя практические примеры такого использования могут быть ограничены. Можно создать виртуальную машину, которая эмулировала бы уникальную аппаратную конфигурацию. Затем на оборудовании этой виртуальной машины можно установить операционную систему. После того как виртуальная машина будет готова и способна загружать операционную систему, поверх нее можно установить контейнерную среду выполнения. В результате получится функциональная вычислительная система с эмулированным оборудованием, на котором можно устанавливать контейнеры.
Одним из практических примеров использования такой конфигурации являются эксперименты с развертыванием в системах на микросхеме. Популярные вычислительные устройства с системой на микросхеме, такие как Raspberry Pi или макетные платы BeagleBone, можно эмулировать как виртуальные машины, чтобы экспериментировать с запуском на них контейнеров до тестирования на реальном аппаратном обеспечении.
Но в большинстве случаев для конкретной виртуализации достаточно использовать что-то одно: ВМ или контейнеры. Чтобы сделать правильный выбор, важно понимать потребности в ресурсах и то, на какие компромиссы вы готовы пойти.
Контейнеры и виртуальные машины
Область применения: Windows Server 2022, Windows Server 2019, Windows Server 2016
В этом разделе обсуждаются некоторые ключевые сходства и различия между контейнерами и виртуальными машинами (ВМ), а также ситуации, когда может потребоваться каждый из них. Контейнеры и ВМ имеют свои преимущества: на самом деле многие среды контейнеров используют ВМ в качестве операционной системы сервера, а не работают непосредственно на оборудовании, в частности при работе с контейнерами в облаке.
Общие сведения о контейнерах см. в разделе Windows и контейнеры.
Архитектура контейнера
Контейнер — это изолированный, нетребовательный к ресурсам приемник команд, предназначенный для запуска приложения в операционной системе сервера. Контейнеры реализуются поверх ядра операционной системы узла (которое можно считать своеобразным фундаментом операционной системы) и содержат только приложения и некоторые API-интерфейсы и службы операционной системы, работающие в пользовательском режиме, как показано на этой схеме.
Архитектура виртуальной машины
В отличие от контейнеров, виртуальные машины работают под управлением полноценной операционной системы с собственным ядром, как показано на этой схеме.
Контейнеры и виртуальные машины
В таблице ниже показаны некоторые сходства и различия этих взаимно дополняющих технологий.
Контейнеры и виртуальные машины: В чем ключевые различия?
Виртуализация изменила облик современных вычислений благодаря повышению эффективности использования ресурсов, отделению приложений от базового оборудования и повышению мобильности и защиты рабочих нагрузок. Но гипервизоры и виртуальные машины — это лишь один из подходов к развертыванию виртуальных рабочих нагрузок. Виртуализация контейнеров стала эффективной и надежной альтернативой традиционной виртуализации, предоставляя новые возможности и новые проблемы для специалистов центров обработки данных.
Разница между контейнерами и виртуальными машинами заключается в основном в расположении слоя виртуализации и способе использования ресурсов ОС. Контейнеры и виртуальные машины — это просто разные способы предоставления и использования вычислительных ресурсов — процессоров, памяти и ввода-вывода — которые уже присутствуют в физическом компьютере. Хотя цель виртуализации, по сути, та же, что и у контейнеров, подход существенно отличается, и каждый подход предлагает уникальные характеристики и компромиссы для корпоративных рабочих нагрузок.
Что такое виртуальные машины?
Виртуальные машины полагаются на гипервизор, который представляет собой программный слой, установленный поверх аппаратного обеспечения системы. Такие гипервизоры называются гипервизорами типа 1. Гипервизоры первого типа, такие как VMware vSphere ESXi и Microsoft Hyper-V, воспринимаются как самостоятельные ОС. После установки уровня гипервизора администраторы могут создавать экземпляры виртуальных машин из доступных вычислительных ресурсов системы. Затем каждая ВМ может получить свою уникальную ОС и рабочую нагрузку. Таким образом, ВМ полностью изолированы друг от друга — ни одна ВМ не знает о присутствии другой ВМ в той же системе и не полагается на нее, а вредоносное ПО, сбои приложений и другие проблемы влияют только на эту ВМ. Администраторы могут переносить виртуальные машины из одной виртуализированной системы в другую, не обращая внимания на аппаратное обеспечение или ОС системы.
В системе может быть создано множество виртуальных машин. Часто первой ВМ является хост-ВМ, используемая для рабочих нагрузок управления системой, таких как Microsoft System Center. Последующие ВМ содержат другие рабочие нагрузки предприятия, такие как база данных, ERP, CRM, сервер электронной почты, медиа-сервер, веб-сервер или другие бизнес-приложения. ВМ отличаются несколькими общими чертами или характеристиками:
Преимущества виртуальных машин
За последние 20 лет виртуальные машины стали стандартом де-факто для корпоративной виртуализации, и они дают бизнесу множество преимуществ, включая:
Недостатки виртуальных машин
Несмотря на значительные преимущества, виртуальные машины также имеют ряд недостатков:
Что такое контейнеры?
Виртуализированная контейнерная среда устроена по-другому. При использовании контейнеров сначала на систему устанавливается ОС хоста, например Linux, а затем поверх нее устанавливается слой контейнеров — как правило, менеджер контейнеров, например Docker. Менеджер контейнеров, по сути, обеспечивает функцию гипервизора для контейнеров. Этот подход практически идентичен гипервизорам типа 2.
После установки слоя для контейнеров администраторы могут создавать экземпляры контейнеров из доступных вычислительных ресурсов системы и развертывать компоненты корпоративных приложений в контейнерах. Однако каждое контейнерное приложение использует одну и ту же базовую ОС: единую ОС хоста. Хотя слой контейнеров обеспечивает уровень логической изоляции между контейнерами, общая ОС может представлять собой единую точку отказа для всех контейнеров в системе. Как и в случае с ВМ, контейнеры также легко переносятся между физическими системами при наличии подходящей ОС и среды контейнерного уровня.
Преимущества контейнеров
Контейнеры обладают своими уникальными свойствами и характеристиками:
Недостатки контейнеров
Контейнеры обеспечили огромную масштабируемость и гибкость для корпоративных организаций, но есть и несколько недостатков:
Сравнение контейнеров и виртуальных машин
Контейнеры и виртуальные машины обладают уникальными характеристиками, но при выборе технологии виртуализации необходимо учитывать множество аспектов. В следующем списке приведены некоторые из наиболее распространенных сравнений:
Контейнеры в сравнении с виртуальными машинами: Вопросы безопасности
Не секрет, что безопасность рабочих нагрузок и данных является критически важным вопросом практически для каждого предприятия. Простое поддержание работоспособности рабочей нагрузки часто является вопросом непрерывности бизнеса и соблюдения корпоративных норм. А постоянно присутствующая угроза хакеров, вредоносных программ, вторжений и других злонамеренных действий делает жизненно важным выбор защищенных сред для корпоративных приложений, как для предотвращения, так и для локализации любых недостатков безопасности или проблем, которые могут возникнуть.
ВМ обычно считаются наиболее безопасной и устойчивой платформой для рабочих нагрузок. Технологии гипервизоров хорошо отработаны, а логическая изоляция, которую гипервизоры обеспечивают между ВМ, гарантирует, что каждая ВМ существует как отдельный логический сервер со своей ОС и драйверами. Однако все элементы, работающие в ВМ и вокруг нее — ОС, приложения, драйверы, авторизация и аутентификация, а также сетевой трафик — подвержены недостаткам безопасности, которые необходимо постоянно устранять, как и в любом традиционном физическом развертывании. Когда для обеспечения безопасности требуется наивысший уровень изоляции, виртуальные машины, как правило, имеют преимущество.
Контейнеры являются гибкими и быстрыми, но все контейнеры работают на базе общей ОС. Технически это нормально, но любые ошибки или недостатки в системе безопасности ОС могут потенциально подвергнуть опасности все контейнеры, работающие на общем ядре ОС. Базовое ядро ОС представляет собой единую точку уязвимости. Как минимум, системы, используемые для контейнеров, обычно используют надежную и проверенную ОС. Администраторы применяют обновления и исправления безопасности ОС только после тщательного тестирования и проверки. Для защиты сервера обычно применяются такие тактики безопасности, как обнаружение и предотвращение вторжений. Безопасность может быть усилена путем запуска групп контейнеров в виртуальных машинах, сочетая преимущества контейнеров с повышенной изоляцией виртуальных машин.
VM или Docker?
Как понять, что вам нужен Docker, а не VM? Давайте попытаемся разобраться в основных отличиях изоляции виртуальных машин (VM) и Docker-контейнеров, могут ли они быть взаимозаменяемы и как мы можем их использовать.
Так в чём же отличие Docker-контейнеров от VM?
Виртуальная машина (VM) — это виртуальный компьютер со всеми виртуальными устройствами и виртуальным жёстким диском, на который и устанавливается новая независимая ОС (гостевая ОС) вместе с виртуальными драйверами устройств, управлением памятью и другими компонентами. Т. е. мы получаем абстракцию физического оборудования, позволяющую запускать на одном компьютере множество виртуальных компьютеров. Виртуальное оборудование отображается в свойствах системы, а установленные приложения взаимодействуют с ним как с настоящим. При этом сама виртуальная машина полностью изолирована от реального компьютера, хотя и может иметь доступ к его диску и периферийным устройствам.
Установленная VM может по-разному занимать место на диске компьютера:
При использовании VM появляются дополнительные расходы на эмуляцию виртуального оборудования и запуск гостевой ОС, поддержка и администрирование необходимого окружения для работы вашего приложения. Также при разворачивании большого количества виртуальных машин на сервере объем занимаемого ими места на жёстком диске будет только расти, т.к. для каждой VM требуется место, как минимум, для гостевой ОС и драйверов для виртуальных устройств.
Docker — это ПО для создания приложений на основе контейнеров. Контейнеры и виртуальные машины решают одну задачу, но делают это по-разному. Контейнеры занимают меньше места, т.к. переиспользуют большее количество общих ресурсов хост-системы чем VM, т.к. в отличие от VM, обеспечивает виртуализацию на уровне ОС, а не аппаратного обеспечение. Такой подход обеспечивает меньший объем занимаемого места на жёстком диске, быстрое развертывание и более простое масштабирование.
Docker-контейнер даёт более эффективный механизм инкапсуляции приложений, обеспечивая необходимые интерфейсы хост-системы. Данная возможность позволяет контейнерам разделить ядро системы, где каждый из контейнеров работает как отдельный процесс основной ОС, у которого есть своё собственное виртуальное адресное пространство, таким образом данные, принадлежащие разным областям памяти, не могут быть изменены.
Docker наиболее распространенная технология использования контейнеров в работе приложения. Он стал стандартом в этой области, строясь на основе cgroups и пространстве имён, которые обеспечивает ядро Linux. Нативной ОС для Docker является Linux, поэтому запуск Docker-контейнеров на Windows будет происходить внутри виртуальной машины с ОС Linux.
Из чего создаётся контейнер?
Образ — основной элемент, из которого создаются контейнеры. Образ создаётся из Dockerfile, добавленного в проект и представляет собой набор файловых систем (слоёв) наслоённых друг на друга и сгруппированных вместе, доступных только для чтения; максимальное число слоёв равно 127.
В основе каждого образа находится базовый образ, который указывается командой FROM — входная точка при формировании образа Dockerfile. Каждый слой является readonly-слоем и представлен одной командой, модифицирующей файловую систему, записанной в Dockerfile. Данный подход позволяют разным файлам и директориям из разных файловых слоёв прозрачно накладываться, создавая каскадно-объединённую файловую систему. Слои содержат метаданные, позволяющие сохранять сопутствующую информацию о каждом слое во время выполнения и сборки. Каждый слой содержит ссылку на следующий слой, если слой не имеет ссылки, значит это самый верхний слой в образе.
Начиная с версии Docker EE 17.06.02-ee5 и в Docker Engine — Community используется Overlay2 или Overlay, в более ранних версиях используется AuFS (Advanced multi layered Union file system).
Контейнер — как это работает?
Контейнер — это абстракция на уровне приложения, объединяющая код и зависимости. Контейнеры всегда создаются из образов, добавляя доступный для записи верхний слой и инициализирует различные параметры. Т. к. контейнер имеет свой собственный слой для записи и все изменения сохраняются в этом слое, несколько контейнеров могут совместно использовать доступ к одному и тому же образу. Каждый контейнер можно настроить через файл в проекте docker-compose.yml, задавая различные параметры, такие как имя контейнера, порты, идентификаторы, зависимости между другими контейнерами. Если в настройках не задавать имя контейнера, то Docker каждый раз будет создавать новый контейнер, присваивая ему имя случайным образом.
Когда контейнер запускается из образа, Docker монтирует файловую систему для чтения и записи поверх любых слоев ниже. Именно здесь будут выполняться все процессы. При первом запуске контейнера начальный слой чтения-записи пуст. Когда происходят изменения, они применяются к этому слою; например, если вы хотите изменить файл, этот файл будет скопирован из нижнего слоя только для чтения в слой для чтения и записи. Версия файла, доступная только для чтения, все еще будет существовать, но теперь она скрыта под копией.
Как работает каскадно-объединённая файловая система?
Каскадно-объединённая файловая система (ФС) реализует механизм копирования при записи (Copy-On-Write, COW). Рабочей единицей является слой, каждый слой следует рассматривать как отдельную полноценную файловую систему с иерархией директорий от самого корня. Данный подход использует объединенное монтирование файловых систем, позволяя, прозрачно для пользователя, объединять файлы и каталоги различных файловых систем (называемых ветвями) в единую связанную файловую систему. Содержимое каталогов с одинаковыми путями будет отображаться вместе в одном объединенном каталоге (в едином пространстве имён) полученной файловой системы.
Объединение слоёв происходит по следующим принципам:
Вывод
При необходимости виртуализации системы с гарантированно выделенными ресурсами и виртуальным аппаратным обеспечение, стоит выбрать VM. Что даёт использование VM:
Если вы хотите изолировать работающие приложения как отдельные процессы, вам подойдёт Docker. Что даёт использование Docker:
Контейнеры или виртуальные машины — что лучше выбрать для своей компании?
Вопрос несколько сложнее, чем «куда поместится больше приложений»
Назовите любую технологичную компанию, и можно будет с уверенностью сказать, что она тоже инвестирует в контейнеры. Google — конечно. IBM — да. Microsoft — безусловно. Но тот факт, что контейнеры сейчас невероятно популярны, еще не делает виртуальные машины устаревшими. Ведь это вовсе не так.
Да, контейнеры позволяют уместить гораздо больше приложений на одном физическом сервере, чем любая виртуальная машина. Технологии контейнеризации вроде Docker в этом плане легко кладут на лопатки VM.
Виртуальные машины занимают много системных ресурсов. Каждая из них содержит не только операционную систему, но и необходимое для работы виртуальное оборудование. А это сразу отнимает довольно много оперативной памяти и процессорных циклов. С контейнером ситуация совсем другая — в нем можно разместить только приложение и необходимый минимум системных библиотек для исполнения; на это уйдет минимум ресурсов.
На практике это означает, что при использовании контейнеров вы сможете разместить в два-три раза больше приложений на одном сервере. Кроме того, контейнеризация позволяет создавать портативное и целостное окружение для разработки, тестирования и последующего развертывания.
Если бы наше сравнение на этом заканчивалось, впору было бы писать некролог для классической виртуализации. Но вопрос все же несколько сложнее и шире, чем «куда поместится больше приложений».
Проблема контейнеров № 1: безопасность
Это самая серьезная проблема, которая, однако, часто упускается из виду. Дэниэл Уолш, инженер по безопасности из Red Hat, опубликовал статью «Пустые контейнеры». Там рассматривается Docker, который использует libcontainers в качестве основы. Libcontainers взаимодействует с пятью пространствами — Process, Network, Mount, Hostname, Shared Memory — при работе с Linux. При этом есть множество важных подсистем ядра Linux вне контейнера.
К ним относятся все устройства, SELinux, Cgroups и вся файловая система внутри /sys. Это значит, что при наличии у пользователя или приложения прав суперпользователя в контейнере операционная система может быть взломана. И это плохо.
Есть много способов обезопасить Docker и другие технологии контейнеризации. Например, можно смонтировать /sys только для чтения, заставить процессы контейнеров работать с определенными разделами файловой системы и настроить сеть так, чтобы можно было подключаться лишь к определенным внутренним сегментам. Но ничего из этого по умолчанию не сделано, и вам придется дополнительно озаботиться этими вопросами.
В качестве базового правила можно порекомендовать относиться к контейнерам так же, как вы относитесь к любому серверному приложению. Вот что советует Уолш:
Другая проблема состоит в том, что контейнеризованные приложения выпускает кто угодно. И среди разработчиков всегда найдутся «плохие парни». Если, к примеру, вы или ваши сотрудники достаточно ленивы, чтобы запустить на сервере первый попавшийся контейнер, то вполне можете получить трояна. Важно донести до сотрудников мысль, что нельзя просто скачивать любые приложения из Интернета так же, как они это делают на своих смартфонах.
Вообще, на смартфоны тоже не стоит ставить что попало, но это уже совсем другая история.
Прочие проблемы контейнеров
Получается, если решить вопросы безопасности, то контейнеры будут отличным выбором? Не совсем. Стоит задуматься и о других аспектах.
Роб Хиршфельд, генеральный директор RackN, отметил следующее: «Идея «изолированной коробки» помогает решить часть проблем с нижестоящими системами (вы знаете, что у вас там есть), но никак не с вышестоящими (вы не знаете, от чего зависите)».
Разделение системы на множество более мелких отдельных частей — хорошая идея. Но это означает и то, что управлять придется ЕЩЕ БОЛЬШИМ числом элементов. Всегда существует некая переломная точка между декомпозицией и неконтролируемым разрастанием.
Роб Хиршфельд, генеральный директор RackN
Тут я хотел бы добавить, что это не только проблема безопасности, но и проблема обеспечения качества. Можно сказать, что X контейнеров в состоянии поддерживать веб-сервер NGINX, но достаточно ли вам этого? Включен ли в такое решение заодно и обновленный балансировщик TCP? Развернуть приложение в контейнере довольно легко, но если ошибиться с выбором компонентов, то вы просто потратите время впустую.
Хиршфельд также указывает на серьезность проблемы разрастания числа контейнеров. Стоит помнить о том, что «Разделение системы на множество более мелких отдельных частей — хорошая идея. Но это означает и то, что управлять придется ЕЩЕ БОЛЬШИМ числом элементов. Всегда существует некая переломная точка между декомпозицией и неконтролируемым разрастанием».
Помните: вся суть контейнера заключается в запуске одного изолированного приложения. Чем больше задач вы назначаете на контейнер, тем выше вероятность того, что их стоило решать с помощью виртуальных машин.
Верно, некоторые технологии контейнеризации вроде Linux Containers (LXC) могут использоваться вместо VM. К примеру, LXC можно использовать для запуска определенных приложений Red Hat Enterprise Linux (RHEL) 6 на экземпляре RHEL 7. Но если говорить в общем, то для запуска одного приложения подходят контейнеры, а для нескольких лучше использовать виртуальные машины.
Непростой выбор
Так что же выбрать — VM или контейнеры? Если требуется запустить несколько копий одного приложения, скажем MySQL, то используйте контейнер. Если нужна большая гибкость при работе нескольких программ — задействуйте виртуальную машину.
Кроме того, контейнеры обычно привязывают к определенной версии операционной системы. Это бывает полезно: нет необходимости беспокоиться о зависимостях, если приложение корректно работает в контейнере. Но взамен вы получаете дополнительные ограничения. С виртуальными машинами не важно, какой гипервизор используется (KVM, Hyper-V, vSphere, Xen), — скорее всего, вы сможете запустить там любую ОС. Нет проблемы запустить в VM специфичное приложение, работающее только на QNX. Но реализовать это с нынешним поколением контейнеров становится не просто.
Итак, подытожим:
По мере «взросления» технологии контейнеризации нас ждет такое будущее, где контейнеры и виртуальные машины совместно будут составлять гибкую и портативную облачную среду. До этого еще далеко, но свет в конце тоннеля уже виднеется.