Перейти к содержимому

В чем преимущество контейнеров перед виртуальными машинами

  • автор:

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

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

Общие сведения о контейнерах см. в разделе Windows и контейнеры.

Архитектура контейнера

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

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

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

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

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

  1. Измените файл сборки образа контейнера (известный как Dockerfile), чтобы он указывал на последнюю версию базового образа Windows.
  2. Пересоберите образ контейнера с новым базовым образом.
  3. Отправьте образ контейнера в реестр контейнеров.
  4. Повторно разверните образ с помощью Orchestrator.
    Orchestrator предоставляет широкие возможности автоматизации при масштабировании. Дополнительные сведения см. в разделе Tutorial: Update an application in Azure Kubernetes Service (Руководство по обновлению приложений в службе Azure Kubernetes).

Что дают системные контейнеры в реальности? Где их стоит применять?

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

image

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

Контейнеры, виртуальные машины, серверы – кто быстрее?

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

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

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

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

Однако, мы говорим совсем не о реальной жизненной ситуации (поскольку запуск одной виртуальной машины на компьютере – это скорее сценарий для настольного компьютера, а не для сервера), и сравнивать таким образом работу виртуальных, контейнерных и физических нагрузок некорректно. Но рассмотренный пример показывает, что производительность виртуальных машин, так же, как и контейнеров, может быть очень близкой к производительности «чистого железа» — все зависит от условий. Но это, безусловно, не означает, что контейнеры и виртуальные машины одинаково хороши для любых задач. И вот несколько примеров которые это показывают.

Реальные условия

image

Перед вами график теста производительности, в котором создается несколько групп виртуальных серверов, в которых запускаются набор приложений, каждое со своей уникальной нагрузкой (т.н. Consolidation Stack Unit (CSU)). Каждый сервер в группе выдает свои результаты, такие как количество транзакций в секунду. Потом мы суммируем эти данные, чтобы получить общий результат для каждой технологии виртуализации, сравнивая ситуации, когда эти приложения запускаются на одном и том же «железе» — но с использованием различных средств виртуализации. В данном случае мы сравниваем возможности виртуальных машин и системных контейнеров, а увеличение количества CSU дает нам возможность сравнить работу этих технологий при разных уровнях нагрузки.

Как вы можете видеть, до момента пиковой производительности контейнеры и виртуальные машины показывают очень близкие результаты, разница в производительности ограничивается единицами процентов. Однако, когда дело доходит до полной загрузки процессора, отличия становятся очевидными. Если у центрального процессора не остается свободных циклов, он не может выделить время для обслуживания гипервизора без ущерба приложению, и поэтому производительность экосистемы виртуальных машин перестает расти раньше, чем экосистемы контейнеров. Далее происходит следующее: виртуальные машины первыми исчерпывают системную память. Дело в том, что ВМ представляют собой «черный ящик» для гипервизора, в то время как в случае контейнеров содержимое прозрачно и операционная система может воспользоваться иначе неиспользуемой памятью, а также убрать дубликаты (копии файлов, загруженных в память многократно). Поэтому контейнеры в отличие от виртуальных машин не показывают снижения производительности с дальнейшим ростом количества CSU (безусловно, до определенного предела).

Вот еще один тест, на отличия еще более очевидны. Так называемый, сценарий “DVD-store” напоминает по характеру нагрузки vConsolidate, но работа идет с приложением электронного магазина.

image

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

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

Во-вторых, системные контейнеры Virtuozzo OS обладают уникальной функцией “pfcache”. Проще говоря система обеспечивает объединение идентичных файлов из разных контейнеров в момент их загрузки в память. В результате происходит одновременно снижение общего потребления оперативной памяти и повышение производительности ввода/вывода за счет лучшего кеширования – поскольку в кэше приходится держать меньше копий файлов, система может держать больше уникальных файлов – ускоряя доступ к ним.

