Продолжение цикла статей о виртуализации. Далее поговорим о таком инструменте как Docker. Он предназначен для создания создания виртуальной инфраструктуры с помощью создания контейнеров (подробнее о контейнерах см. в предыдущей статье Виртуальные машины vs контейнеры).
Основные понятия, используемые в Docker
В Docker контейнеры создаются из образов. Образ – это шаблон, который включает в себя те же элементы, что и контейнер (код приложения, системные библиотеки и т.д.) и позволяет создавать одинаковые контейнеры на любых физических машинах, где установлен Docker. Отличие между образом и контейнером заключается в том, что образ – готовый к копированию набор файлов, тогда как контейнер - это процесс, который может быть изменен, запущен или остановлен. Образ всегда остается неизменным (если его изменить, то мы получим новый образ, унаследованный от исходного), тогда как контейнер можно изменить (например, запустить от имени определенного пользователя).
Образы редко создаются с нуля. В сети Интернет можно найти хранилища (их также называют реестрами) с готовыми образами, которые могут быть скачаны и использованы для создания контейнеров без каких-либо изменений. Самым известным из таких реестров является Docker Hub.
Говоря об образах Docker, нужно упомянуть о таких неразрывно связанных с ним сущностях как слой и Dokerfile.
Каждый Docker-образ включает в себя слои. Слой – это файл с набором инструкций о том, какие файлы необходимо использовать для создания образа. Слои организованы в строгую иерархию. На самой вершине этой иерархии находится базовый слой, который описывает, какие файлы должны быть использованы изначально. Если над базовым слоем появляется дочерний, то файл с инструкциями дочернего слоя описывает, какие изменения должны быть внесены в базовый набор файлов. То есть, каждый дочерний слой описывает изменения для родительского слоя. Все слои образа защищены от записи. Для кастомизации контейнера при его создании Docker создает новый слой, в котором хранятся внесенные изменения. Наличие изменяемого слоя является еще одним отличием образа от контейнера.
То, какие слои и в какой последовательности они должны быть наложены при создании контейнера, указано в Dockerfile. Именно наличие Dockerfile превращает набор файлов в образ, с которым может работать платформа Docker.
Компоненты платформы Docker
Основные компоненты платформы Docker представлены на рисунке ниже.
- Клиент – нечто, что способно отправлять http-запросы к машине, на которой установлен Docker-демон. Клиентом может быть браузер, мобильное приложение, системный процесс на сервере и т.д.
- Хост – физическая или виртуальная машина с установленной на ней ОС и Docker-демоном. Касательно ОС, поскольку Docker использует для своей работы механизмы Linux, то либо необходимо использовать эту в ОС в качестве ОС хоста, либо установить на хост виртуальную машину с ОС Linux.
- Docker-демон – процесс, запускаемый платформой Docker на хосте. Демон создает Docker-объекты (сети, хранилища, образы и контейнеры), которые затем используются для в процессе работы контейнеров.
- Контейнер (Docker-container) – экземпляр процесса, службы или приложения, которые созданы из образа и функционируют в рамках своего окружения. При масштабировании из одного образа создаются несколько контейнеров, причем эти контейнеры могут быть запущены с разными параметрами.
- Образ (Docker-image) – набор файлов, в который входят файлы приложения, а также зависимые файлы (библиотеки, файлы конфигурации и т.д.), необходимые для дальнейшего развертывания и инициализации контейнера.
- Реестр (Registry) – зарезервированный сервер, используемый для хранения docker-образов.
Структура ядра Docker
Ядром платформы Docker является так называемый Docker Engine, который отвечает за запуск Docker-демона, а также за обеспечение связи между основными Docker-объектами (реестром, образами и контейнерами). Он схематически представлен на рисунке снизу.
Тома (data volumes) – это файлы или каталоги, которые существуют внутри созданной ядром Docker каскадной файловой системы (union file system). Ее отличие от обычной файловой системы заключается в том, что благодаря ей контейнеры могут совместно использовать одни и те же хранящиеся на хосте файлы и папки. Это могут быть как файлы, необходимые для создания контейнера, так и файлы, с которыми работают запущенные контейнеры.
Алгоритм работы Docker
Подводя некоторый итог всему вышесказанному, опишем алгоритм запуска Docker-контейнера. Он выглядит следующим образом:
- Docker Engine смотрит, существует ли указанный в Docker-файле образ на локальной машине. При его отсутствии образ скачивается из реестра.
- Docker Engine создает контейнер из образа.
- Выполняется разметка файловой системы и добавление слоя для записи.
- Создается сетевой интерфейс для доступа к контейнеру.
- Контейнеру присваивается IP-адрес.
- Запускаются находящиеся в контейнере приложения.
В следующей статье я расскажу о кластеризации и оркестрации компонентов виртуальной инфраструктуры.
Предыдущие статьи цикла: