В продолжение статьи о контейнерах
Если на серверах запуск приложений и сервисов в контейнерах уверенно набирает популярность, то на десктопах ситуация пока не столь оптимистична. Хотя, казалось бы, дополнительная изоляция приложений друг от друга и от базовой ОС, равно как и простота их установки, полезна и на рабочих станциях.
Но инструменты наподобие Kubernetes на рабочих станциях ни к чему, а использовать утилиты docker или rkt напрямую из командной строки – не очень очевидное занятие для большинства пользователей, не являющихся системными администраторами. Основные сложности начинаются, когда надо передать приложению в контейнере какиелибо настройки, предоставить место для хранения данных либо запустить приложение, состоящее из нескольких контейнеров.
Для всех этих действий предусмотрены соответствующие опции и настройки, однако они подразумевают активную работу с командной строкой. Как следствие, запускать, например, графические приложения в Docker хоть и можно, но с неочевидными для большинства пользователей подготовительными действиями (сравнимыми с запуском графических приложений в LXC).
Однако пользователи десктопов без внимания не остались, получив в свое распоряжение ряд альтернативных проектов. Наиболее заметным из них на данный момент является Snappy от Canonical. По сути, формат распространения приложений в Snappy схож с AppImage – все необходимые файлы (включая все зависимости, кроме минимального набора системных библиотек, предоставляемых «базовым» snap-образом) помещаются в отдельный образ файловой системы, который монтируется при запуске. Отличие в том, что запуск и монтирование образа осуществляется утилитой snapd, которая должна входить в состав ОС. И в отличие от AppImage запуск производится в отдельном контейнере или песочнице, подготовленном согласно метаданными из snap-пакета.
Интересной альтернативой является Flatpak, идею которого предложил в 2013 году небезызвестный Леннарт Поттеринг (автор systemd и многих других проектов). Проект развивается в рамках группы freedesktop.org (ранее известной как X Desktop Group; flatpak, в свою очередь, изначально назывался xdg-app). Flatpak также подразумевает упаковку всех файлов приложения в один образ, который используется для запуска программы внутри контейнера. Однако вместо упаковки в этот образ всех зависимостей разработчик может выбрать среду запуска для своего приложения, например KDE или GNOME, и не включать в образ те компоненты, которые входят в соответствующую среду. В итоге контейнеры Flatpak напоминают двухслойные образы Docker – первым слоем выступает среда исполнения, вторым – собственно приложение.
С точки зрения пользователя, главным отличием Flatpak и схожих инструментов от Docker является изначальная интеграция с рабочим окружением десктопа. Flatpak способен взаимодействовать с системной шиной Dbus, использовать пользовательские сессии systemd для запуска сервисов, взаимодействовать с графической подсистемой и средствами вывода звука и так далее. В итоге вместо двухстраничной инструкции наподобие по запуску Skype в контейнере с Flatpak достаточно двух команд:
$ flatpak install --from https://s3.amazonaws.com/ alexlarsson/skype-repo/skype.flatpakref $ flatpak run com.skype.Client
Первая команда формирует образ с приложением на основе файла метаданных в формате flatpakref, в котором прописано, откуда скачать само приложение, какая среда запуска ему нужна, а также указан GPG-ключ, используемый для проверки подписи образа. Вторая команда непосредственно запускает Skype.