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

Эта история началась весной 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. Финальная конструкция выглядит следующим образом:

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

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

    • Socat подсоединяется к UNIX-сокету dockerd внутри 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)


  1. ahanoff
    20.04.2022 12:37
    +1

    Что насчет Rancher Desktop?


    1. slonopotamus Автор
      20.04.2022 13:09

      Ответил ниже


    1. uyrij
      20.04.2022 16:15

      Поддерживаю, и ещё упомяну, что есть веб сервис alternativeto где много вариантов ещё более популярных чем ранчер, например portainer в нем даже кубернетес изкаропки и ssl


  1. DeniSix
    20.04.2022 12:39
    +3

    Я так понимаю GUI не планируется для любителей мышевозить? Тогда это не совсем замена Docker Desktop.


    TCP для этого не подходит из соображений безопасности

    Даже с TLS?


    А рассматривали ли вы альтернативы (в 2019 их не было, но теперь плодятся):



    1. 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, например).


      1. 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-контейнеров я в нём тоже не вижу.

        Хороший поинт. На это всегда забивают, хотя кому-то оно точно нужно.


        1. slonopotamus Автор
          20.04.2022 13:37

          Для того и нужны сертификаты, разве нет?

          Да, но как я и сказал, для работы в рамках локалхоста это кажется немного перебором.

          В 1.1.0 появилась

          В релиз-ноутах вижу. В самом Rancher Desktop такой возможности не вижу :D Правда я сам Rancher Desktop сегодня впервые установил. Понял в чём дело, случайно скачал версию 0.7.0.


          1. DeniSix
            20.04.2022 14:14

            В самом Rancher Desktop такой возможности не вижу :D

            Как-то так



    1. uyrij
      20.04.2022 16:17

      Podman это альтернатива для docker, а тут выбирают удобное управление джокером.


      1. DeniSix
        20.04.2022 16:35

        Кроме поддержки Windows контейнеров есть принципиальные отличия podman от docker на машине разработчика?


        1. slonopotamus Автор
          20.04.2022 16:47

          Если я правильно использовал гугл, то например поддержка RUN --mount=cache появилась в podman в начале февраля. А в докере она есть уже по меньшей мере пару лет. Не смертельно, конечно, но я бы не рассчитывал что можно незаметно заменить одно на другое.


  1. aim
    20.04.2022 12:52
    -4

    1) есть ранчер десктоп. хотя это и не совсем то

    2) и главное — люди которые пытаются что-то делать ненативными инструментами должны страдать.

    Хватит мучать бабушку! Оставьте винду тем, кому она действительео нужна: у кого софт под неё написан.


    1. vasyapivo
      20.04.2022 13:02
      +1

      Начнём с того, что Docker Desktop не только для Windows, но и для MAC.
      Очень удобно разрабатывать контейнеры в удобной десктопной оси вроде OС MAC или WIN, а запускать на Linux сервере.
      Второе, Docker Desktop - это не только удобный проброс сети от хоста в WSL, но ещё и очень удобный GUI в котором проблемы видно сразу без десятков консольных команд.


      1. aim
        20.04.2022 13:56

        Очень удобно разрабатывать контейнеры в удобной десктопной оси вроде OС MAC или WIN

        вы не могли бы пояснить что вы имеете ввиду когда говорите "разрабатывать контейнеры"? это важно - часто люди понимают под этим совершенно разные процессы.


    1. slonopotamus Автор
      20.04.2022 13:58
      +1

      1. Выше в ветке обсудили, Rancher Desktop частично пересекается, но не совсем

      2. Ну вот есть такая штука как Windows-контейнеры. Вы под какой операционкой предлагаете их запускать?


  1. x2v0
    20.04.2022 13:03

    !!!


  1. amarao
    20.04.2022 16:15
    -2

    ... А можно было просто перестать использовать windows. apt-get install -y docker.


    1. DeniSix
      20.04.2022 16:39
      +7

      image


  1. Anonim66
    20.04.2022 19:11
    +1

    Великолепная статья - Спасибо!


  1. avengerweb
    20.04.2022 21:31
    +1

    Мы свичнулись вот на это чудо

    https://github.com/container-desktop/container-desktop

    Работает неплохо


    1. slonopotamus Автор
      20.04.2022 22:19
      +1

      Эх, где же раньше были все эти проекты...


  1. SOVERNET
    20.04.2022 22:16
    -4

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


  1. TimoshkinVlad
    21.04.2022 18:54

    Да обалдеть. Большое вам спасибо.


  1. Maxim_Q
    21.04.2022 19:01

    Добавьте себя в альтернативы чтобы другие пользователи знали про вас https://alternativeto.net/software/docker/