6924

Гайд по Docker: концепция, устройство и принцип работы

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

 

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

 

Что такое Docker

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

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

Docker появился на рынке еще в 2008 году, и изначально представлял собой внутренний проект компании dotCloud, которая позже была переименована в Docker Inc. Начиная с 2013 года Docker исходный код инструмента был открыт для сообщества.

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

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

 

Как устроен Docker, и принципы его работы

По умолчанию Docker поставляется с такими компонентами:

  • Docker host — собственная операционная система Docker, на которую он устанавливается. 
  • Docker daemon — специальная служба, которая используется для управления различными Docker-объектами, такими как сети, хранилища, образы и контейнеры.
  • Docker image — образ, который используется для выполнения кода в контейнере Docker.
  • Docker Registry — репозиторий для хранения образов.
  • Docker client — клиент, обеспечивающий взаимодействие пользователей со службой Docker daemon. Когда вы создаете нужную команду, Docker client отправляет ее в dockerd, который ее и выполняет.
  • Docker container — виртуальная среда выполнения, где пользователь может изолировать ПО от хостовой системы.
  • Dockerfile — файл с инструкцией по созданию образа.
  • Docker Compose — инструмент, обеспечивающий эффективное управление несколькими контейнерами. С его помощью можно создавать новые контейнеры и задавать им нужную конфигурацию.
  • Docker Desktop — пользовательский клиент, который дает возможность работать с Docker в средах Mac или Windows. С его помощью можно создавать и совместно использовать различные контейнерные приложения и микросервисы.

Изначально Docker создавался под операционную систему Linux. Для работы на Windows и macOS нужно запускать виртуальную машину с Linux, у уже поверх нее сам Docker. Для этого в Windows используется Hyper-V, а в macOS — VirtualBox.

При этом стоит учитывать, что работая поверх виртуалок вы существенно повышаете потребление ресурсов, а следовательно в Windows и macOS Docker работает не так быстро и с некоторыми ограничениями. В целом для разработки с этими минусами можно смириться, но в «боевых» условиях лучше использовать Linux.

Виртуализация и контейнеризация — в чем отличие

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

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

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

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

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

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

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

 

Сущности Docker

Docker способен работать с несколькими сущностями. Разберем каждую из них подробнее:

  • Docker image. Фактически это шаблон, с помощью которого создаются контейнеры. Он работает по принципу слоев: файловая система накладывается поверх слоя основной ОС, и в результате получается неизменяемый образ, в который можно установить само приложение со всеми зависимостями и конфигурациями. При этом, образы могут наследоваться. Это означает, что если мы положим поверх еще один слой файлов и закоммитим, то на выходе получим еще один неизменяемый образ.
  • Dockerfile. Здесь находятся инструкции по сборке образов, в которых подробно описано какой базовый образ использовать, какие файлы и куда поместить, и прочее.
  • Контейнер. Представляет собой runtime-сущность на основе образа. Если провести аналогию, то образ — это инсталлятор программного обеспечения, а контейнер — уже запущенное ПО. Развертывая контейнер поверх файловой системы мы получим еще один изменяемый слой, куда приложение сможет записывать данные и редактировать их. В случае удаления контейнера все данные в нем стираются, однако их можно сохранить используя volumes.
  • Docker Registry. Это система хранения и распространения Docker-образов, которая может быть как локальной, так и публичной. Она находится в репозитории Docker, и может содержать все версии определенного образа, которые идентифицируются с помощью системы тегов.

В чем польза Docker на практике

Опишем несколько вариантов использования Docker на практике, которые хорошо отражают его сильные стороны.

Создание приложений с зависимостями

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

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

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

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

Автоматизация тестирования

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

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

Публикация приложения

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

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

 

Недостатки Docker

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

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

До какого-то лимита его достаточно, но приложение, в которое включены 50-100 разных сервисов — он просто не потянет. В таких случаях приходится дополнительно использовать оркестраторы, например такие, как Kubernetes. Он представляет собой мощный слой абстракций, и практически выполняет роль гипервизора в виртуалках.

  • Трудности с использованием на Windows и macOS. Как уже говорилось выше, Docker был создан специально под Linux, из-за чего при работе в других ОС может иметь ограниченный функционал. Например, на Windows и macOS он не поддерживает некоторые типы сетей. Зачастую, этот нюанс остается незамеченным, но во время работы нужно всегда держать его в голове. Кроме того, при установке на Windows, на некоторых устройства Docker может конфликтовать с Virtual Box.

Где изучать Docker

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