Поиск по сайту:

В чем разница между Docker и виртуальной машиной (ВМ)?


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

Что делает Docker таким полезным?

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

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

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

По-прежнему есть некоторые накладные расходы из-за сети и взаимодействия с хост-системой, но приложения в Docker обычно работают на скорости, близкой к скорости «голого железа», и, безусловно, намного быстрее, чем ваш средний VPS. Вам не нужно запускать 8 копий Ubuntu, только одну, что удешевляет запуск нескольких контейнеров Docker на одном хосте. Такие сервисы, как Elastic Container Service от AWS и Cloud Run от GCP, позволяют запускать отдельные контейнеры без выделения базового сервера.

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

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

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

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

Недостатки Докера

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

Сеть, как правило, более вовлечена. На виртуальной машине у вас обычно есть выделенное сетевое оборудование, доступное непосредственно вам. Вы можете легко настроить брандмауэры, настроить приложения для прослушивания определенных портов и запускать сложные рабочие нагрузки, такие как балансировка нагрузки, с помощью HAProxy. В Docker, поскольку все контейнеры работают на одном хосте, это часто немного сложнее. Однако обычно сервисы для конкретных контейнеров, такие как Elastic Container Service от AWS и Cloud Run от GCP, предоставляют эту сеть как часть своего сервиса.

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

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