Изобретение интермодальных контейнеров вызвало бум международной торговли и стало одним из основных элементов глобализации

Контейнеры от компании 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


Благодаря 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


  1. Установка клиента:
    $ iwr https://fly.io/install.ps1 -useb | iex
  2. Регистрация на сайте fly.io
  3. Авторизация
  4. Создание и запуск приложения:

    $ flyctl launch
  5. Развёртывание приложения на трёх континентах:

    $ 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.

А чем пользуетесь вы?


НЛО прилетело и оставило здесь промокоды для читателей нашего блога:

15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.

20% на выделенные серверы AMD Ryzen и Intel Core HABRFIRSTDEDIC

Комментарии (16)


  1. Gorthauer87
    12.01.2022 11:15
    -6

    Хм а апофеозом хайпа можно назвать всякие туториалы по запуску штук типа nextcloud на rpi при помощи докера. Вот уж точно гвозди микроскопом заколачивать предлагается.


    1. Bazis007
      12.01.2022 12:35
      +8

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


    1. igrblkv
      12.01.2022 18:13

      У меня на WD MyBook Live - MIPS, 256MB ОЗУ, 2TB винт, Debian 6 - в «клетках»: трансмишн, DLNA, iSCSI - как Вам такое?

      Это микросервер получается? Хотя, стоп! Микросервер у hp и там четыре диска, плюс-минус... Это наносервер выходит!

      Всё работает три года уже как, плюс-минус, но с доп.вентилятором сверху. Скоро буду переезжать на подставку для ноута с 4-я вентиляторами - WD'шек у меня много, весь ассортимент почти, до Home серий.

      PS: «Клетки» - не докер, конечно, но суть та-же.


  1. eggstream
    12.01.2022 11:37
    +14

    Но ведь так и есть, и Kubernetes действительно на порядок сложнее, чем Docker Swarm, я бы даже сказал, что он неоправдано усложнен


  1. QeqReh
    12.01.2022 11:53
    +6

    49% разработчиков регулярно используют Docker Desktop

    Серьёзно? о_О

    Консольный docker-compose на порядок удобней.


    1. de-dup-i-dipi
      12.01.2022 12:30

      Ну это относительно. Когда я попробовал попользоваться lens, вместо постоянного kubectl exec ... kubectl get pods и т. д. это куда приятнее и проще. Стразу и статистика по нодам и быстро конфиги с секретами поправить можно и инфа по всем упавшим контейнерам, если такие есть.

      Хотя раньше тоже думал, что консолная тулза удобнее.


    1. DeniSix
      12.01.2022 15:44
      +4

      Здесь автор немножко переврал. В опросе Stack Overflow всё же указан именно Docker (без Desktop).


  1. 13werwolf13
    12.01.2022 12:24
    +11

    альтернативы docker:
    lxc/lxd
    podman
    freebsd jail
    systemd-nspawn

    в статье же упоминается только podman.. может стоит сменить название на "лучшая альтернатиВА.."?

    мда.. леньтяи..


  1. zorn-v
    12.01.2022 13:22
    +5

    В статье постоянно смешиваются понятия "контейнер" и "образ" (образ вообще не используется), хотя это разные вещи.

    Образ это то что в статье постоянно называется контейнером, а контейнер это запущеный (не обязательно) инстанс из образа. Что то такое "временное". Из одного образа можно запустить несколько изолированных контейнеров и т.п.

    Если разбить на составляющие...

    Тут вообще какая то дичь

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

    Про volume не слышали ? Хоть хостовую директорию подключай.

    Короче дальше не читал.


  1. arheops
    12.01.2022 15:05

    Ага, классная статья. Redhat активно топит за LXD. Про него — не слова. Древний LXC — тем более.


    1. 13werwolf13
      13.01.2022 08:18
      +2

      а можно ссылку? я всю дорогу думал что редхат топит за подман а lxd это детище каноникла (который из-за перестановки snap на первое место это детище и убивает)


  1. fk01
    13.01.2022 01:03

    Забыта собственно встроенная в линукс (под)система lxc, присутствующая наверное в любом дистрибутиве. И в общем-то на её фоне какие-то сторонние докеры не особо нужны. Основный смысл в докере был, что готовые образы загружаются из сети, но это же одновременно и фатальный недостаток (содержимое этого образа никем не гарантировано... что там может быть внутри?)

    С помощью lxc можно получить клон текущего сервера (который хостит lxc) с помощью "наложенной" файловой системы (которая будет хранить только изменённые или добавленные файлы, а базой будет собственно сама хост-система), использовать для работы, потом сохранить или выкинуть, как угодно. При этом принципиально, что образ системы получаеся средствами самого дистрибутива и в целом ему доверять можно несколько больше, чем докер-контейнеру загруженного с какого-то сервера в интернете (пусть даже с официального сайта, но при загрузке по HTTP(без S) возникают подозрения).

    По крайней мере то о чём я пишу в дебиане вполне работает, и в убунте тоже.


    1. 13werwolf13
      13.01.2022 08:18
      +2

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

      ну не совсем, в lxc так тоже можно (см lxd), а основная идея лохера в неизменяемости, контейнеры ro, рестартани и ты снова в исходной точке (что в lxc так же возможно если в качестве образа использовать например squashfs).. докер это просто кострированная версия lxc с переделанным некоторым функционалом..

      сам по себе докер вообще не интересен, интересна экосистема сложившаяся вокруг него (и отказывающаяся от него всё больше и больше)

      я бы с удовольствием выкинул лохер на помойку и остался верен lxc/lxd, но реалии таковы что 99% работодателей с вменяемой зп предпочитают кубер с докером

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


  1. vba
    13.01.2022 13:06

    Контейнеры ничего не сохраняют, это неизменяемые read-only модули.

    По мне так это больше плюс.


  1. vba
    13.01.2022 13:51

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

    Где-то я уже это видел ... А вспомнил Git vs Bazaar


  1. ivymike
    13.01.2022 17:19

    О чем статья?