Введение в Docker

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

Что из себя представляет платформа Docker?

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

Докер предоставляет инструменты и платформу для управления жизненным циклом контейнеров:

  • Поместите ваши приложения (и вспомогательные компоненты) в контейнеры Docker
  • Расшарьте эти контейнеры вашей команде для дальнейшего развития и тестирования
  • Разворачивайте свои приложения в производственной среде, будь то локальный компьютер, дата центр или облако

Что такое Docker Engine?

Docker Engine клиент-серверное приложение с тремя главными компонентами:

  • Сервер работающий в фоновом режиме (демон).

  • REST API, который используют программы для взаимодействия с сервером.

  • Интерфейс командной строки (CLI) клиент.

Docker Engine Components Flow

CLI использует Docker REST API для управления или взаимодействия с демоном Докер с помощью сценариев или непосредственно команд CLI. Многие другие приложения Docker основаны на использовании API и CLI

Демон создает и управляет объектами Docker, такими как образы, контейнеры, сети и хранилища данных.

Примечание: Docker распространяется под лицензией с открытым исходным кодом по лицензии Apache 2.0.

Для чего Docker может быть использован?

Быстрая, последовательная доставка приложений

Докер может упростить жизненный цикл разработки, позволяя разработчикам работать в стандартных условиях с использованием местных контейнеров, которые предоставляют свои приложения и сервисы. Вы также можете интегрировать Docker в вашу систему интеграции и деплоя (CI / CD).

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

Простое развертывание и масштабирование

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

За счет портативности и легкости Docker позволяет динамически управлять рабочей нагрузкой и масштабированием приложений и сервисов так как того требует бизнес почти в реальном времени.

Выдерживает больше нагрузок на том же оборудовании

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

Архитектура Docker

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

Docker Architecture Diagram

Демон

Демон Docker работает на хост-машине. Пользователь использует клиент Docker для взаимодействия с демоном.

Клиент

Клиент Докер – это двоичный файл docker, который является основным пользовательским интерфейсом. Он принимает команды и конфигурационные флаги от пользователя и отправляет их демону. Один клиент может взаимодействовать с несколькими разными демонами.

Устройство Docker

Что бы разобраться в устройстве Docker вам нужно ознакомиться с образами, реестром и контейнерами.

Образы

Образ в Докер является шаблоном только для чтения с набором инструкций для создания контейнера. К примеру, образ может состоять из операционной системы Ubuntu, веб-сервера Apache и вашего веб-приложения. Вы можете собрать образ с нуля, обновить или загрузить и использовать образы, созданные другими пользователями. Образ может быть самодостаточным или являться дополнением другого образа. Образ Docker описывается в специальном текстовом файле с именем Dockerfile, который имеет простой и понятный синтаксис. Для большей информации об образах, читайте Устройство Docker образа.

Образы в Docker являются компонентом сборщиком.

Контейнеры

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

Контейнеры являются исполняемыми компонентами Docker.

Реестр

Реестр – это библиотека образов. Он может быть публичным или приватным и может располагаться на одном сервере с демоном, клиентом или на на отдельном сервере. Для большей информации о реестре, читайте Как работает реестр Docker?

Реестр – компонент дистрибуции Docker.

Сервисы

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

Сервисы компонент масштабирования Docker.

Как работают образы Docker?

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

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

Образ определяется в файле Dockerfile. Каждый образ начинается с базового образа, такого как Ubuntu или Fedora. Вы можете также использовать собственные образы как базовые для создания новых, к примеру если вы имеете базовый образ Apache вы можете использовать его как базовый для вашего веб-приложения. Базовый образ задается командой FROM в dockerfile.

Примечание: Docker Hub публичный реестр образов.

Докер образ строится из базового образа, используя простой набор пошаговых инструкций, хранящихся в файле Dockerfile. Каждая инструкция создает новый слой в образе. Вот несколько примеров инструкций для Dockerfile:

  • Задает базовый образ (FROM)
  • Указывает автора (MAINTAINER)
  • Выполнение команды (RUN)
  • Добавить файл или директорию (ADD)
  • Создает переменную окружения (ENV)
  • Запускает указанный процесс при старте контейнера (CMD)

