Skip to content

Docker

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

Идея контейнеризации

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

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

Впервые идея контейнеризации была реализована в Linux или LXC, это случилось достаточно давно, но лишь недавно обрела популярность благодаря Docker. Docker – это технология с открытым исходным кодом, внесшая несколько изменений в контейнеры Linux, чтобы сделать их более переносимыми, простыми в использовании и гибкими. С этой целью был реализован набор утилит, которые обеспечивают переносимость и гибкость контейнеров. Эти утилиты позволяют легко создавать, передавать, копировать и запускать контейнеры. Контейнеры Docker помогают преодолеть большинство недостатков виртуальных машин.

Различия между контейнерами Linux и Docker:

  • процессы. В одном контейнере Linux (LXC) можно запустить несколько процессов, тогда как в контейнере Docker может выполняться только один процесс. Если приложение состоит из нескольких процессов, необходимо создать соответствующее количество контейнеров Docker. Даже при условии того, что такое решение порождает проблему управления контейнерами, оно обеспечивает огромную гибкость прикладной системы. Поскольку каждый процесс выполняется в отдельном контейнере, есть возможность управлять процессами и изменять их поведение по отдельности. Это ключевое преимущество, прекрасно согласующееся с идеей микросервисов, когда каждая служба действует автономно и в отдельном процессе;
  • постоянное хранилище. Контейнеры Docker не имеют своего состояния, т. к. не поддерживают собственного постоянного хранилища. При необходимости вы должны сами подключить такое хранилище, например docker volume;
  • переносимость. Docker обеспечивает большую переносимость, чем LXC, что и объясняет популярность этой технологии. При использовании LXC переносимость не гарантируется, т. е. при перемещении контейнера LXC с одного хоста на другой он может работать с ошибками из-за различий между конфигурациями серверов. Docker, напротив, гарантирует беспроблемную переносимость, потому что лучше, чем LXC, изолирует приложение от таких деталей, как настройки операционной системы, сетевой подсистемы и хранилища. Закончив разработку и тестирование, программист может создать образ, который гарантированно будет работать после загрузки и запуска в эксплуатационном окружении. Это самая большая сложность, которую устраняют контейнеры Docker, упрощая жизнь инженеров.

Изоляция и инкапсуляция

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

Архитектура и компоненты Docker

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

  • Сервер, или демон Docker. Выполняется в хост-системе и управляет всеми запущенными контейнерами
  • Контейнеры. Автономная виртуальная система, содержащая выполняющийся процесс, все файлы, зависимости, адресное пространство процесса и сетевые порты, необходимые приложению. Контейнеры используют общее ядро операционной системы, но разделены на уровне файловой системы и сети.
  • Образ Docker - это шаблон для создания контейнеров. Образ содержит файловую систему и метаданные, которые описывают, как запускать контейнер. Образы могут быть сохранены, перенесены и использованы для развертывания новых контейнеров.
  • Dockerfile - это текстовый файл, который содержит инструкции для создания Docker-образа. Он описывает, какой базовый образ использовать, какие зависимости установить, какие файлы скопировать и другие действия для настройки образа.
  • Docker Hub - это репозиторий для образов Docker, доступных для скачивания и использования. Это позволяет совместно использовать и переиспользовать готовые образы.
  • Docker Compose - это инструмент для определения и запуска многоконтейнерных приложений с помощью файла конфигурации docker-compose.yml.
  • Docker network Устройство сети в docker.
  • Docker storage Устройство системы хранения в docker.
  • Docker secrets Docker умеет надежно хранить секреты.

Полезная информация

Дополнительные ссылки