Изобретение интермодальных контейнеров вызвало бум международной торговли и стало одним из основных элементов глобализации
Контейнеры от компании 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
- Установка клиента:
$ 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.
А чем пользуетесь вы?
НЛО прилетело и оставило здесь промокоды для читателей нашего блога:
— 15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.
— 20% на выделенные серверы AMD Ryzen и Intel Core — HABRFIRSTDEDIC
Комментарии (16)
eggstream
12.01.2022 11:37+14Но ведь так и есть, и Kubernetes действительно на порядок сложнее, чем Docker Swarm, я бы даже сказал, что он неоправдано усложнен
QeqReh
12.01.2022 11:53+649% разработчиков регулярно используют Docker Desktop
Серьёзно? о_О
Консольный docker-compose на порядок удобней.
de-dup-i-dipi
12.01.2022 12:30Ну это относительно. Когда я попробовал попользоваться lens, вместо постоянного kubectl exec ... kubectl get pods и т. д. это куда приятнее и проще. Стразу и статистика по нодам и быстро конфиги с секретами поправить можно и инфа по всем упавшим контейнерам, если такие есть.
Хотя раньше тоже думал, что консолная тулза удобнее.
DeniSix
12.01.2022 15:44+4Здесь автор немножко переврал. В опросе Stack Overflow всё же указан именно Docker (без Desktop).
13werwolf13
12.01.2022 12:24+11альтернативы docker:
lxc/lxd
podman
freebsd jail
systemd-nspawnв статье же упоминается только podman.. может стоит сменить название на "лучшая альтернатиВА.."?
мда.. леньтяи..
zorn-v
12.01.2022 13:22+5В статье постоянно смешиваются понятия "контейнер" и "образ" (образ вообще не используется), хотя это разные вещи.
Образ это то что в статье постоянно называется контейнером, а контейнер это запущеный (не обязательно) инстанс из образа. Что то такое "временное". Из одного образа можно запустить несколько изолированных контейнеров и т.п.
Если разбить на составляющие...
Тут вообще какая то дичь
Чтобы сохранить состояние, как у виртуальной машины, необходимо разработать специальное решение.
Про volume не слышали ? Хоть хостовую директорию подключай.
Короче дальше не читал.
arheops
12.01.2022 15:05Ага, классная статья. Redhat активно топит за LXD. Про него — не слова. Древний LXC — тем более.
13werwolf13
13.01.2022 08:18+2а можно ссылку? я всю дорогу думал что редхат топит за подман а lxd это детище каноникла (который из-за перестановки snap на первое место это детище и убивает)
fk01
13.01.2022 01:03Забыта собственно встроенная в линукс (под)система lxc, присутствующая наверное в любом дистрибутиве. И в общем-то на её фоне какие-то сторонние докеры не особо нужны. Основный смысл в докере был, что готовые образы загружаются из сети, но это же одновременно и фатальный недостаток (содержимое этого образа никем не гарантировано... что там может быть внутри?)
С помощью lxc можно получить клон текущего сервера (который хостит lxc) с помощью "наложенной" файловой системы (которая будет хранить только изменённые или добавленные файлы, а базой будет собственно сама хост-система), использовать для работы, потом сохранить или выкинуть, как угодно. При этом принципиально, что образ системы получаеся средствами самого дистрибутива и в целом ему доверять можно несколько больше, чем докер-контейнеру загруженного с какого-то сервера в интернете (пусть даже с официального сайта, но при загрузке по HTTP(без S) возникают подозрения).
По крайней мере то о чём я пишу в дебиане вполне работает, и в убунте тоже.
13werwolf13
13.01.2022 08:18+2Основный смысл в докере был, что готовые образы загружаются из сети
ну не совсем, в lxc так тоже можно (см lxd), а основная идея лохера в неизменяемости, контейнеры ro, рестартани и ты снова в исходной точке (что в lxc так же возможно если в качестве образа использовать например squashfs).. докер это просто кострированная версия lxc с переделанным некоторым функционалом..
сам по себе докер вообще не интересен, интересна экосистема сложившаяся вокруг него (и отказывающаяся от него всё больше и больше)
я бы с удовольствием выкинул лохер на помойку и остался верен lxc/lxd, но реалии таковы что 99% работодателей с вменяемой зп предпочитают кубер с докером
вам коллега я могу предложить написать статью о том как можно lxc заменить докер и почему это хорошо. я пытался.. но я не писатель и получились одни маты.. если вы этим займётесь я бы даже помог, но быть фронтом у меня не получатеся
vba
13.01.2022 13:06Контейнеры ничего не сохраняют, это неизменяемые read-only модули.
По мне так это больше плюс.
vba
13.01.2022 13:51Они считали, что система Kubernetes слишком сложная, в ней никто не
разберётся и людям больше по вкусу придётся нативный оркестратор Docker
Swarm, очень простой в использовании, с маленькой и ясной документацией.Где-то я уже это видел ... А вспомнил Git vs Bazaar
Gorthauer87
Хм а апофеозом хайпа можно назвать всякие туториалы по запуску штук типа nextcloud на rpi при помощи докера. Вот уж точно гвозди микроскопом заколачивать предлагается.
Bazis007
Гвозди микроскопом? Помоему докер как раз отлично позволяет запускать кучу всякой мелочи на домашнем железе, простым способом, без особого насилия корневой системы.
igrblkv
У меня на WD MyBook Live - MIPS, 256MB ОЗУ, 2TB винт, Debian 6 - в «клетках»: трансмишн, DLNA, iSCSI - как Вам такое?
Это микросервер получается? Хотя, стоп! Микросервер у hp и там четыре диска, плюс-минус... Это наносервер выходит!
Всё работает три года уже как, плюс-минус, но с доп.вентилятором сверху. Скоро буду переезжать на подставку для ноута с 4-я вентиляторами - WD'шек у меня много, весь ассортимент почти, до Home серий.
PS: «Клетки» - не докер, конечно, но суть та-же.