Что такое докер? Искра контейнерной революции

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

Что такое контейнеры?

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

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

Докер

Что такое докер?

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

Dockerfile

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

Пейдж Нидрингхаус из ITNext хорошо разбирает синтаксис Dockerfile.

Образ докера

После того, как вы написали свой Dockerfile, вы вызываете buildутилиту Docker, чтобы создать образ на основе этого Dockerfile. В то время как Dockerfile - это набор инструкций, которые объясняют, buildкак создать образ, Docker-образ - это переносимый файл, содержащий спецификации, для каких программных компонентов контейнер будет запускаться и как. Поскольку файл Dockerfile, вероятно, будет включать инструкции по получению некоторых пакетов программного обеспечения из онлайн-репозиториев, вам следует позаботиться о том, чтобы явно указать правильные версии, иначе ваш файл Dockerfile может создавать несовместимые изображения в зависимости от того, когда он вызывается. Но как только изображение создано, оно статично. Codefresh предлагает более подробно изучить, как создать образ.

Докер запустить

runУтилита Docker - это команда, которая фактически запускает контейнер. Каждый контейнер - это экземпляр изображения. Контейнеры спроектированы как временные и временные, но их можно останавливать и перезапускать, что переводит контейнер в то же состояние, в котором он был остановлен. Кроме того, несколько экземпляров контейнера одного и того же изображения могут запускаться одновременно (при условии, что каждый контейнер имеет уникальное имя). Code Review содержит подробное описание различных параметров runкоманды, чтобы вы могли понять, как она работает.

Докер Хаб

Хотя создавать контейнеры легко, не думайте, что вам нужно будет создавать все ваши изображения с нуля. Docker Hub - это репозиторий SaaS для совместного использования и управления контейнерами, где вы найдете официальные образы Docker из проектов с открытым исходным кодом и поставщиков программного обеспечения, а также неофициальные образы от широкой публики. Вы можете загрузить изображения контейнеров, содержащие полезный код, или загрузить свои собственные, поделиться ими открыто или вместо этого сделать их частными. Вы также можете создать локальный реестр Docker, если хотите. (В прошлом у Docker Hub были проблемы с изображениями, которые были загружены со встроенными в них бэкдорами.)

Docker Engine

Docker Engine - это ядро ​​Docker, базовой технологии клиент-сервер, которая создает и запускает контейнеры. Вообще говоря, когда кто-то говорит о Docker в общем и не говорит о компании или проекте в целом, они имеют в виду Docker Engine. Предлагаются две разные версии Docker Engine: Docker Engine Enterprise и Docker Engine Community.

Docker Community Edition

Docker выпустил свой выпуск Enterprise Edition в 2017 году, но его исходное предложение, переименованное в Docker Community Edition, остается бесплатным, с открытым исходным кодом и не теряет при этом никаких функций. Вместо этого Enterprise Edition, который стоит 1500 долларов за узел в год, добавил расширенные функции управления, включая элементы управления кластером и образами, а также мониторинг уязвимостей. Блог BoxBoat содержит краткое изложение различий между версиями.

Как Docker покорил контейнерный мир

Идея о том, что данный процесс может выполняться с некоторой степенью изоляции от остальной операционной среды, была встроена в операционные системы Unix, такие как BSD и Solaris, на протяжении десятилетий. Первоначальная контейнерная технология Linux, LXC, представляет собой метод виртуализации на уровне ОС для запуска нескольких изолированных систем Linux на одном хосте. LXC стал возможным благодаря двум функциям Linux: пространствам имен, которые обертывают набор системных ресурсов и представляют их процессу, чтобы он выглядел так, как будто они предназначены для этого процесса; и cgroups, которые управляют изоляцией и использованием системных ресурсов, таких как ЦП и память, для группы процессов.

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

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

Docker Compose, Docker Swarm и Kubernetes

Docker также упрощает координацию поведения между контейнерами и, таким образом, создает стеки приложений, объединяя контейнеры вместе. Docker Compose был создан Docker для упрощения процесса разработки и тестирования многоконтейнерных приложений. Это инструмент командной строки, напоминающий клиент Docker, который принимает специально отформатированный файл дескриптора для сборки приложений из нескольких контейнеров и их согласованного запуска на одном хосте. (Ознакомьтесь с руководством по Docker Compose, чтобы узнать больше.)

Более продвинутые версии этого поведения - так называемая оркестровка контейнеров - предлагаются другими продуктами, такими как Docker Swarm и Kubernetes. Но Докер предоставляет основы. Несмотря на то, что Swarm вырос из проекта Docker, Kubernetes стал де-факто предпочтительной платформой для оркестровки Docker.

Преимущества докера

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

Контейнеры Docker обеспечивают изоляцию и регулирование

Контейнеры Docker изолировали приложения не только друг от друга, но и от базовой системы. Это не только делает программный стек более чистым, но и упрощает определение того, как конкретное контейнерное приложение использует системные ресурсы - ЦП, графический процессор, память, ввод-вывод, сеть и т. Д. Это также упрощает разделение данных и кода. (См. «Контейнеры Docker без сохранения состояния и неизменяемость» ниже.)

Контейнеры Docker обеспечивают переносимость

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

Например, контейнер MySQL для Linux будет работать практически в любой системе Linux, поддерживающей контейнеры. Все зависимости для приложения обычно доставляются в одном контейнере.

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

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

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

Контейнеры Docker обеспечивают возможность компоновки

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

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

Контейнеры Docker упрощают оркестровку и масштабирование

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

Большинство версий инструментов корпоративного уровня для развертывания, управления и масштабирования контейнеров предоставляются сторонними проектами. Главный из них - Kubernetes от Google, система для автоматизации развертывания и масштабирования контейнеров, а также их соединения, балансировки нагрузки и управления. Kubernetes также предоставляет способы создания и повторного использования определений многоконтейнерных приложений или «диаграмм Helm», чтобы можно было создавать сложные стеки приложений и управлять ими по запросу.

Docker также включает собственную встроенную систему оркестровки, режим Swarm, который по-прежнему используется для менее требовательных случаев. Тем не менее, Kubernetes стал чем-то вроде выбора по умолчанию; фактически Kubernetes входит в состав Docker Enterprise Edition.

Предостережения Docker

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

Контейнеры Docker - это не виртуальные машины

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

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

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

Контейнеры Docker не обеспечивают скорость на чистом металле