Но не все контейнеры одинаковы. В частности, по данным тестов системные контейнеры Virtuozzo 7 демонстрируют максимальную плотность по сравнению с любым другим решением для виртуализации Linux – на несколько процентов выше чем предыдущая версия (Virtuozzo 6) и примерно в два раза выше чем виртуальные машины на основе KVM. Для нас это крайне важно – производительность платформы – это одна из основных причин почему наши клиенты выбирают Virtuozzo вместо других платформ. Несколько процентов может превратиться в серьезные суммы, когда речь идет о площадках в тысячи серверов – поэтому наша цель всегда показывать производительность лучше, чем аналоги, на всех приложениях и системах включая Windows.

Сценарии из реальной жизни

Можно выделить несколько сценариев где использование системных контейнеров, и в частности, наших новых контейнеров Virtuozzo 7 может показать максимальные преимущества:

Сценарий 1. Контейнеры крайне полезны, когда серверы работают на максимальной нагрузке, особенно если к 100% приближается не только утилизация ресурсов процессоров, но и оперативной памяти. На самом деле это очень типичный случай при запуске систем анализа данных или пакетной обработки информации. И если вы не оставляете резервной производительности для пиковых нагрузок, контейнеры помогут «выжать» максимум из имеющегося оборудования.

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

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

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

Курс на эффективность

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

Более того, мы продолжаем улучшать характеристики Virtuozzo Containers, и версия 7 позволила улучшить как плотность размещения контейнеров, так и производительность на том же оборудовании. Обновление ядра Linux для решений Virtuozzo позволило изначально встроить в решение такие инструменты как CRIU для живой миграции контейнеров или Kpatch для обновления ядра без остановки работы сервисов. Так что к преимуществам системных контейнеров, как технологии в целом, сегодня добавляются новые, уникальные возможности, которые делают их еще более интересным решением для реальных бизнес-задач.

  • виртуализация приложений
  • контейнерная виртуализация
  • виртуальные машины
  • Блог компании Virtuozzo
  • Виртуализация

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:

  • обеспечивает виртуализацию на уровне ОС;
  • контейнеры разделяют ядро системы, работая как отдельный процесс основной ОС;
  • потребление системных ресурсов, таких как расход памяти и нагрузка на CPU, могут ограничиваться отдельно для каждого контейнера с использованием cgroups;
  • ФС для контейнеров создаётся с использованием механизма COW, что позволяет ускорить разворачивание приложения, снижает расход памяти и экономит место на диске;
  • изменённая файловая система одного контейнера, может использоваться в качестве основы для формирования новых базовых образов других контейнеров.

Чем Docker отличается от виртуальной машины?

img

Когда дело доходит до облачной инфраструктуры, виртуальная машина является стандартом перехода по многим своим преимуществам. Однако, что делать, если у вас была альтернатива виртуальной машине, которая была бы более легкой, экономичной и масштабируемой? Это именно то, чем является Docker.

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

Docker vs VM

Что такое виртуальная машина?

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

Что такое Docker?

Docker — это инструмент, который использует контейнеры для упрощения создания, развертывания и запуска приложений. Он связывает приложение и его зависимости внутри контейнера.

Docker против виртуальной машины

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

Итак, давайте обсудим каждый из этих терминов.

Поддержка операционной системы

 Docker vs VM structure

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

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

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

Безопасность

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

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

Портативность

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

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

Производительность

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

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

Вывод

Вот таблица, которая показывает различия между виртуальной машиной и контейнером Docker.

Виртуальная машина Docker контейнер
Изоляция процесса на аппаратном уровне Изоляция процесса на уровне ОС
Каждая виртуальная машина имеет отдельную ОС Каждый контейнер может совместно использовать ОС
Загружается в считанные минуты Загружается в считанные секунды
Виртуальные машины занимают несколько ГБ Контейнеры легкие (КБ / МБ)
Готовые виртуальные машины трудно найти Готовые док-контейнеры легко доступны
Виртуальные машины могут легко перейти на новый хост Контейнеры уничтожаются и воссоздаются, а не перемещаются
Создание ВМ занимает относительно больше времени Контейнеры могут быть созданы в считанные секунды
Больше использования ресурса Меньшее использование ресурсов

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *