- PVSM.RU - https://www.pvsm.ru -

Stevedore — открытая, бесплатная и быстрая альтернатива Docker Desktop

Stevedore — открытая, бесплатная и быстрая альтернатива Docker Desktop - 1

Очень не люблю изобретать велосипеды. Но иногда обстоятельства складываются так, что иначе не выходит.

Эта история началась весной 2021 года.

Я много работал с Docker-контейнерами под Windows и страдал.

Страдал от того, как медленно запускается Docker Desktop [1].

Страдал от того, сколько он ест оперативной памяти.

Страдал от того, что постоянно что-то ломалось при обновлениях.

Страдал от того, что на Windows Server надо устанавливать Docker через какой-то особенный механизм [2], не работающий через proxy и не работающий на Windows Server 2016. Причём в связи с тем, что Docker Inc. передала enterprise-сервис компании Mirantis, этот способ через какое-то время вообще перестанет работать. В результате вы получаете Docker, собранный из непонятно каких исходников. Всё, что про них известно — они точно не такие, как в Docker Desktop. Вообще, для инструмента, задача которого — просто скачать один единственный пакет и установить его, в трекере задач этого проекта на удивление много багов [3].

Страдал от того, что Docker Desktop прекратил поддержку Windows 10 LTSC 2019, которая продолжает поддерживаться Microsoft вплоть до 2024 года (а расширенная поддержка — аж до 2029).

И я спросил себя: а почему, за что, как так? Есть ли какая-то такая фундаментальная причина, по которой софт, решающий эту задачу, обязан доставлять столько неудобств? И не нашёл её. 

А потому подошел к проблеме по принципу: если тебя что-то не устраивает, сделай это лучше.

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

Как это было

Работа велась в свободное время, а его было мало — отпуск, дача, основная работа, — поэтому дело двигалось крайне неспешно. В основном — в формате «думаю над тем, как можно было бы сделать».

А подумать было о чём. Ведь Docker Desktop решает несколько задач:

  • Во-первых, нужно запустить сервис Docker внутри WSL. Для это нужно подготовить образ системы для WSL. Вариантов, как это можно сделать, несколько. Я остановился на следующем:

    • скачивается tar.gz с Alpine Linux [4],

    • импортируется в WSL,

    • устанавливаются нужные пакеты,

    • производится экспорт обратно.

    Сам Docker Desktop для сборки образов использует LinuxKit [5].

  • Во-вторых, нужно как-то отправлять запросы от Docker-клиента, запускаемого на хост-машине, внутрь WSL. TCP для этого не подходит из соображений безопасности. AF_UNIX-сокеты под WSL2 не работают [6]. Windows named pipes под WSL2 тоже не работают [7]. Есть проект под названием npiperelay [8], но он хорош для сценария «Windows-процесс слушает named pipe, а WSL-процесс хочет к нему подключиться», а мне нужно было в обратную сторону.

    Решение получилось довольно простым: через stdin/stdout WSL. Финальная конструкция выглядит следующим образом:

    • На стороне Windows запускается процесс [9], который слушает named pipe;

    • Этот процесс запускает socat [10] в WSL;

    • Socat подсоединяется к UNIX-сокету dockerd внутри WSL.

  • В-третьих, нужно преобразовывать пути для bind-маунтов из Windows-формата в WSL-формат. Первой попыткой было использовать для этого Docker Engine SDK [11], но с ним обнаружился ряд проблем [12]. Он не позволял прозрачно пробросить версию Docker-клиента, местами API не предоставляло достаточную гибкость, и вообще получалось очень много [13] малосодержательного кода вида «перекладываем одни структурки в другие». Поэтому я спустился «на уровень ниже» и просто использовал ReverseProxy [14] из Go.

  • В-четвёртых, если почитать материалы в блоге Docker Inc., они часто пишут о том, что, среди прочего, Docker Desktop занимается пробросом сетевых портов из WSL на хост [15]. Я думал, что это будет самой сложной в реализации частью. В Docker Desktop для неё используется VPNKit [16]. Однако оказалось, что ничего делать не нужно, потому что в WSL2 открытые порты автоматически доступны с хост-системы [17].

Что случилось

Внезапно в августе 2021 Docker Inc сменила ценообразование [18] и сказала, что компании должны платить за Docker Desktop по $60 / год с пользователя. 

Улучшилось ли при этом качество работы Docker Desktop? Я бы сказал, что нет. В качестве примера достаточно привести регресс-баг про panic.log [19], который оставался без починки с августа по ноябрь.

Как вы понимаете, это стало последней каплей. Ну и, кроме того, 8 марта 2022 года Docker Inc. вообще убрала возможность [20] приобретения подписки для российских компаний, так что актуальность альтернативного решения еще больше возросла.

Итак, Stevedore

Stevedore [21] находится здесь. Чем он отличается от 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 [22].

Автор: Marat Radchenko

Источник [23]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/open-source/374273

Ссылки в тексте:

[1] Docker Desktop: https://www.docker.com/products/docker-desktop

[2] особенный механизм: https://github.com/OneGet/MicrosoftDockerProvider

[3] много багов: https://github.com/OneGet/MicrosoftDockerProvider/issues

[4] Alpine Linux: https://alpinelinux.org/downloads/

[5] LinuxKit: https://github.com/linuxkit/linuxkit

[6] не работают: https://github.com/microsoft/WSL/issues/5961

[7] тоже не работают: https://github.com/microsoft/WSL/discussions/5919

[8] npiperelay: https://github.com/jstarks/npiperelay

[9] процесс: https://github.com/slonopotamus/docker-wsl-proxy

[10] socat: https://linux.die.net/man/1/socat

[11] Docker Engine SDK: https://docs.docker.com/engine/api/sdk/

[12] ряд проблем: https://github.com/slonopotamus/stevedore/issues/8#issuecomment-1020633256

[13] очень много: https://github.com/slonopotamus/docker-wsl-proxy/blob/6ae122278a531e5153ad74f3a23509409d0cf851/docker-wsl-proxy.go

[14] ReverseProxy: https://pkg.go.dev/net/http/httputil#NewSingleHostReverseProxy

[15] пробросом сетевых портов из WSL на хост: https://www.docker.com/blog/how-docker-desktop-networking-works-under-the-hood/

[16] VPNKit: https://github.com/moby/vpnkit

[17] автоматически доступны с хост-системы: https://docs.microsoft.com/en-us/windows/wsl/networking#accessing-linux-networking-apps-from-windows-localhost

[18] Docker Inc сменила ценообразование: https://www.docker.com/blog/updating-product-subscriptions/

[19] регресс-баг про panic.log: https://github.com/docker/for-win/issues?q=panic.log+is%3Aclosed

[20] вообще убрала возможность: https://www.docker.com/blog/dockers-response-to-the-invasion-of-ukraine/

[21] Stevedore: https://github.com/slonopotamus/stevedore

[22] Colima: https://github.com/abiosoft/colima

[23] Источник: https://habr.com/ru/post/661829/?utm_source=habrahabr&utm_medium=rss&utm_campaign=661829