Docker - это не методология виртуализации. Он полагается на другие инструменты, которые фактически реализуют виртуализацию на основе контейнеров или виртуализацию на уровне операционной системы. Для этого Docker изначально использовал драйвер LXC, затем переместился в libcontainer, который теперь переименован в runc. Docker в первую очередь ориентирован на автоматизацию развертывания приложений внутри контейнеров приложений. Контейнеры приложений предназначены для упаковки и запуска одной службы, тогда как системные контейнеры предназначены для запуска нескольких процессов, например виртуальных машин. Итак, Docker рассматривается как инструмент управления контейнерами или развертывания приложений в контейнерных системах.
Чтобы понять, чем она отличается от других виртуализаций, давайте рассмотрим виртуализацию и ее типы. Тогда было бы легче понять, в чем разница.
Виртуализация
В своей задуманной форме он рассматривался как метод логического разделения мэйнфреймов, позволяющий нескольким приложениям работать одновременно. Однако сценарий радикально изменился, когда компании и сообщества с открытым исходным кодом смогли предоставить метод обработки привилегированных инструкций тем или иным способом и позволить нескольким операционным системам работать одновременно на одной системе на базе x86.
Гипервизор
Гипервизор обрабатывает создание виртуальной среды, в которой работают гостевые виртуальные машины. Он контролирует гостевые системы и следит за тем, чтобы ресурсы распределялись между гостями по мере необходимости. Гипервизор находится между физической машиной и виртуальными машинами и предоставляет виртуальным машинам услуги виртуализации. Чтобы реализовать это, он перехватывает операции гостевой операционной системы на виртуальных машинах и имитирует операции в операционной системе хост-машины.
Быстрое развитие технологий виртуализации, в первую очередь в облаке, привело к дальнейшему использованию виртуализации, позволив создавать несколько виртуальных серверов на одном физическом сервере с помощью гипервизоров, таких как Xen, VMware Player, KVM и т. Д., И включение аппаратной поддержки в стандартные процессоры, такие как Intel VT и AMD-V.
Типы виртуализации
Метод виртуализации можно разделить на категории в зависимости от того, как он имитирует аппаратное обеспечение гостевой операционной системы и эмулирует гостевую операционную среду. В первую очередь, существует три типа виртуализации:
- Эмуляция
- Паравиртуализация
- Виртуализация на основе контейнеров
Эмуляция
Эмуляция, также известная как полная виртуализация, полностью запускает ядро ОС виртуальной машины в программном обеспечении. Гипервизор, используемый в этом типе, известен как гипервизор типа 2. Он устанавливается поверх операционной системы хоста, которая отвечает за перевод кода ядра гостевой ОС в инструкции программного обеспечения. Перевод выполняется полностью программно и не требует использования оборудования. Эмуляция позволяет запускать любую немодифицированную операционную систему, которая поддерживает эмулируемую среду. Обратной стороной этого типа виртуализации является дополнительная нагрузка на системные ресурсы, которая приводит к снижению производительности по сравнению с другими типами виртуализации.
Примеры в этой категории включают VMware Player, VirtualBox, QEMU, Bochs, Parallels и т. Д.
Паравиртуализация
Паравиртуализация, также известная как гипервизор 1-го типа, работает непосредственно на оборудовании или «голом железе» и предоставляет услуги виртуализации непосредственно виртуальным машинам, работающим на нем. Это помогает операционной системе, виртуализированному оборудованию и реальному оборудованию взаимодействовать друг с другом для достижения оптимальной производительности. Эти гипервизоры обычно занимают довольно мало места и сами по себе не требуют значительных ресурсов.
Примеры в этой категории включают Xen, KVM и т. Д.
Виртуализация на основе контейнеров
Виртуализация на основе контейнеров, также известная как виртуализация на уровне операционной системы, позволяет выполнять несколько изолированных операций в рамках одного ядра операционной системы. Он обладает максимально возможной производительностью и плотностью, а также поддерживает динамическое управление ресурсами. Изолированная виртуальная среда выполнения, обеспечиваемая этим типом виртуализации, называется контейнером и может рассматриваться как отслеживаемая группа процессов.
Концепция контейнера стала возможной благодаря функции пространств имен, добавленной в ядро Linux версии 2.6.24. Контейнер добавляет свой идентификатор к каждому процессу и добавляет новые проверки контроля доступа к каждому системному вызову. Доступ к нему осуществляется системным вызовом clone (), который позволяет создавать отдельные экземпляры ранее глобальных пространств имен.
Пространства имен можно использовать по-разному, но наиболее распространенным подходом является создание изолированного контейнера, который не имеет видимости или доступа к объектам вне контейнера. Процессы, запущенные внутри контейнера, кажутся запущенными в обычной системе Linux, хотя они совместно используют базовое ядро с процессами, расположенными в других пространствах имен, то же самое для других типов объектов. Например, при использовании пространств имен пользователь root внутри контейнера не рассматривается как пользователь root вне контейнера, что добавляет дополнительную безопасность.
Подсистема групп управления Linux (cgroups), следующий важный компонент, обеспечивающий виртуализацию на основе контейнеров, используется для группировки процессов и управления их совокупным потреблением ресурсов. Обычно он используется для ограничения потребления памяти и ЦП контейнерами. Поскольку контейнерная система Linux имеет только одно ядро и ядро имеет полную видимость контейнеров, существует только один уровень распределения ресурсов и планирования.
Для контейнеров Linux доступно несколько инструментов управления, включая LXC, LXD, systemd-nspawn, lmctfy, Warden, Linux-VServer, OpenVZ, Docker и т. Д.
Контейнеры против виртуальных машин
В отличие от виртуальной машины, контейнеру не нужно загружать ядро операционной системы, поэтому контейнеры могут быть созданы менее чем за секунду. Эта функция делает виртуализацию на основе контейнеров уникальной и желательной по сравнению с другими подходами к виртуализации.
Поскольку виртуализация на основе контейнеров практически не увеличивает накладные расходы на хост-машину, виртуализация на основе контейнеров имеет производительность, близкую к исходной.
Для виртуализации на основе контейнеров не требуется никакого дополнительного программного обеспечения, в отличие от других виртуализаций.
Все контейнеры на хост-машине совместно используют планировщик хост-машины, что сокращает потребность в дополнительных ресурсах.
Состояния контейнеров (образы Docker или LXC) имеют небольшой размер по сравнению с образами виртуальных машин, поэтому образы контейнеров легко распространять.
Управление ресурсами в контейнерах достигается через контрольные группы. Cgroups не позволяет контейнерам потреблять больше ресурсов, чем им выделено. Однако на данный момент все ресурсы хост-машины видны на виртуальных машинах, но не могут быть использованы. Это может быть реализовано путем одновременного запуска top
или htop
в контейнерах и на хост-машине. Результат для всех сред будет похожим.
Обновлять:
Как Docker запускает контейнеры в системах, отличных от Linux?
Если контейнеры возможны из-за функций, доступных в ядре Linux, тогда очевидный вопрос заключается в том, как системы, отличные от Linux, запускают контейнеры. И Docker для Mac, и Windows используют виртуальные машины Linux для запуска контейнеров. Docker Toolbox используется для запуска контейнеров на виртуальных машинах Virtual Box. Но последняя версия Docker использует Hyper-V в Windows и Hypervisor.framework в Mac.
Теперь позвольте мне подробно описать, как Docker для Mac запускает контейнеры.
Docker для Mac использует https://github.com/moby/hyperkit для имитации возможностей гипервизора, а Hyperkit использует hypervisor.framework в его ядре. Hypervisor.framework - это собственное решение для гипервизора Mac. Hyperkit также использует VPNKit и DataKit для пространства имен сети и файловой системы соответственно.
Виртуальная машина Linux, которую Docker запускает на Mac, доступна только для чтения. Однако вы можете столкнуться с ним, запустив:
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
.
Теперь мы даже можем проверить версию ядра этой виртуальной машины:
# uname -a
Linux linuxkit-025000000001 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:86_64 Linux
.
Все контейнеры работают внутри этой виртуальной машины.
Есть некоторые ограничения для hypervisor.framework. Из-за этого Docker не предоставляет docker0
сетевой интерфейс на Mac. Итак, вы не можете получить доступ к контейнерам с хоста. На данный момент docker0
доступен только внутри виртуальной машины.
Hyper-v - это собственный гипервизор Windows. Они также пытаются использовать возможности Windows 10 для запуска систем Linux изначально.
person
Ashish Bista
schedule
02.04.2016