Docker — революционная контейнерная технология

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

Но изменились не только процессы разработки, но и архитектура программного обеспечения. Она перешла от монолитных комплексных решений к кластерам связанных между собой легких «микросервисов». Это, в свою очередь, привело к тому, что создаваемые системы стали более сложными. В последние годы появилось программное обеспечение Kubernetes для управления многоконтейнерными приложениями.

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

Примечание

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

Краткая история Docker

Программное обеспечение, первоначально выпущенное под названием «Docker», было создано на основе технологии Linux Container (LXC). Позже LXC был заменен на собственный libcontainer компании Docker. По мере развития Docker и его превращения в стандарт виртуализации на основе контейнеров добавлялись новые программные компоненты. Такие вещи, как containerd, среда выполнения контейнеров с реализацией по умолчанию runC, появились в результате развития Docker. Сегодня оба проекта управляются Cloud Native Computing Foundation (CNCF) и Open Container Initiative (OCI).

Помимо команды Docker, в разработке Docker и сопутствующих технологий участвуют ведущие технологические компании, такие как Cisco, Google, Huawei, IBM, Microsoft и Red Hat. Более поздним событием стало то, что теперь в качестве родной среды для контейнеров Docker, помимо ядра Linux, используется также Windows. Вот некоторые основные вехи в истории развития Docker:

Год Основные вехи развития Docker
2007 Технология cgroups интегрирована в ядро Linux
2008 Выпущен LXC; основан на cgroups и пространствах имен Linux, как это позже сделал Docker
2013 Docker выпущен с открытым исходным кодом
2014 Docker доступен на Amazon EC2
2015 Kubernetes выпущен
2016 Docker доступен на Windows 10 Pro через Hyper-V
2019 Docker доступен на Windows Home через WSL2
Совет

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

Что такое Docker?

Основной функцией Docker является контейнерная виртуализация приложений. Это отличается от виртуализации с помощью виртуальных машин (VM). В Docker код приложения, включая все зависимости, упаковывается в «образ». Программное обеспечение Docker запускает упакованное приложение в контейнере Docker. Образы можно перемещать между системами и запускать на любой системе с Docker.

Цитата

Контейнеры — это стандартизированная единица программного обеспечения, которая позволяет разработчикам изолировать свое приложение от окружающей среды […]». — Цитата разработчика Docker, источник: www.Docker.com/why-Docker.

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

Хотя мы говорим о Docker как об одном программном продукте, на самом деле это несколько программных компонентов, которые взаимодействуют через API Docker Engine. Кроме того, используется несколько специальных объектов Docker, таких как вышеупомянутые образы и контейнеры. Специфические рабочие процессы Docker состоят из программных компонентов и объектов Docker. Давайте рассмотрим их взаимодействие подробнее.

Программное обеспечение Docker

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

Docker Engine

Docker Engine работает на локальной системе или сервере и состоит из двух компонентов:

  1. Демон Docker (Dockerd). Он всегда работает в фоновом режиме и прослушивает запросы API Docker Engine. Dockerd отвечает на соответствующие команды для управления контейнерами Docker и другими объектами Docker.
  2. Клиент Docker (Docker): Это программа командной строки. Клиент Docker используется для управления Docker Engine и предоставляет команды для создания и сборки контейнеров Docker, а также для создания, получения и версионирования образов Docker.

Docker Engine API

Docker Engine API представляет собой REST API. Он взаимодействует с демоном Docker. Для интеграции Docker Engine API в программные проекты существуют официальные «комплекты разработки программного обеспечения» (SKD) для Go и Python. Подобные библиотеки существуют также для более чем десятка других языков программирования. Доступ к API можно получить из командной строки с помощью команды Docker. Кроме того, вы можете получить доступ к API напрямую, используя cURL или аналогичные инструменты.

Инструменты Docker

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

Docker Swarm и Docker Compose — это два официальных инструмента Docker, которые доступны для оркестровки контейнерных кластеров. Команду «Docker swarm» можно использовать для объединения нескольких двигателей Docker в один виртуальный двигатель. Затем отдельные движки могут работать в нескольких системах и инфраструктурах. Команда «Docker compose» используется для создания многоконтейнерных приложений, известных как «стеки».

Оркестратор Kubernetes, первоначально разработанный компанией Google, более удобен в использовании, чем Swarm и Compose. Он зарекомендовал себя как стандарт и широко используется в отрасли. Хостинговые компании и другие поставщики решений «программное обеспечение как услуга» (SaaS) и «платформа как услуга» (PaaS) все чаще используют Kubernetes в качестве базовой инфраструктуры.

Объекты Docker

