Что такое Docker?
Совет
Это содержимое является фрагментом из электронной книги, архитектуры микрослужб .NET для контейнерных приложений .NET, доступных в документации .NET или в виде бесплатного скачиваемого PDF-файла, который можно читать в автономном режиме.
Docker — это проект с открытым исходным кодом для автоматизации развертывания приложений в виде переносимых автономных контейнеров, выполняемых в облаке или локальной среде. Одновременно с этим, Docker — это компания, которая разрабатывает и продвигает эту технологию в сотрудничестве с поставщиками облачных служб, а также решений Linux и Windows, включая корпорацию Майкрософт.
Рис. 2-2. Docker развертывает контейнеры на всех уровнях гибридного облака.
Контейнеры Docker могут работать в любой среде, например в локальном центре обработки данных, в службе стороннего поставщика или в облаке Azure. Контейнеры образов Docker работают в исходном формате в Linux и Windows. Но образы Windows будут выполняться только на узлах Windows, тогда как образы Linux — на узлах Linux или Windows (на данный момент с помощью виртуальной машины Linux Hyper-V). Термин "узлы" здесь означает физические серверы и виртуальные машины.
Разработчики могут использовать среды разработки на базе Windows, Linux или macOS. На компьютере разработчика выполняется узел Docker, где развернуты образы Docker с создаваемым приложением и всеми его зависимостями. Разработчики, работающие в Linux или macOS, могут использовать узел Docker на базе Linux и создавать образы только для контейнеров Linux. (В macOS разработчики могут изменять код приложения и запускать Docker CLI в macOS, но на момент написания этой статьи они не могут запускать контейнеры непосредственно в macOS.) В Windows разработчики могут создавать образы для контейнеров Linux или Windows.
Docker предоставляет Docker Desktop для Windows и macOS, позволяя размещать контейнеры в среде разработки и использовать дополнительные средства разработки. Оба продукта устанавливают необходимую виртуальную машину (узел Docker) для размещения контейнеров.
Для выполнения контейнеров Windows есть среды выполнения двух типов:
Контейнеры Windows Server обеспечивают изоляцию приложений используя соответствующую технологию в отношении процессов и пространств имен. Контейнер Windows Server использует ядро совместно с узлом контейнеров и всеми остальными контейнерами на узле.
Контейнеры Hyper-V расширяют возможности изоляции, предоставляемые контейнерами Windows Server, ведь каждый контейнер запускается в высокооптимизированной виртуальной машине. В этой конфигурации ядро узла контейнера не используется совместно с контейнерами Hyper-V, что улучшает изоляцию.
Образы для этих контейнеров создаются и работают одинаково. Различие заключается лишь в том, что для создания контейнера из образа с контейнером Hyper-V нужен дополнительный параметр. Дополнительные сведения см. в разделе Контейнеры Hyper-V.
Сравнение контейнеров Docker с виртуальными машинами
На рисунке 2-3 показано сравнение между виртуальными машинами и контейнерами Docker.
Виртуальные машины | Контейнеры Docker |
---|---|
Виртуальные машины содержат приложение, необходимые библиотеки или двоичные файлы и всю операционную систему. Полная виртуализация требует больше ресурсов, чем создание контейнеров. | Контейнеры включают в себя приложение и все его зависимости. Но они используют ядро ОС совместно с другими контейнерами, которые выполняются в изолированных процессах в пользовательском пространстве операционной системы узла. (Это не относится к контейнерам Hyper-V, где каждый контейнер запускается на отдельной виртуальной машине.) |
Рис. 2-3. Сравнение традиционных виртуальных машин с контейнерами Docker
Для виртуальных машин на сервере узла создается три базовых уровня: самый нижний инфраструктурный слой; затем операционная система узла и низкоуровневая оболочка; и поверх этого каждая виртуальная машина использует собственную ОС и все необходимые библиотеки. Для Docker сервер узла предоставляет только инфраструктуру и операционную систему, а также ядро контейнеров, которое изолирует контейнер с использованием базовых служб операционной системы.
Так как контейнеры требуют гораздо меньше ресурсов (например, им не нужна полная ОС), их проще развертывать и они быстрее запускаются. Это позволяет повысить плотность развертываний, то есть запустить на одной единице оборудования больше служб и сократить затраты на них.
Запуск на одном ядре приводит к тому, что уровень изоляции будет ниже, чем на виртуальных машинах.
Основная цель образа — привести среду (зависимости) к единообразию в различных развертываниях. Это означает, что вы можете отладить образ на одном компьютере, а затем развернуть его на другом компьютере и получить ту же среду.
Образ контейнера — это способ упаковки приложения или службы для надежного и воспроизводимого развертывания. Можно сказать, что Docker является не только технологией, но еще философией и процессом.
При использовании Docker вы не услышите, что разработчики говорят: "Он работает на моем компьютере, почему бы не в рабочей среде?" Они могут просто сказать: "Он выполняется в Docker", так как упаковаемое приложение Docker может быть выполнено в любой поддерживаемой среде Docker, и он работает так, как он был предназначен для всех целевых объектов развертывания (например, dev, QA, промежуточной и рабочей среды).
Простая аналогия
Возможно, небольшая аналогия поможет вам быстрее освоить ключевую концепцию Docker.
Вернемся ненадолго назад во времени, в 1950-е годы. Тогда еще не было текстовых редакторов, и повсеместно использовались фотокопировальные устройства (то есть то, что тогда так называлось).
Представьте, что вам понадобилось быстро подготовить наборы писем, чтобы отправить их с обычной бумажной почтой в настоящих конвертах с марками и доставить по домашнему адресу клиента (не забывайте, еще не существует электронной почты).
В какой-то момент вы понимаете, что каждое письмо составлено из широкого набора абзацев, которые выбираются и упорядочиваются по мере необходимости с учетом назначения письма. Вы создаете систему, которая быстро создает нужные письма, и обоснованно надеетесь на существенную прибавку.
Вы создали простую систему со следующим алгоритмом:
У вас есть пачка прозрачных листов, каждый из которых содержит один абзац.
Чтобы подготовить комплект писем, вы отбираете листы с нужными абзацами, собираете их в стопку и выравниваете так, чтобы все правильно читалось.
Теперь вы помещаете готовый набор в фотокопировальное устройство и нажмите кнопку запуска, чтобы изготовить нужное количество копий.
Это и есть основная концепция Docker в упрощенной форме.
В Docker каждый слой представляет некоторый набор изменений, которые применяются к файловой системе после выполнения команды, такой как установка программы.
Таким образом, при просмотре файловой системы после копирования слоя вы увидите все файлы, включенные в слой при установке программы.
Такой образ можно рассматривать как дополнительный жесткий диск, доступный только для чтения, который готов к установке на "компьютер" с уже установленной операционной системой.
Соответственно, роль "компьютера" здесь выполняет контейнер, в который устанавливается жесткий диск этого образа. Контейнер, как и обычный компьютер, можно включать и отключать.