Что такое Docker и технология контейнеров Linux

Как и FreeBSD Jails и Solaris Zones, контейнеры Linux — независимые среды выполнения с собственными центральным процессором, памятью, блоком ввода-вывода и сетевыми ресурсами, которые используют ядро гостевой ОС. На выходе вы получаете что-то вроде виртуальной машины, которая работает как надстройка гостевой ОС.

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

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

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

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

Контрольные группы Linux управляют изолированием и использованием системных ресурсов — центральным процессором, памятью, — для группы процессов. Например, если ваше приложение занимает много циклов ЦП и памяти, вы можете поместить его в контрольную группу, чтобы ограничить использование памяти и ЦП.

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

От LXC до Docker

Оригинальная технология контейнеров Linux называется Linux Containers, или LXC.
LXC — это метод виртуализации на уровне ОС предназначенный для того, чтобы запускать множество изолированных систем Linux на одном хосте.

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

Так как операционная система отделена от контейнеров, вы можете перемещать контейнер на любой Linux-сервер, который поддерживает операционную среду контейнера.

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

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

Тестируйте VPS-сервер первые 30 дней за $1
  • Память: 4096 МБ
  • Диск: 50 ГБ SSD
  • Трафик: Безлимит
  • CPU: 2 ядра

Давайте рассмотрим Docker детальнее и посмотрим, чем Docker отличается от LXC в разделе ниже.

Технология контейнеризации Docker

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

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

Единственный процесс vs множество процессов

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

Чтобы запустить простое многоуровневое веб-приложение в Docker, вам понадобится PHP контейнер, Nginx контейнер (веб-сервер), MySQL контейнер (для процесса базы данных) и несколько контейнеров данных для того, чтобы хранить таблицы баз данных и другую информацию приложения.

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

У однопроцессных контейнеров также есть ограничения. Например, вы не можете запускать агенты, скрипты регистрации или автоматически запускаемые SSH-процессы внутри контейнера. Также нелегко незначительно обновлять однопроцессный контейнер на уровне приложения. Вам придется запускать новый обновленный контейнер.

Бесструктурность vs структурность

Контейнеры Docker сделаны так, чтобы быть более бесструктурными, чем LXC.

Во-первых, Docker не поддерживает внешнее хранилище. Docker обходит это тем, что позволяет вам подключать хранилище хоста в качестве тома Docker из ваших контейнеров. Так как тома подключаются, они не считаются частью среды контейнера.

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

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

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

Портативность

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

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

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

Архитектура, разработанная для программистов

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

Источник: статья в издании InfoWorld

Валерия

Руковожу контент-направлением, работаю в сфере маркетинга и редактуры 4 года.