Рабочие процессы в экосистеме Docker являются результатом того, как объекты Docker взаимодействуют друг с другом. Управление ими осуществляется посредством взаимодействия с API Docker Engine. Давайте рассмотрим каждый тип объектов подробнее.

Образ Docker

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

Для обмена образами Docker используются различные репозитории. Существуют как публичные, так и частные репозитории. На момент написания статьи на популярном «Docker Hub» для загрузки доступно более пяти миллионов различных образов. Команды Docker «Docker pull» и «Docker push» используются для загрузки образа из репозитория или обмена им там.

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

Dockerfile

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

Контейнер Docker

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

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

Docker Volume

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

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

Основной принцип работы Docker аналогичен ранее разработанной технологии виртуализации LXC: оба они основаны на ядре Linux и выполняют виртуализацию на основе контейнеров. И Docker, и LXC объединяют две противоречивые цели:

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

И Docker, и LXC используют «пространства имен ядра» и «группы управления» для достижения этих целей. Давайте рассмотрим, как это работает в деталях.

Ядро Linux

Ядро Linux — это основной компонент операционной системы GNU/Linux с открытым исходным кодом. Ядро управляет аппаратным обеспечением и контролирует процессы. При запуске Docker вне Linux для обеспечения функциональности ядра Linux необходим гипервизор или виртуальная машина. На macOS используется xhyve, производная от гипервизора BSD bhyve. В Windows 10 Docker использует гипервизор Hyper-V.

Пространства имен ядра

Пространства имен — это особенность ядра Linux. Они разделяют ресурсы ядра и таким образом обеспечивают разделение процессов друг от друга. Процесс в пространстве имен может видеть только ресурсы ядра того же пространства имен. Ниже приведен обзор пространств имен, используемых в Docker:

Пространство имен Описание Объяснение
UTS Идентификация системы Присвоение контейнерам собственных имен хостов и доменов
PID Идентификаторы процессов Каждый контейнер использует свое собственное пространство имен для идентификаторов процессов; PID из других контейнеров не видны; таким образом, два процесса в разных контейнерах могут использовать один и тот же PID без конфликтов.
IPC Межпроцессное взаимодействие Пространства имен IPC изолируют процессы в одном контейнере, чтобы они не могли взаимодействовать с процессами в других контейнерах.
NET Сетевые ресурсы Назначение контейнеру отдельных сетевых ресурсов, таких как IP-адреса или таблицы маршрутизации.
MNT Точки монтирования файловой системы Ограничивает файловую систему хоста узко определенным разделом с точки зрения контейнера.

Группы управления

Группы управления, обычно сокращенно называемые cgroups, используются для иерархической организации процессов Linux. Процессу (или группе процессов) выделяется ограниченное количество системных ресурсов. К ним относятся оперативная память, ядра процессора, устройства хранения данных и (виртуальные) сетевые устройства. В то время как пространства имен изолируют процессы друг от друга, группы управления ограничивают доступ к системным ресурсам. Это обеспечивает сохранение работоспособности всей системы при работе с несколькими контейнерами.

Каковы преимущества Docker?

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

Программное обеспечение на физической машине

Традиционно программное обеспечение создавалось для запуска на физической машине. Но при этом мы быстро упираемся в стену. Программное обеспечение может работать только на определенном оборудовании, например, ему требуется определенный процессор.

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

Если вы хотите параллельно запускать несколько приложений на одной машине, быстро возникают конфликты версий. Одно приложение может потребовать версию компонента, которая несовместима с другим приложением. В худшем случае каждому приложению придется работать на своей физической машине. На самом деле физические машины стоят дорого и не могут быть легко масштабированы. Поэтому, если требования приложения к ресурсам растут, его, возможно, придется переносить на новую физическую машину.

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

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

Виртуальные машины как шаг в правильном направлении

Вышеупомянутые проблемы, связанные с физическими машинами, привели к росту популярности виртуальных машин (ВМ). Основная идея заключается в интеграции слоя между аппаратным обеспечением и операционной системой или операционной системой хоста и гостевыми операционными системами. ВМ отделяет прикладную среду от базового оборудования. Конкретная комбинация операционной системы, приложения, библиотек и конфигурации может быть воспроизведена из образа. Помимо полной изоляции приложения, это позволяет разработчикам объединять несколько приложений в «устройство».

Образы виртуальных машин можно перемещать между физическими машинами, а несколько виртуализированных операционных систем могут работать параллельно. Это обеспечивает масштабируемость приложения. Однако виртуализация операционных систем требует больших ресурсов и является излишеством для простых случаев использования.

Преимущества виртуализации контейнеров с помощью Docker

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

Давайте подытожим основные преимущества виртуализации приложений на основе Docker по сравнению с использованием виртуальных машин. Контейнер Docker:

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

Оцените статью
cdelat.ru
Добавить комментарий