Докер читает Dockerfile, когда вы запрашиваете сборку образа, выполняет инструкции и возвращает образ.

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

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

Docker Hub публичный реестр с огромной коллекцией образов с возможностью добавить свой собственный. Для большей информации читайте Docker Registry и Docker Trusted Registry.

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

Как работают контейнеры?

Контейнер использует Linux ядро хост-машины, и состоит из каких-либо дополнительных файлов, которые вы добавляете, когда создается образ, вместе с метаданными, ассоциируемыми с контейнером при его создании или запуске. Каждый контейнер построен из образа. Образ определяет содержимое контейнера, какие процессы запускать при старте контейнера и множество других деталей конфигурации. Образ доступен только для чтения. Когда Docker запускает контейнер из образа, он добавляет слой для чтения-записи поверх образа (это необходимо для UnionFS как мы увидим позднее) в котором выполняется ваше приложение.

Что происходит при запуске контейнера?

Когда вы используете консольную команду docker run или эквивалентное API, Docker Engine клиент дает команду демону запустить контейнер. Этот пример запускает контейнер из образа ubuntu, в интерактивном режиме (-i) и запускает /bin/bash.

$ docker run -i -t ubuntu /bin/bash

Когда вы выполняете эту команду происходит следующее:

  1. Загрузка образа ubuntu: Docker Engine проверяет существование образа ubuntu. Если образ уже существует локально, Docker использует его для нового контейнера. В противном случае образ загружается с Docker Hub.

  2. Создается новый контейнер: Докер использует образ для создания контейнера.

  3. Размечается файловая система и слой для чтения-записи:Контейнер создан в файловой системе и слой чтения-записи добавлен к образу.

  4. Создание сети / интерфейс моста: Создается сетевой интерфейс который позволяет контейнеру общаться с локальным хостом.

  5. Выделение IP адреса: Поиск и присвоение доступного IP.

  6. Запуск указанного процесса: Выполняет процесс /bin/bash.

  7. Захват ввода/вывода приложения: Подключение стандартного ввода/вывода и логирование ошибок что бы вы могли видеть как приложение работает, поскольку вы указали интерактивный режим.

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

Базовая технология

Docker написан на Go и использует несколько особенностей ядра Linux.

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

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

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

Использование пространств имен на примере Linux:

  • pid: Изоляция процессов (PID: ID процесса).
  • net: Управление сетевыми интерфейсами (NET: сеть).
  • ipc: Управление доступом к IPC ресурсам (IPC: InterProcess Communication).
  • mnt: Управление файловой системой (MNT: файловый ресурс).
  • uts: Изоляция ядра и идентификаторов версий. (UTS: Unix Timesharing System).

Control groups

Docker Engine также использует в Linux другую технологию, называемую контрольными группами (cgroups). Cgroup ограничивает доступ приложения к определенным наборам ресурсов. Контрольные группы позволяют Docker Engine разделить имеющиеся аппаратные ресурсы для контейнеров и при необходимости устанавливать лимиты. К примеру, вы можете ограничить память, доступную для определенного контейнера.

Объединенные файловые системы

Объединенная файловая система или UnionFS, файловая система управляющая созданием слоев, делает их очень легкими и быстрыми. Докер использует UnionFS для обеспечения построения блоков для контейнеров. Docker может использовать множество UnionFS вариантов, таких как AUFS, btrfs, vfs и DeviceMapper.

Формат контейнеров

Docker Engine сочетает в себе пространства имен, группы управления и UnionFSв специальную обертку называемую форматом контейнера. Форматом по умолчанию для контейнеров является libcontainer. В будущем, Docker сможет поддерживать другие форматы контейнеров за счет интеграции технологий BSD Jails или Solaris Zones.

Следующий шаг


Комментарии:

Комментариев нет, желаете стать первым?

Пожалуйста, авторизуйтесь что бы оставлять комментарии.