LINUX.ORG.RU

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

 , ,


0

1

Всем добрый день!

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

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

Контейнеры юзал буквально пару раз в тестовой среде на базе службы контейнеров Lunix - lxd. Обращался к ним через lxc. Созданный контейнер видел в папке /var/lib/lxd/containers со всей служебной инфраструктурой папок /bin /etc /lib /lib64 /usr /tmp /var. Знаком с механизмом Linux под названием chroot. И для меня сейчас контейнер Linux - это один из методов изоляции при работе приложения внутри предсозданной инфраструктуры (образа) с использованием chroot при этом с использованием ядра той операционной системы, где установлена система управления контейнерами.

Хотел бы понять прав я или нет? Нужно для спора с коллегой по работе, который утверждает, что контейнеры - это один из способов/подвидов виртуализации.

ПС: просьба не банить за вопрос.

Спасибо.

что контейнеры - это один из способов/подвидов виртуализации

ну если исходить из определения на википедии:

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

то в целом да, но с кучей но (например запуск в контейнере системы не совместимой с хостовым ядром).

Kolins ★★★★★
()
Ответ на: комментарий от Kolins

Из той же самой Википедии: "Контейнеризация (виртуализация на уровне операционной системы, контейнерная виртуализация, зонная виртуализация[1]) — метод виртуализации, при котором ядро операционной системы поддерживает несколько изолированных экземпляров пространства пользователя вместо одного. Эти экземпляры (обычно называемые контейнерами или зонами) с точки зрения выполняемых в них процессов идентичны отдельному экземпляру операционной системы. Для систем на базе Unix эта технология похожа на улучшенную реализацию механизма chroot. Ядро обеспечивает полную изолированность контейнеров, поэтому программы из разных контейнеров не могут воздействовать друг на друга.

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

Существуют реализации, ориентированные на создание практически полноценных экземпляров операционных систем (Solaris Containers, контейнеры Virtuozzo, OpenVZ), так и варианты, фокусирующиеся на изоляции отдельных сервисов с минимальным операционным окружением (jail, Docker)."

Получается, что контейнеры - это виртуализация, но не виртуализация? :)

Ramirezkiv2
() автор топика

Верно, контейнер это усовершенствованный chroot - добавлена изоляция не только по файловой системе, но и по другим аспектам (как минимум по списку процессов). Хотя где-то и обычный chroot сойдёт за контейнер.

Ну и да, это один из способов виртуализации, где ты противоречие то усмотрел? chroot тоже способ виртуализации - процессу подсовывают виртуальный корень файловой системы.

firkax ★★★★★
()
Ответ на: комментарий от firkax

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

Ramirezkiv2
() автор топика
Ответ на: комментарий от Ramirezkiv2

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

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Из описания chroot на Википедии: "chroot — операция изменения корневого каталога в Unix-подобных операционных системах. Программа, запущенная с изменённым корневым каталогом, будет иметь доступ только к файлам, содержащимся в данном каталоге. Поэтому, если нужно обеспечить программе доступ к другим каталогам или файловым системам (например, /proc), нужно заранее примонтировать в целевом каталоге необходимые каталоги или устройства.

Термин chroot может относиться или к концепции изменений корневого каталога, или к системному вызову chroot(2), или к программе chroot(8), что обычно понятно из контекста.

Изменение корневого каталога производится при помощи системного вызова chroot(2). Изменение корневого каталога затрагивает только текущий процесс (то есть процесс, сделавший системный вызов chroot(2)) и всех его потомков. Если требуется запустить некоторую программу с изменённым корневым каталогом, но в данной программе не предусмотрено выполнение вызова chroot(2), используют программу chroot(8). Эта программа принимает в качестве параметров новый корневой каталог и путь к программе. Она сначала сама выполняет вызов chroot(2) для изменения собственного корневого каталога на указанный, а затем запускает программу по заданному пути. Так как изменённый корневой каталог наследуется потомками процессов, программа запускается с изменённым корневым каталогом."

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

Ramirezkiv2
() автор топика
Ответ на: комментарий от Ramirezkiv2

Что значит «использует виртуализацию»? chroot это и есть виртуализация, в одном из самых лёгких её видов - у программы получается виртуальный (не настоящий) корень файловой системы.

firkax ★★★★★
()

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

t184256 ★★★★★
()
Ответ на: комментарий от Ramirezkiv2

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

Нет никаких контейнеров на базе chroot.

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

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 2)

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

Ramirezkiv2
() автор топика

Пытаюсь разобраться на общем уровне в различии

Меня этот вопрос тоже интересует, кстати.

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

А вариантов здесь - море.

i_am_not_ai
()

Коротко:

контейнеры это chroot + cgroups, a виртуализация это эмуляция или изоляция железа (если хост и гость одинаковой архитектуры).

С т.з. использования:

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

скорость контейнера выше, но практически на современных процессорах отличие получается в 1-2-3%.

изоляция в контейнере обеспечивается ядром ОС, в виртуалке – аппаратным решением (виртуальная машина работает в -1 кольце, память виртуалки зашифрована от хоста – на современных CPU).

С т.з. выбора (ИМХО):

  1. если железный сервак свой, то лучше виртуалки

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

soomrack ★★★★★
()
Ответ на: комментарий от Ramirezkiv2

для работы виртуальной машины нужен гипервизор - низкоуровневое и достаточно серьёзное программное обеспечение

для работы виртуализации нужна поддержка на уровне железа, для начала.

targitaj ★★★★★
()

