Docker: введение
Docker – это открытая платформа, предназначенная для разработки, доставки и организации работы приложений.
Docker позволяет вам отделить ваши приложения от инфраструктуры так, чтобы вы могли доставлять ваше программное обеспечение максимально быстро. При помощи Docker вы можете управлять вашей инфраструктурой так же, как вы управляете вашими приложениями. Принимая все преимущества методологий Docker, направленных на доставку, тестирование и развертывание кода быстро, вы можете существенно сократить задержку между написанием кода и его работой на продуктиве.
Что такое платформа Docker?
Docker дает возможность упаковать и запустить приложение в слабо изолированном окружении, называемом контейнер. Изоляция и безопасность решения позволяют вам запускать множество контейнеров одновременно на нужном хосте. Благодаря легковесной природе контейнеров, без дополнительных затрат на гипервизор вы можете запускать больше контейнеров на доступном железе, чем если бы вы использовали виртуальные машины.
Docker предоставляет утилиты и платформу для управления жизненным циклом ваших контейнеров:
- Инкапсулируйте ваши приложения (и поддерживаемые компоненты) в контейнеры Docker
- Распространяйте и доставляйте эти контейнеры вашим командам для дальнейшей разработки и тестирования
- Разворачивайте эти приложения в вашем продуктивном окружении, что бы это ни было, локальный датацентр или облако
Что такое Docker Engine?
- Сервер, по сути являющийся долго работающим приложением, называемым демоном
- REST API, определяющее интерфейсы для взаимодействия, которые могут использовать другие программы.
- Консольный (CLI) клиент
Консольный клиент использует Docker REST API для управления или взаимодействия с демоном Docker при помощи скриптов или непосредственных консольных команд.
Демон создает и управляет объектами Docker, такими как образы (images), контейнеры, сети и тома данных (data volumes)
На заметку: Docker распространяется под открытой Apache 2.0 лицензией.
Для чего я могу использовать Docker?
Быстрая, последовательная доставка ваших приложений
Docker может упростить жизненный цикл разработки, позволяя разработчикам работать в стандартизованных окружениях, используя локальные контейнеры, в которых может работать ваше приложение или сервисы. Вы также можете интегрировать Docker в ваши процессы непрерывной интеграции (continuous integration) и непрерывной доставки (continuous deployment).
Представьте следующий примерный сценарий. Ваши разработчики пишут код локально и делятся своей работой с коллегами при помощи контейнеров Docker. Они могут использовать Docker для помещения своих приложений в тестовые среды и запуска автоматических и ручных тестов. Когда разработчики находят проблему, они могут исправить ее в разработческом окружении и повторно поместить контейнеры в тестовое окружение. Когда же тестирование завершено, доставить исправление в ПО конечному заказчику становится также просто как положить новые контейнеры в продуктивное окружение.
Адаптивная доставка и масштабируемость
Использующая контейнеры платформа Docker позволяет хорошо переносить нагрузки. Контейнеры Docker могут работать на локальной машине разработчика, на физическом или виртуальном сервере в датацентре, в Облаке, или в смешанном окружении.
Переносимость и легковесная природа Docker также позволяют просто управлять нагрузкой, масштабировать приложения и сервисы вверх или вниз настолько быстро, насколько этого требует бизнес, почти в реальном времени.
Обслуживание больших нагрузок на том же самом железе
Docker легковесен и очень быстр. Он предоставляет жизнеспособную и экономически эффективную альтернативу виртуальным машинам, запускаемым в гипервизорах, позволяя вам использовать больше ваших вычислительных мощностей для достижения ваших бизнес целей. Это особенно важно при использовании его в очень уплотненных окружениях при доставке приложений малых или средних размеров там, где необходимо сделать больше меньшими усилиями.
Архитектура Docker
Демон Docker
Демон Docker работает на хостовом сервере. Пользователь использует клиент Docker для взаимодействия с демоном.
Клиент Docker
Клиент Docker в формате исполняемого файла docker — это основной пользовательский интерфейс для Docker. Он принимает команды и конфигурационные флаги от пользователя и взаимодействует с демоном Docker. Один клиент может взаимодействовать с множеством несвязанных демонов.
Внутри Docker
Для понимания внутренностей Docker вам необходимо знать про образы (images), реестры (registries) и контейнеры (containers).
Образы Docker
Образ Docker — это шаблон в формате «только для чтения» с инструкциями для создания контейнера Docker. Например, образ может содержать в себе ОС Ubuntu с web-сервером Apache и вашим установленным внутрь web-приложением. Вы можете собрать или обновить образ с нуля, или загрузить и использовать образы, созданные другими людьми. Образ может быть основан или расширять один или более других образов. Образ Docker описан в текстовом файле Dockerfile, который имеет простой и вполне определенный синтаксис. Для получения большей информации о образах, смотрите «Как работают образы Docker?».
Образы Docker — это основной строительный компонент Docker.
Контейнеры Docker
Контейнер Docker — это запускаемый экземпляр Docker образа. Вы можете запустить, остановить, переместить или удалить контейнер, используя Docker API или консольный клиент. Когда вы запускаете контейнер, вы можете предоставить конфигурационные метаданные такие как сетевая информация или переменные окружения. Каждый контейнер — это изолированная и безопасная платформа для приложений, однако, ему может быть предоставлен доступ к ресурсам, работающим на другом хосте или контейнере, таким как постоянный сторадж (persistent storage) или база данных. Для получения большей информации о контейнерах, смотрите «Как работает контейнер?»
Контейнеры Docker — это рабочий компонент Docker.
Реестры Docker
Реестр Docker — это библиотека образов. Реестр может быть публичным, приватным, а также может быть установлен на том же сервере, что и демон или клиент Docker или же на совсем частном сервере. Для получения большей информации о реестре, смотрите Как работает реестр Docker?
Реестры Docker — это компонент распространения Docker.
Сервис Docker
Сервис Docker позволяет целому рою (swarm) Docker узлов работать одновременно, обслуживая определенное количество экземпляров реплицированной задачи (replica task), представляющей собой образ Docker. Вы можете определить количество одновременных запускаемых реплицированных задач и кластерный менеджер убедится, что нагрузка распределена You can specify the number of concurrent replica tasks to run, and the swarm manager ensures that the load is spread равномерно по рабочим узлам. Для конечного потребителя сервис Docker представляется как одно приложение. Docker Engine поддерживает режим работы swarm mode с Docker 1.12 и выше.
Сервисы Docker — это компоненты масштабирования Docker.
Как работают образы Docker?
Образы Docker — это шаблоны в формате «только чтение» из которых запускаются Docker контейнеры. Каждый образ состоит из последовательности слоев. Docker использует union file systems для объединения этих слоев в единый образ. Union FS позволяет файлам и директориям отдельных файловых систем известным как ветки (branches) быть прозрачно наложенными друг на друга, чтобы образовать единую связную файловую систему.
Эти слои одна из причин, почему Docker настолько легковесный. Когда вы изменяете образ Docker, например, в процессе обновления приложения на новую версию, собирается только новый слой, заменяет только тот слой, который обновляется. Остальные слои остаются нетронутыми. Для распространения обновления все, что вам нужно, это передать обновленный слой. Механизм работы со слоями увеличивает скорость распространения образов Docker. Docker сам определяет, какой слой должен быть обновлен в рантайме.
Образ определяется в Dockerfile. Каждый образ начинается с основного образа (base image), такого как ubuntu (основного образа ОС Ubuntu) или fedora (основного образа ОС Fedora). Вы можете также самостоятельно использовать доступные образы в качестве основы для новых, например, вам доступен базовый образ web-сервера Apache, и вы можете использовать его для всех образов ваших web-приложений. Базовый образ определяется при помощи ключевого слова FROM в Dockerfile.
Заметка: Docker Store — это публичный реестр и хранилище образов Docker
Образ Docker собирается на основе базового образа при помощи простого
The docker image is built from the base image using a simple, наглядного набора шагов, которые называются инструкциями, которые последовательно записаны в
Dockerfile
Каждая инструкция создает новый слой внутри образа. Некоторые примеры инструкций Dockerfile:
-
Определить базовый образ
FROM
-
Определить ответственного за поддержку
MAINTAINER
-
Выполнить команду
RUN
-
Добавить файл или директорию
ADD
-
Создать переменную окружения
ENV
-
Какой процесс запустить, когда будет запускаться контейнер из этого образа
CMD
Docker читает
Dockerfile
когда вы запускаете сборку (build) образа, выполняет инструкции и возвращает образ.Как работает реестр Docker?
Реестр Docker хранит Docker образы. После того как вы собрали Docker образ, вы можете отправить (push) его в публичный реестр, такой как Docker Store или приватный реестр, закрытый вашим межсетевым экраном. Вы можете также искать уже существующие образы и скачивать (pull) их из реестра на хост.
Docker Store позволяет вам не только хранить, но и покупать и продавать Docker образы. Например, вы можете купить образ Docker, содержащий приложение или сервис от какого-либо вендора программного обеспечения и использовать его в процессе разворачивания вашего приложения в тестовое, промежуточное или продуктивное окружение, а также обновлять его и ваше приложение просто скачивая (pull) новую версию доступных образов и переразворачивая ваши контейнеры.
Как работает контейнер?
В процессе своей работы контейнер использует Linux ядро хостовой машины, состоит из какого-то количества дополнительных файлов, которые были добавлены к нему в процессе его создания, а также метаданных, связываемых с контейнером в процессе его создания или когда контейнер уже запущен. Каждый контейнер собирается из образа. Образ определяет содержимое контейнера, какой процесс запустить, когда контейнер начинает работать, а также другие всевозможные подробности конфигурации. Образ Docker не изменяем. Когда Docker запускает контейнер из образа, он добавляет дополнительный слой поверх этого образа, который доступен для записи (при помощи UnionFS, как мы видели ранее).
Что происходит, когда вы запускаете контейнер?
Когда вы используете
docker run
консольную команду или эквивалентный API-вызов, клиент Docker Engine отдает задачу Docker демону на запуск контейнера. В этом примере клиент сообщает Docker демону инструкцию по запуску контейнера из ubuntu
образа Docker, -i
используется, чтобы оставаться войти в контейнер в интерактивном режиме и запустить команду /bin/bash
$ docker run -i -t ubuntu /bin/bash
Когда вы запускаете эту команду, Docker Engine выполняет следующие действия:
- Скачивает (pull) образ
Docker Engine проверяет наличие образаubuntu
в кеше на хосте, на котором работает Docker Engine. Если образ уже существует локально, Docker Engine использует его для запуска нового контейнера. В противном случае Docker Engine скачивает этот образ с Docker Store.ubuntu
- Создает новый контейнер: Docker использует указанный образ для создания контейнера.
- Выделяет место на файловой системе хоста и монтирует слой доступный для записи: Контейнер создан на файловой системе и доступный для записи слой добавлен к его образу.
- Выделяет сетевой / bridge интерфейс: Создает сетевой интерфейс, который позволяет Docker контейнеру взаимодействовать с локальным хостом, на котором установлен Docker Engine.
- Назначает IP адрес: Находит и присоединяет доступный IP-адрес из пула.
- Выполняет процесс, который вы определили: Выполняет команду
/bin/bash
- Захватывате и предоставляет вывод приложения: Подключается и логирует стандартный поток ввода, вывода и ошибок, чтобы показать вам, как исполняется ваше приложение, т.к. вы работаете в интерактивном режиме.
С текущего момента контейнер запущен. Вы можете управлять и взаимодействовать с ним, использовать сервисы и приложения, которые он предоставляет, а также при необходимости остановить и удалить его.
Базовые технологии
Docker написан на Go и использует несколько возможностей Linux ядра для реализации собственной функциональности.
Пространства имен (namespaces)
Docker использует технологию, называемую пространством имен (namespaces) для предоствления изолированного рабочего пространства, называемого контейнер. Когда вы запускаете контейнер, Docker создает набор пространств имен для этого контейнера.
Эти пространства имен организуют слой изоляции. Каждый аспект контейнера запускается в отдельном пространстве имен и его доступ ограничен этим пространством имен.
Docker Engine использует следующие пространства имен в Linux:
- Пространство имен
Изоляция процесса (PID: ID процесса).pid
- Пространство имен
Управление сетевыми интерфейсами (NET: Сеть).net
- Пространство имен
Управление доступом к IPC ресурсам (IPC: Межпроцессное взаимодействие).ipc
- Пространство имен
Управление точками монтирования файловой системы (MNT: Монтирование).mnt
- Пространство имен
Изолирование идентификаторов ядра и версий. (UTS: Unix система разделения времени).uts
Группы управления (control groups)
Docker Engine в Linux также основывается на другой технологии, называемой группами управления
cgroups
Каждая cgroup лимитирует приложение в доступе к определенному набору ресурсов. Группы управления позволяют Docker Engine разделять доступные аппаратные ресурсы между контейнерами и при необходимости применять лимиты и ограничения. Например, вы можете ограничить определенному контейнеру доступную оперативную память.
Union FS
Файловая система Union или UnionFS — это файловая система, которая работает путем создания слоев, делая их оучень легковесными и быстрыми. Docker Engine использует UnionFS как «строительные блоки» для контейнеров. Docker Engine может использовать множество различных реализаций UnionFS, т.к. AUFS, btrfs, vfs, а также DeviceMapper.
Формат контейнеров
Docker Engine объединяет пространства имен, группы управления и UnionFS в обертку (wrapper), называемую контейнерным форматом. Основной формат контейнеров — это
libcontainer
В будущем Docker возможно будет поддерживать другие форматы контейнеров, интегрируясь с такими технологиями как BSD Jails или Solaris Zones.