Хабрахабр

[Из песочницы] VM или Docker?

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

Так в чём же отличие Docker-контейнеров от VM?

Т. Виртуальная машина (VM) — это виртуальный компьютер со всеми виртуальными устройствами и виртуальным жёстким диском, на который и устанавливается новая независимая ОС вместе с виртуальными драйверами устройств, управлением памятью и другими компонентами. мы получаем абстракцию физического оборудования, позволяющую запускать на одном компьютере множество виртуальных компьютеров.
Установленная VM может по-разному занимать место на диске компьютера: е.

  • фиксированное место на жёстком диске, что позволяет осуществлять более быстрый доступ к виртуальному жёсткому диску и позволяет избежать фрагментации файла;
  • динамическое выделение памяти. При установке дополнительных приложений память будет динамически выделяться под них, пока не достигнет максимального объема, отведенного ей.

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

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

Данная возможность позволяет контейнерам разделить ядро системы, где каждый из контейнеров работает как отдельный процесс основной ОС, у которого есть свой собственный набор областей памяти (собственное виртуальное адресное пространство). Контейнер даёт более эффективный механизм инкапсуляции приложений, обеспечивая необходимые интерфейсы хост-системы. Запуск Docker-контейнеров на Windows будет происходить внутри виртуальной машины с ОС Linux, т.к. Так как виртуальное адресное пространство каждого контейнера является собственным, то данные, принадлежащие разным областям памяти, не могут быть изменены.
Нативной ОС для Docker является Linux (Docker можно использовать также и на Windows, и на MacOS), он использует её основные преимущества, которые и позволяют ему организовать разделение ядра. контейнеры разделяют ОС хост-системы и основной ОС для них является Linux.

Контейнер — как это работает?

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

Там можно задать различные параметры такие как имя контейнера, порты, идентификаторы, лимиты ресурсов, зависимости между другими контейнерами. Каждый контейнер можно настроить через файл в проекте docker-compose, включенного в основное решение — docker-compose.yml. Если в настройках не задавать имя контейнера, то Docker каждый раз будет создавать новый контейнер, присваивая ему имя случайным образом.

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

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

Как образ связан с контейнером?

Образ создаётся из Dockerfile, добавленного в проект и представляет собой набор файловых систем (слоёв) наслоённых друг на друга и сгруппированных вместе, доступных только для чтения; максимальное число слоёв равно 127. Образ — основной элемент для каждого контейнера.

Каждый слой является readonly-слоем и представлен одной командой, модифицирующей файловую систему, записанной в Dockerfile.
Для сочетания этих слоёв в один образ Docker использует Advanced multi layered Union file system (AuFS построена на базе UnionFS), позволяя разным файлам и директориям из разных файловых слоёв прозрачно накладываться, создавая связанную файловую систему. В основе каждого образа находится базовый образ, который указывается командой FROM — входная точка при формировании образа Dockerfile.

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

Dockerfile может содержать такие команды как:

  • FROM — входная точка при формировании образа;
  • MAINTAINER — имя владельца образа;
  • RUN — выполнения команды в ходе сборки образа;
  • ADD — копирование файла хоста в новый образ, если указать URL-файла, Docker загрузит его в заданную директорию;
  • ENV — переменные среды;
  • CMD — запускает создание нового контейнера на основе образа;
  • ENTRYPOINT — команда выполняется при запуске контейнера.
  • WORKDIR — рабочий каталог для выполнения команды CMD.
  • USER — устанавливает UID для создаваемого на основе образа контейнера.
  • VOLUME — монтирует директорию хоста в контейнер.
  • EXPOSE — набор прослушиваемых в контейнере портов.

Как работает UnionFS?

Данная ФС реализует механизм копирования при записи (Copy-On-Write, COW). UnionFS — служебная стэковая файловая система (ФС) для Linux и FreeBSD. UnionFS создаёт объединенное монтирование для других файловых систем и позволяет прозрачно для пользователя объединять файлы и каталоги различных файловых систем (называемых ветвями) в единую связанную файловую систему. Рабочей единицей UnionFS является слой, каждый слой следует рассматривать как отдельную полноценную файловую систему с иерархией директорий от самого корня.

Содержимое каталогов с одинаковыми путями будет отображаться вместе в одном объединенном каталоге (в едином пространстве имён) полученной файловой системы.

UnionFS объединяет слои, руководствуясь следующими принципами:

  • один из слоёв становится слоем верхнего уровня, второй и последующие – слоями нижнего уровня;
  • пользователю объекты слоёв доступны «сверху вниз», т.е. если запрошенный объект есть в «верхнем» слое, возвращается он, независимо от наличия объекта с таким именем в «нижнем» слое; иначе возвращается объект «нижнего» слоя; если запрошенного объекта нет ни там, ни там, возвращается ошибка «Нет такого файла или каталога»;
  • рабочим слоем является «верхний», то есть все действия пользователя по изменению данных отражаются только на слое верхнего уровня, не влияя на содержимое слоёв нижних уровней.

Он стал стандартом в этой области, строясь на основе cgroups и пространстве имён, которые обеспечивает ядро Linux. Docker наиболее распространенная технология использования контейнеров в работе приложения.

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

Теги
Показать больше

Похожие статьи

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

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

Кнопка «Наверх»
Закрыть