контейнеры - это один из способов/подвидов виртуализации

это совершенно точное утверждение. Контейнер - это способ разделить РЕСУРСЫ ЯДРА ОС.

Вот эта каша с терминами просто вымораживает. Есть процесс разделения ресурса. Есть процесс эмуляции ресурса. Ресурсом может быть как софт, так и железо. Есть гостевая машина, которую все повально называют виртуальной. Это ГОСТЕВАЯ машина, а не «виртуальная». Есть сущности под названием «гипервизор», которые сочетают в себе И механизмы виртуализации И механизмы эмуляции.

Добро пожаловать, короче.

targitaj ★★★★★
()
Ответ на: комментарий от Ramirezkiv2

Насколько я помню, в контейнере файловая система изолируется не через chroot, а через pivot_root в отдельном пространстве имён по монтированию (mount namespace) с последующим размонтированием старого корня. Различие в том, что chroot изменяет каталог, который будет интерпретироваться как корневой для данного процесса, и действует только на вызвавший процесс и порождённых после вызова потомков, а pivot_root перемонтирует указанный каталог в /, а сам / перемонтирует в другой каталог, и действует на всё пространство имён по монтированию, к которому принадлежит вызвавший его процесс.

PeachBlossoms
()

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

Ну и традциионно не надо смотреть на терминологии винды, там всё понамешано и перепутано, докер в винде запускается в виртуалке :)

Dimez ★★★★★
()

В бытовом понимании виртуализацией называют эмулятор компьютера (виртуальную машину) — компьютер-в-компьютере, который повторяет шины, устройства, топологию какой-то реальной системы или стандарта, например, IBM PC, для того, чтобы запускать существующие ОС для этих систем. Это называют Full virtualization.

А под контейнерами понимают виртуализацию на уровне ОС, а не компьютера: OS-level virtualization.

ValdikSS ★★★★★
()
Последнее исправление: ValdikSS (всего исправлений: 1)

Хотел бы понять прав я или нет? Нужно для спора с коллегой по работе, который утверждает, что контейнеры - это один из способов/подвидов виртуализации.

тоже поспорил к колегой, она утверждает что чай сладкий а я что чай холодный кто из нас прав?

antech
()

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

antech
()
Ответ на: комментарий от antech

тоже поспорил к колегой, она утверждает что чай сладкий а я что чай холодный кто из нас прав?

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

Ramirezkiv2
() автор топика
Ответ на: комментарий от ValdikSS

В бытовом понимании виртуализацией называют эмулятор компьютера

Поспорил бы. Эмуляция - это процесс имитации одного аппаратного обеспечения другим. Пример: QEMU. А в виртуализации ничего не эмулируется. Гипервизор является посредником между гостевой ОС и реальным железом, перехватывает вызовы гостевой ОС и предоставляет ей доступ ровно к тому железу, которое было настроено для виртуальной машины.

Про контейнеры - я понял уже. Спасибо.

Ramirezkiv2
() автор топика
Последнее исправление: Ramirezkiv2 (всего исправлений: 1)
Ответ на: комментарий от Ramirezkiv2

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

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

ValdikSS ★★★★★
()
Последнее исправление: ValdikSS (всего исправлений: 2)

Ладно, тогда если дискуссия зашла уже достаточно далеко, поставлю перед участниками данной темы следующий для обсуждения вопрос. Личинку контейнера могу создать и я сам, используя вызовы chroot/pivot_root, механизм cgroups. Наверное, это не точно, но попробовать можно. Но в силах ли одного инженера-программиста создать собственный простенький гипер (без использования готовых open-source исходников)?

Ramirezkiv2
() автор топика
Последнее исправление: Ramirezkiv2 (всего исправлений: 1)
Ответ на: комментарий от Ramirezkiv2

Если речь про использование виртуализации в Linux, то да, средствами KVM это не особо сложно.

https://zserge.com/posts/kvm/

Bare-metal гипервизор потребует существенно больших усилий.

https://github.com/SinaKarvandi/Hypervisor-From-Scratch/

ValdikSS ★★★★★
()
Ответ на: комментарий от vvn_black

И ещё, инженер-программист уже что-то проектировал?

И проектировал и занимался программированием на Сях, на плюсах, на шарпах, на питонах. Опыт в программировании имеется. Что такое ассемблер - инженер-программист знает.

Судя по задаваемым вопросам, нет конечно.

Понял.

Ramirezkiv2
() автор топика
Последнее исправление: Ramirezkiv2 (всего исправлений: 1)
Ответ на: комментарий от ValdikSS

Если речь про использование виртуализации в Linux, то да, средствами KVM это не особо сложно. https://zserge.com/posts/kvm/

Спасибо тебе, добрый человек. Наконец-то я прикоснусь к таинствам красноглазия))

Ramirezkiv2
() автор топика
Ответ на: комментарий от vvn_black

Мир и ядро пересобирал.

Для этого инженерные навыки не нужны, это и ребёнок, умеющий читать сделает.

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

Ramirezkiv2
() автор топика
Ответ на: комментарий от Ramirezkiv2

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

antech
()
Ответ на: комментарий от Ramirezkiv2

На самом деле, нет никакого однозначно трактуемого определения виртуальной машины. В английском языке virtual означает нечто вроде «неотличимый от настоящего».
Потому в ситуации, когда нас интересует полезное свойство исполнять программы, созданные для архитектуры X, эмулятор будет частным случаем виртуальной машины. Есть же такое понятие, как «виртуальная машина Java».

Khnazile ★★★★★
()