Что такое 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 из 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 Containers.
Сравнение контейнеров Docker с виртуальными машинами
На рисунке 2–3 показано сравнение между виртуальными машинами и контейнерами Docker.
Виртуальные машины | Контейнеры Docker |
---|---|
![]() |
![]() |
Виртуальные машины включают приложение, необходимые библиотеки или двоичные файлы, а также полную гостевую операционную систему. Для полной виртуализации требуется больше ресурсов, чем контейнеризация. | Контейнеры включают приложение и все зависимости, необходимые для его работы. Однако они совместно используют ядро ОС с другими контейнерами, выполняясь как изолированные процессы в пространстве пользователя на операционной системе хоста. (За исключением контейнеров Hyper-V, где каждый контейнер работает внутри своей специальной виртуальной машины.) |
рис. 2-3. Сравнение традиционных виртуальных машин с контейнерами Docker
Для виртуальных машин на сервере узла существует три базовых уровня, начиная снизу вверх: инфраструктура, операционная система узла и гипервизор. Поверх этого каждая виртуальная машина имеет собственную операционную систему и все необходимые библиотеки. Для Docker сервер узла имеет только инфраструктуру и ОС, а также поверх этого подсистему контейнеров, которая обеспечивает изоляцию контейнера, но совместное использование базовых служб ОС.
Так как контейнеры требуют гораздо меньше ресурсов (например, они не нуждаются в полной ОС), они легко развертываются и начинаются быстро. Это позволяет иметь более высокую плотность, что означает, что она позволяет запускать больше служб на одном аппаратном модуле, тем самым уменьшая затраты.
В качестве побочных эффектов запуска в одном ядре вы получаете меньше изоляции, чем виртуальные машины.
Основная цель образа — обеспечить одинаковую среду (зависимости) во всех развертываниях. Это означает, что вы можете отладить программу на своем компьютере, а затем развернуть её на другом компьютере с гарантией такой же среды.
Образ контейнера — это способ упаковки приложения или службы и его развертывания надежным и воспроизводимым способом. Можно сказать, что Docker — это не только технология, но и философия и процесс.
При использовании Docker вы не услышите, что разработчики говорят: "Он работает на моем компьютере, почему бы не в рабочей среде?" Они могут просто сказать: "Он выполняется в Docker", так как упаковаемое приложение Docker может быть выполнено в любой поддерживаемой среде Docker, и он работает так, как он был предназначен для всех целевых объектов развертывания (например, dev, QA, промежуточной и рабочей среды).
Простая аналогия
Возможно, простая аналогия может помочь получить понимание основной концепции Docker.
Давайте на мгновение вернемся к 1950-м годам. Не было редакторов текста, и ксероксы использовались почти везде.
Представьте, что вы несете ответственность за быструю выдачу пакетов писем по мере необходимости, чтобы отправить их клиентам, используя реальные бумажные и конверты, чтобы быть доставлены физически на адрес каждого клиента (тогда не было электронной почты).
В какой-то момент вы понимаете, что письма это просто составные части большого набора абзацев, которые выбираются и упорядочиваются по мере необходимости, в соответствии с целью письма. Поэтому вы разрабатываете систему для быстрой выдачи писем, ожидая получить значительное повышение.
Система проста:
Начните с набора прозрачных листов, содержащих по одному абзацу на каждом.
Чтобы выпустить пакет писем, вы выбираете листы с нужными абзацами, затем вы складываете и выравниваете их так, чтобы они выглядели и читались нормально.
Наконец, вы помещаете набор в фотокопиер и нажимаете клавишу, чтобы создать столько букв, сколько требуется.
Таким образом, если упростить, это и есть основная идея Docker.
В Docker каждый слой представляет собой результирующий набор изменений, которые происходят с файловой системой после выполнения команды, например установки программы.
Таким образом, при просмотре файловой системы после копирования слоя вы увидите все файлы, включенные в слой при установке программы.
Образ можно представить как вспомогательный жесткий диск только для чтения, готовый к установке на компьютере, где уже установлена операционная система.
Аналогичным образом можно рассматривать контейнер как "компьютер" с установленным жестким диском образа. Контейнер, как компьютер, можно включить или отключить.