Контейнеры от компании Docker произвели настоящую революцию в разработке, тестировании и развёртывании приложений. Хотя вовсе не она изобрела Linux-контейнеры. Ведь LXC и OpenVZ появились раньше под Linux, а до них много лет существовали Jails/Zones в BSD/Solaris.
Но именно Docker представил контейнеры в виде удобного и простого «массового продукта». Примерно как Apple позаимствовала идеи MP3-плеера и смартфона и доработала их. То же самое сделал Docker. Хотя не довёл дело до конца, то есть до получения прибыли.
Сейчас компания Docker разваливается на глазах. Однако Linux-контейнеры отлично работают и без неё, это же опенсорс.
Компания, которую мы сейчас знаем как Docker, была основана в 2008 году и называлась DotCloud. Она предлагала клиентам облачную платформу как сервис (PaaS). Но спустя пять лет компания кардинально изменила бизнес-модель, выкатив низкоуровневую технологию, на которой работает DotCloud, как отдельный продукт. Основатели говорят, что пользователи всё время спрашивали про этот движок и хотели получить его отдельно. Вот и получили.
Так появились контейнеры Docker. На видео — историческая презентация Соломона Хайкса «Будущее контейнеров Linux» на конференции PyCon в марте 2013 года.
Идея заключалась в том, чтобы упаковать все необходимые приложения, библиотеки, скрипты, тесты и настройки в портативный «контейнер», который можно поставить на любую машину под Linux — а потом очень легко запустить. Он будет работать одинаково везде, потому что изолирован на уровне процессов и имеет собственную файловую систему.
Сравнение традиционной виртуализации (слева) и контейнеров Docker
Например, у нас пара контейнеров:
$ docker images
NAME ID CREATED
base fad7c890e7ca7be4 2 days ago
busybox c5860e37a1bcb678 20 hours ago
Мы просто пишем команду на исполнение с указанием имени контейнера, а Docker делает всё остальное: запускает контейнер, поднимает нужный софт, например, базы данных, веб-сервер, тесты, выполняет заданную команду — и возвращает результат без каких-либо лишних телодвижений:
$ docker run -a busybox echo hello world
hello world
Это была настоящая магия для своего времени, настолько просто всё делалось. Максимальная автоматизация. Контейнеры поднимаются и выключаются по заданным условиям, по очереди, в цепочке выполнения один за другим или группами, как угодно. Это позволяет настраивать удивительно сложные процессы без особых навыков девопса. Можно скачать готовый и настроенный контейнер из каталога — и запустить у себя.
Более 100 000 контейнеров в каталоге Docker Hub, у некоторых более 1 млрд скачиваний
Опенсорсный проект быстро набрал популярность у разработчиков и получил поддержку крупных вендоров, таких как Microsoft, IBM и Red Hat. Революция контейнеров началась.
Если разбить на составляющие, то Docker включает в себя текстовый файл Dockerfile (набор инструкций), образы контейнеров (исполняемые файлы с инструкциями по созданию контейнера), утилиту командной строки run, репозиторий контейнеров Docker Hub, движок Docker Engine (демон dockerd для управления контейнерами, API), утилиту Docker Compose (запуск приложений с несколькими контейнерами) и приложение Docker Desktop, которое объединяет в себе всё вышеперечисленное.
Дополнительную популярность Docker получил после выхода Docker Desktop для Windows и macOS в 2016 году, хотя основное использование контейнеров осталось под Linux.
Под Linux для работы с Docker можно выбрать один из GUI-клиентов, в том числе официальный клиент (бывший Kitematic), DockStation (разработчики Игорь Лозовский и Павел Лозко), Portainer или Dockly.
Portainer
Благодаря Docker гораздо проще стало разрабатывать и поддерживать приложения, а также перемещать их с сервера на сервер. Например, переместить приложение из облака на сервер у себя дома, к хостеру на VPS и так далее. Это даёт разработчикам ряд преимуществ.
Контейнеры Docker — это минимализм. Ничего лишнего, полная изоляция приложений и окружения. Docker обеспечивает совместимость. Контейнеры — строительные блоки с легко заменяемыми частями, что позволяет ускорить разработку.
Поскольку контейнеры маленькие, можно запускать их в большом количестве для лучшего масштабирования сервисов. Затем этими кластерами контейнеров обычно управляют с помощью Kubernetes или вручную.
Контейнеры решают множество проблем, но есть и недостатки. Программы в контейнере не так хорошо изолированы от окружения хоста, как в виртуальной машине. И движок контейнеров отнимает ресурсы на сервере, так что программы работают медленнее, чем на голом железе.
Контейнеры ничего не сохраняют, это неизменяемые read-only модули. Они загружаются и запускаются из образа, который описывает их содержимое. По умолчанию этот образ неизменен и не сохраняет своё состояние. Когда контейнер стирается из памяти, он исчезает навсегда. Чтобы сохранить состояние, как у виртуальной машины, необходимо разработать специальное решение.
Рост популярности и количества контейнеров изменил способы создания приложений — вместо монолитных стеков стали чаще использоваться сети из микросервисов, которые работают в облаке. Вскоре некоторым пользователям понадобились инструменты оркестровки и управления большими группами контейнеров.
Компания Docker разработала инструмент оркестровки Swarm, но он не выдержал конкуренции с Kubernetes от Google. А именно на этот инструмент в составе Docker Enterprise Edition (EE) делалась ставка по монетизации.
В итоге на фоне растущих проблем с финансированием пришлось продать Docker Enterprise Edition (EE) компании Mirantis в 2019 году.
Останки Docker — оригинальный движок Docker Engine с открытым исходным кодом, хранилище образов Docker Hub и приложение Docker Desktop — продолжают жить под руководством ветерана компании Скотта Джонстона. Но он продал ту часть, которая приносила деньги. Приходится как-то переориентировать бизнес, чтобы зарабатывать на опенсорсе.
В рамках новой политики в августе 2021 года приложение Docker Desktop стало платным для больших компаний. Подписку Docker Free переименовали в Docker Personal. И это только начало.
Сегодня Docker ещё жив, но компания не смогла добиться успеха и продала прибыльную половину бизнеса. Это не сулит ничего хорошего для оставшихся проектов Docker Community Edition (CE). Поддержка Docker Swarm уже втихую прекращена без объявлений.
Тем временем разработчики и пользователи начали искать возможные альтернативы для Docker.
В принципе, альтернатив не так уж и много, и это смотря что считать альтернативой.
Podman (Pod Manager) чуть посложнее Docker, но зато спроектирован в соответствии с «философией Unix».
Запуск некоторых контейнеров потребует дополнительной настройки. Например, для БД придётся немного подредактировать iptables, тогда как контейнер Docker с этой БД сразу открывается в интернет.
Установка на Ubuntu:
sudo apt-get -y update
sudo apt-get -y install podman
Поиск образов в каталоге Podman:
$ podman search nginx
Скачиваем нужный:
$ sudo podman pull nginx
Советы по миграции с Docker на Podman под Windows и Mac см. здесь.
Для простых систем с Linux-контейнерами это вполне приемлемая замена Docker.
В последнее время появляются облачные сервисы нового типа, где можно поднимать приложения, базы данных и даже работать с контейнерами Docker без самого Docker. Например, Fly.io, Stackpath, Deno.land, Vercel.app. Возможно, будущее именно за такими сервисами.
По факту контейнер создаётся и запускается в облаке за пару минут. При этом пользователь может не понимать, что он создаёт контейнер и редактирует Dockerfile, поскольку он не работает напрямую с Docker.
Даже если пользователь загружает свой контейнер Docker, для его запуска нативный движок не используется. Образы контейнеров разбираются на части и трансформируются в микро-VM Firecracker.
В этом примере мы видим «контейнеры Docker без Docker». То есть образы Docker в формате OCI используются просто как универсальный носитель для переноса файлов с одного хостинга на другой, а там из образов извлекают все полезные данные и используют в более удобном формате, уже без Docker.
На каждом сервере fly.io работает инстанс containerd.
За последние десятилетия в ядре Linux значительно доработан уровень блочных устройств. Менеджер логических томов LVM2 способен объединять или разбивать блочные устройства на синтетические. При этом объём рассматривается как абстракция. Блочное устройство 1 ТБ можно разбить на тысячу синтетических по 5 ГБ (если мы не используем это место). Можно создавать снапшоты в другом синтетическом устройстве и совместно использовать эти блоки между связанными устройствами с семантикой копирования при записи.
Сontainerd запускается как демон в Linux, он использует перечисленные функции LVM2, поддерживает формат контейнеров OCI и может работать вообще в любой экосистеме, как показано на диаграмме.
Компания Docker начинала разрабатывать проект containerd в 2014 году как низкоуровневый менеджер для движка Docker, но потом отдала его сообществу. Разработку взяла на себя организация Cloud Native Computing, которая в 2019 году выпустила его как открытый стандарт для любых облачных платформ и разных ОС.
Пример Fly.io и других хостеров показывает, что можно деплоить приложения из контейнеров OCI и при этом не использовать Docker вообще.
В качестве альтернативы Docker Desktop некоторые пробуют Minikube, см. инструкции по установке.
Контейнеры Docker стали фактически корпоративным стандартом для развёртывания приложений. Это произошло очень стремительно. Docker можно назвать одной из самых быстро принятых технологий нового поколения.
Бывшие сотрудники и разработчики Docker говорят, что главной ошибкой была недооценка Kubernetes. Они считали, что система Kubernetes слишком сложная, в ней никто не разберётся и людям больше по вкусу придётся нативный оркестратор Docker Swarm, очень простой в использовании, с маленькой и ясной документацией.
Возможно, причина ещё и в плохом маркетинге: некоторые пользователи Kubernetes не знали существовании Docker Swarm.
Кроме того, была проблема личных комплексов и фундаментального эго. Элитные разработчики Google с некоторой долей презрения смотрели на программистов из стартапа Docker, поскольку у тех было хуже образование, меньше опыт и общий уровень IQ. В ответ на такое отношение разработчики Docker не смогли нормально сотрудничать с сообществом Kubernetes и создать единую экосистему. Они всё хотели сделать по-своему и похоронить надменного конкурента.
Но рынок выбрал Kubernetes. Эта ошибка и привела к провалу бизнеса Docker, который пытались построить вокруг Docker Swarm.
Сейчас кажется, что технология контейнеров выходит с пика хайпа на плато продуктивности. Становится понятно, что это не универсальное решение, а специализированное для небольшого ряда задач. Оркестрация вообще нужна только крупным корпорациям.
В большинстве обычных ситуаций проще поднять дешёвый VPS или домашний сервер с systemd, чем возиться с контейнерами Docker, Swarm или Kubernetes на постоянной основе.
В то же время для разработки Docker незаменим. Согласно опросу Stack Overflow, в 2021 году 49% разработчиков регулярно используют Docker Desktop.
Но именно Docker представил контейнеры в виде удобного и простого «массового продукта». Примерно как Apple позаимствовала идеи MP3-плеера и смартфона и доработала их. То же самое сделал Docker. Хотя не довёл дело до конца, то есть до получения прибыли.
Сейчас компания Docker разваливается на глазах. Однако Linux-контейнеры отлично работают и без неё, это же опенсорс.
Компания, которую мы сейчас знаем как Docker, была основана в 2008 году и называлась DotCloud. Она предлагала клиентам облачную платформу как сервис (PaaS). Но спустя пять лет компания кардинально изменила бизнес-модель, выкатив низкоуровневую технологию, на которой работает DotCloud, как отдельный продукт. Основатели говорят, что пользователи всё время спрашивали про этот движок и хотели получить его отдельно. Вот и получили.
Так появились контейнеры Docker. На видео — историческая презентация Соломона Хайкса «Будущее контейнеров Linux» на конференции PyCon в марте 2013 года.
Идея заключалась в том, чтобы упаковать все необходимые приложения, библиотеки, скрипты, тесты и настройки в портативный «контейнер», который можно поставить на любую машину под Linux — а потом очень легко запустить. Он будет работать одинаково везде, потому что изолирован на уровне процессов и имеет собственную файловую систему.
Например, у нас пара контейнеров:
$ docker images
NAME ID CREATED
base fad7c890e7ca7be4 2 days ago
busybox c5860e37a1bcb678 20 hours ago
Мы просто пишем команду на исполнение с указанием имени контейнера, а Docker делает всё остальное: запускает контейнер, поднимает нужный софт, например, базы данных, веб-сервер, тесты, выполняет заданную команду — и возвращает результат без каких-либо лишних телодвижений:
$ docker run -a busybox echo hello world
hello world
Это была настоящая магия для своего времени, настолько просто всё делалось. Максимальная автоматизация. Контейнеры поднимаются и выключаются по заданным условиям, по очереди, в цепочке выполнения один за другим или группами, как угодно. Это позволяет настраивать удивительно сложные процессы без особых навыков девопса. Можно скачать готовый и настроенный контейнер из каталога — и запустить у себя.
Более 100 000 контейнеров в каталоге Docker Hub, у некоторых более 1 млрд скачиваний
Опенсорсный проект быстро набрал популярность у разработчиков и получил поддержку крупных вендоров, таких как Microsoft, IBM и Red Hat. Революция контейнеров началась.
Если разбить на составляющие, то Docker включает в себя текстовый файл Dockerfile (набор инструкций), образы контейнеров (исполняемые файлы с инструкциями по созданию контейнера), утилиту командной строки run, репозиторий контейнеров Docker Hub, движок Docker Engine (демон dockerd для управления контейнерами, API), утилиту Docker Compose (запуск приложений с несколькими контейнерами) и приложение Docker Desktop, которое объединяет в себе всё вышеперечисленное.
Дополнительную популярность Docker получил после выхода Docker Desktop для Windows и macOS в 2016 году, хотя основное использование контейнеров осталось под Linux.
Под Linux для работы с Docker можно выбрать один из GUI-клиентов, в том числе официальный клиент (бывший Kitematic), DockStation (разработчики Игорь Лозовский и Павел Лозко), Portainer или Dockly.
Portainer
Преимущества Docker
Благодаря Docker гораздо проще стало разрабатывать и поддерживать приложения, а также перемещать их с сервера на сервер. Например, переместить приложение из облака на сервер у себя дома, к хостеру на VPS и так далее. Это даёт разработчикам ряд преимуществ.
Контейнеры Docker — это минимализм. Ничего лишнего, полная изоляция приложений и окружения. Docker обеспечивает совместимость. Контейнеры — строительные блоки с легко заменяемыми частями, что позволяет ускорить разработку.
Поскольку контейнеры маленькие, можно запускать их в большом количестве для лучшего масштабирования сервисов. Затем этими кластерами контейнеров обычно управляют с помощью Kubernetes или вручную.
Недостатки Docker
Контейнеры решают множество проблем, но есть и недостатки. Программы в контейнере не так хорошо изолированы от окружения хоста, как в виртуальной машине. И движок контейнеров отнимает ресурсы на сервере, так что программы работают медленнее, чем на голом железе.
Контейнеры ничего не сохраняют, это неизменяемые read-only модули. Они загружаются и запускаются из образа, который описывает их содержимое. По умолчанию этот образ неизменен и не сохраняет своё состояние. Когда контейнер стирается из памяти, он исчезает навсегда. Чтобы сохранить состояние, как у виртуальной машины, необходимо разработать специальное решение.
Рост популярности и количества контейнеров изменил способы создания приложений — вместо монолитных стеков стали чаще использоваться сети из микросервисов, которые работают в облаке. Вскоре некоторым пользователям понадобились инструменты оркестровки и управления большими группами контейнеров.
Продажа части Docker
Компания Docker разработала инструмент оркестровки Swarm, но он не выдержал конкуренции с Kubernetes от Google. А именно на этот инструмент в составе Docker Enterprise Edition (EE) делалась ставка по монетизации.
В итоге на фоне растущих проблем с финансированием пришлось продать Docker Enterprise Edition (EE) компании Mirantis в 2019 году.
Останки Docker — оригинальный движок Docker Engine с открытым исходным кодом, хранилище образов Docker Hub и приложение Docker Desktop — продолжают жить под руководством ветерана компании Скотта Джонстона. Но он продал ту часть, которая приносила деньги. Приходится как-то переориентировать бизнес, чтобы зарабатывать на опенсорсе.
В рамках новой политики в августе 2021 года приложение Docker Desktop стало платным для больших компаний. Подписку Docker Free переименовали в Docker Personal. И это только начало.
Сегодня Docker ещё жив, но компания не смогла добиться успеха и продала прибыльную половину бизнеса. Это не сулит ничего хорошего для оставшихся проектов Docker Community Edition (CE). Поддержка Docker Swarm уже втихую прекращена без объявлений.
Тем временем разработчики и пользователи начали искать возможные альтернативы для Docker.
Альтернативы Docker
В принципе, альтернатив не так уж и много, и это смотря что считать альтернативой.
Podman
Podman (Pod Manager) чуть посложнее Docker, но зато спроектирован в соответствии с «философией Unix».
Запуск некоторых контейнеров потребует дополнительной настройки. Например, для БД придётся немного подредактировать iptables, тогда как контейнер Docker с этой БД сразу открывается в интернет.
Установка на Ubuntu:
sudo apt-get -y update
sudo apt-get -y install podman
Поиск образов в каталоге Podman:
$ podman search nginx
Скачиваем нужный:
$ sudo podman pull nginx
Советы по миграции с Docker на Podman под Windows и Mac см. здесь.
Для простых систем с Linux-контейнерами это вполне приемлемая замена Docker.
Контейнеры Docker без Docker
В последнее время появляются облачные сервисы нового типа, где можно поднимать приложения, базы данных и даже работать с контейнерами Docker без самого Docker. Например, Fly.io, Stackpath, Deno.land, Vercel.app. Возможно, будущее именно за такими сервисами.
Алгоритм развёртывания приложения во Fly.io
Вот и всё.
- Установка клиента:
$ iwr https://fly.io/install.ps1 -useb | iex- Регистрация на сайте fly.io
- Авторизация
- Создание и запуск приложения:
$ flyctl launch- Развёртывание приложения на трёх континентах:
$ flyctl regions add ams hkg sjc
По факту контейнер создаётся и запускается в облаке за пару минут. При этом пользователь может не понимать, что он создаёт контейнер и редактирует Dockerfile, поскольку он не работает напрямую с Docker.
Даже если пользователь загружает свой контейнер Docker, для его запуска нативный движок не используется. Образы контейнеров разбираются на части и трансформируются в микро-VM Firecracker.
В этом примере мы видим «контейнеры Docker без Docker». То есть образы Docker в формате OCI используются просто как универсальный носитель для переноса файлов с одного хостинга на другой, а там из образов извлекают все полезные данные и используют в более удобном формате, уже без Docker.
На каждом сервере fly.io работает инстанс containerd.
Containerd
За последние десятилетия в ядре Linux значительно доработан уровень блочных устройств. Менеджер логических томов LVM2 способен объединять или разбивать блочные устройства на синтетические. При этом объём рассматривается как абстракция. Блочное устройство 1 ТБ можно разбить на тысячу синтетических по 5 ГБ (если мы не используем это место). Можно создавать снапшоты в другом синтетическом устройстве и совместно использовать эти блоки между связанными устройствами с семантикой копирования при записи.
Сontainerd запускается как демон в Linux, он использует перечисленные функции LVM2, поддерживает формат контейнеров OCI и может работать вообще в любой экосистеме, как показано на диаграмме.
Компания Docker начинала разрабатывать проект containerd в 2014 году как низкоуровневый менеджер для движка Docker, но потом отдала его сообществу. Разработку взяла на себя организация Cloud Native Computing, которая в 2019 году выпустила его как открытый стандарт для любых облачных платформ и разных ОС.
Пример Fly.io и других хостеров показывает, что можно деплоить приложения из контейнеров OCI и при этом не использовать Docker вообще.
Minikube
В качестве альтернативы Docker Desktop некоторые пробуют Minikube, см. инструкции по установке.
Причины провала оркестратора Docker Swarm — и всего бизнеса
Контейнеры Docker стали фактически корпоративным стандартом для развёртывания приложений. Это произошло очень стремительно. Docker можно назвать одной из самых быстро принятых технологий нового поколения.
Бывшие сотрудники и разработчики Docker говорят, что главной ошибкой была недооценка Kubernetes. Они считали, что система Kubernetes слишком сложная, в ней никто не разберётся и людям больше по вкусу придётся нативный оркестратор Docker Swarm, очень простой в использовании, с маленькой и ясной документацией.
Возможно, причина ещё и в плохом маркетинге: некоторые пользователи Kubernetes не знали существовании Docker Swarm.
Кроме того, была проблема личных комплексов и фундаментального эго. Элитные разработчики Google с некоторой долей презрения смотрели на программистов из стартапа Docker, поскольку у тех было хуже образование, меньше опыт и общий уровень IQ. В ответ на такое отношение разработчики Docker не смогли нормально сотрудничать с сообществом Kubernetes и создать единую экосистему. Они всё хотели сделать по-своему и похоронить надменного конкурента.
Но рынок выбрал Kubernetes. Эта ошибка и привела к провалу бизнеса Docker, который пытались построить вокруг Docker Swarm.
Заключение
Сейчас кажется, что технология контейнеров выходит с пика хайпа на плато продуктивности. Становится понятно, что это не универсальное решение, а специализированное для небольшого ряда задач. Оркестрация вообще нужна только крупным корпорациям.
В большинстве обычных ситуаций проще поднять дешёвый VPS или домашний сервер с systemd, чем возиться с контейнерами Docker, Swarm или Kubernetes на постоянной основе.
В то же время для разработки Docker незаменим. Согласно опросу Stack Overflow, в 2021 году 49% разработчиков регулярно используют Docker Desktop.
Лучшие альтернативы для Docker
Изобретение интермодальных контейнеров вызвало бум международной торговли и стало одним из основных элементов глобализации Контейнеры от компании Docker произвели настоящую революцию в разработке,...
habr.com