Очень не люблю изобретать велосипеды. Но иногда обстоятельства складываются так, что иначе не выходит.
Эта история началась весной 2021 года.
Я много работал с Docker-контейнерами под Windows и страдал.
Страдал от того, как медленно запускается Docker Desktop.
Страдал от того, сколько он ест оперативной памяти.
Страдал от того, что постоянно что-то ломалось при обновлениях.
Страдал от того, что на Windows Server надо устанавливать Docker через какой-то особенный механизм, не работающий через proxy и не работающий на Windows Server 2016. Причём в связи с тем, что Docker Inc. передала enterprise-сервис компании Mirantis, этот способ через какое-то время вообще перестанет работать. В результате вы получаете Docker, собранный из непонятно каких исходников. Всё, что про них известно — они точно не такие, как в Docker Desktop. Вообще, для инструмента, задача которого — просто скачать один единственный пакет и установить его, в трекере задач этого проекта на удивление много багов.
Страдал от того, что Docker Desktop прекратил поддержку Windows 10 LTSC 2019, которая продолжает поддерживаться Microsoft вплоть до 2024 года (а расширенная поддержка — аж до 2029).
И я спросил себя: а почему, за что, как так? Есть ли какая-то такая фундаментальная причина, по которой софт, решающий эту задачу, обязан доставлять столько неудобств? И не нашёл её.
А потому подошел к проблеме по принципу: если тебя что-то не устраивает, сделай это лучше.
После чего быстренько придумал название проекту и создал репозиторий.
Как это было
Работа велась в свободное время, а его было мало — отпуск, дача, основная работа, — поэтому дело двигалось крайне неспешно. В основном — в формате «думаю над тем, как можно было бы сделать».
А подумать было о чём. Ведь Docker Desktop решает несколько задач:
-
Во-первых, нужно запустить сервис Docker внутри WSL. Для это нужно подготовить образ системы для WSL. Вариантов, как это можно сделать, несколько. Я остановился на следующем:
скачивается tar.gz с Alpine Linux,
импортируется в WSL,
устанавливаются нужные пакеты,
производится экспорт обратно.
Сам Docker Desktop для сборки образов использует LinuxKit.
-
Во-вторых, нужно как-то отправлять запросы от Docker-клиента, запускаемого на хост-машине, внутрь WSL. TCP для этого не подходит из соображений безопасности. AF_UNIX-сокеты под WSL2 не работают. Windows named pipes под WSL2 тоже не работают. Есть проект под названием npiperelay, но он хорош для сценария «Windows-процесс слушает named pipe, а WSL-процесс хочет к нему подключиться», а мне нужно было в обратную сторону.
Решение получилось довольно простым: через stdin/stdout WSL. Финальная конструкция выглядит следующим образом:
В-третьих, нужно преобразовывать пути для bind-маунтов из Windows-формата в WSL-формат. Первой попыткой было использовать для этого Docker Engine SDK, но с ним обнаружился ряд проблем. Он не позволял прозрачно пробросить версию Docker-клиента, местами API не предоставляло достаточную гибкость, и вообще получалось очень много малосодержательного кода вида «перекладываем одни структурки в другие». Поэтому я спустился «на уровень ниже» и просто использовал ReverseProxy из Go.
В-четвёртых, если почитать материалы в блоге Docker Inc., они часто пишут о том, что, среди прочего, Docker Desktop занимается пробросом сетевых портов из WSL на хост. Я думал, что это будет самой сложной в реализации частью. В Docker Desktop для неё используется VPNKit. Однако оказалось, что ничего делать не нужно, потому что в WSL2 открытые порты автоматически доступны с хост-системы.
Что случилось
Внезапно в августе 2021 Docker Inc сменила ценообразование и сказала, что компании должны платить за Docker Desktop по $60 / год с пользователя.
Улучшилось ли при этом качество работы Docker Desktop? Я бы сказал, что нет. В качестве примера достаточно привести регресс-баг про panic.log, который оставался без починки с августа по ноябрь.
Как вы понимаете, это стало последней каплей. Ну и, кроме того, 8 марта 2022 года Docker Inc. вообще убрала возможность приобретения подписки для российских компаний, так что актуальность альтернативного решения еще больше возросла.
Итак, Stevedore
Stevedore находится здесь. Чем он отличается от Docker:
Бесплатен;
Имеет полностью открытые исходники под лицензией Apache 2.0;
Поддерживает Linux- и Windows-контейнеры;
Поддерживает клиентские и серверные редакции Windows;
-
Чудовищно быстрый. Для сравнения (замеры производились на Intel Atom x7-Z8750):
Docker Desktop: первый запуск после установки — 78 с, повторный — 38 с;
Stevedore: первый запуск после установки — 12 с, повторный — 4 с.
-
Низкое потребление ресурсов:
Docker Desktop (WSL2) — 2GB RAM;
Stevedore (WSL2) — 0.5GB RAM.
Установка через MSI-инсталлятор, пакет WinGet (winget install stevedore) или Chocolatey (choco install stevedore);
Никакой телеметрии.
На текущий момент на разработку потрачено около 5-6 человекодней. Исходя из этого, стоит ли Docker Inc своих $60/год, можете решить сами для себя.
Видео с демонстрацией работы Stevedore:
Что в планах
• Добавление поддержки Kubernetes.
P. S. Если вы ищете замену Docker Desktop под Mac, попробуйте Colima.
Комментарии (24)
DeniSix
20.04.2022 12:39+3Я так понимаю GUI не планируется для любителей мышевозить? Тогда это не совсем замена Docker Desktop.
TCP для этого не подходит из соображений безопасности
Даже с TLS?
А рассматривали ли вы альтернативы (в 2019 их не было, но теперь плодятся):
- Rancher Desktop
- Podman desktop companion
- Podman Desktop (совсем свежий)
slonopotamus Автор
20.04.2022 13:09+5Даже с TLS?
Там вопрос не в том что нас подслушают, это подпирается несложно. Проблема в том как понять кто пришёл манипулировать контейнерами. Городить схему с логинами-паролями или токенами между хост-виндой и WSL2 выглядит избыточным.
А рассматривали ли вы альтернативы
На момент поиска решений в Rancher Desktop отсутствовала поддержка Docker'а. И появилась только в декабре 2021: https://github.com/rancher-sandbox/rancher-desktop/releases/tag/v0.7.0
Далее, я не вижу возможности *не запускать* Kubernetes в Rancher Desktop. Kubernetes нужен далеко не всем, а ресурсов он жрёт изрядно.
Поддержки Windows-контейнеров я в нём тоже не вижу.
Ну то есть да, по части юзкейсов оно пересекается. И готов поверить что Rancher Desktop на сегодняшний день лучше/удобнее в этих кейсах.
А решения на базе Podman не рассматривались в принципе, потому что хотелось именно Docker.
В целом, если функциональность Rancher Desktop расширится настолько, что сделает существование Stevedore бессмысленным, я буду только счастлив.
Про GUI: ну кнопка Quit в трее есть :) Остального (пока?) действительно нет. Я GUI рассматриваю как приятную дополнительную нашлёпку в данном случае. Хорошо если оно есть, но не смертельно если нет. К тому же интерфейсом может выступать что-то стороннее (тот же плагин к IDE, например).
DeniSix
20.04.2022 13:24как понять кто пришёл манипулировать контейнерами
Для того и нужны сертификаты, разве нет?
не вижу возможности не запускать Kubernetes в Rancher Desktop
В 1.1.0 появилась:
Kubernetes can be disabled to run just containerd or dockerd by itself for reduced resource consumption.
Поддержки Windows-контейнеров я в нём тоже не вижу.Хороший поинт. На это всегда забивают, хотя кому-то оно точно нужно.
slonopotamus Автор
20.04.2022 13:37Для того и нужны сертификаты, разве нет?
Да, но как я и сказал, для работы в рамках локалхоста это кажется немного перебором.
В 1.1.0 появилась
В релиз-ноутах вижу. В самом Rancher Desktop такой возможности не вижу :D Правда я сам Rancher Desktop сегодня впервые установил.Понял в чём дело, случайно скачал версию 0.7.0.
uyrij
20.04.2022 16:17Podman это альтернатива для docker, а тут выбирают удобное управление джокером.
DeniSix
20.04.2022 16:35Кроме поддержки Windows контейнеров есть принципиальные отличия podman от docker на машине разработчика?
slonopotamus Автор
20.04.2022 16:47Если я правильно использовал гугл, то например поддержка
RUN --mount=cache
появилась в podman в начале февраля. А в докере она есть уже по меньшей мере пару лет. Не смертельно, конечно, но я бы не рассчитывал что можно незаметно заменить одно на другое.
aim
20.04.2022 12:52-41) есть ранчер десктоп. хотя это и не совсем то
2) и главное — люди которые пытаются что-то делать ненативными инструментами должны страдать.
Хватит мучать бабушку! Оставьте винду тем, кому она действительео нужна: у кого софт под неё написан.
vasyapivo
20.04.2022 13:02+1Начнём с того, что Docker Desktop не только для Windows, но и для MAC.
Очень удобно разрабатывать контейнеры в удобной десктопной оси вроде OС MAC или WIN, а запускать на Linux сервере.
Второе, Docker Desktop - это не только удобный проброс сети от хоста в WSL, но ещё и очень удобный GUI в котором проблемы видно сразу без десятков консольных команд.aim
20.04.2022 13:56Очень удобно разрабатывать контейнеры в удобной десктопной оси вроде OС MAC или WIN
вы не могли бы пояснить что вы имеете ввиду когда говорите "разрабатывать контейнеры"? это важно - часто люди понимают под этим совершенно разные процессы.
slonopotamus Автор
20.04.2022 13:58+1Выше в ветке обсудили, Rancher Desktop частично пересекается, но не совсем
Ну вот есть такая штука как Windows-контейнеры. Вы под какой операционкой предлагаете их запускать?
avengerweb
20.04.2022 21:31+1Мы свичнулись вот на это чудо
https://github.com/container-desktop/container-desktop
Работает неплохо
Maxim_Q
21.04.2022 19:01Добавьте себя в альтернативы чтобы другие пользователи знали про вас https://alternativeto.net/software/docker/
ahanoff
Что насчет Rancher Desktop?
slonopotamus Автор
Ответил ниже
uyrij
Поддерживаю, и ещё упомяну, что есть веб сервис alternativeto где много вариантов ещё более популярных чем ранчер, например portainer в нем даже кубернетес изкаропки и ssl