Distrobox - это opensource проект, по сути - большой набор shell-скриптов, который при помощи выбранного бэкэнда (docker, podman, с недавних пор еще lilipod) позволяет запускать контейнеры популярных Линукс дистрибутивов. При этом мы получаем доступ к всему диапазону программных пакетов конкретного дистрибутива, и сам контейнер близко интегрируются с нашей основной системой, позволяя легко пользоваться приложениями внутри контейнера.
Зачем такое нужно?
Можно использовать какой-нибудь стабильный дистрибутив Linux, вроде Ubuntu, Debian, даже незименяемые дистрибутивы, вроде Fedora Sliverblue, и при этом иметь полный доступ к вообще любым репозиториям софта, которые существуют среди популярных дистрибутивов: ArchLinux, openSUSE Tumbleweed и т.д.
Всё мои инструменты для работы находятся в удобной bleeding-edge коробочке, где я могу иметь самое свежее ПО, при этом без необходимости настраивать репозитории и засорять свою систему большим количеством софта и библиотек.
Может запускать даже графические и аудио-приложения (есть даже вариант использования рабочего стола GNOME или KDE полностью из контейнера, инструкция если кому интересно, но мне кажется это перебор :).
Кроме того:
- Rootless установка программ.
- Совместимость программы с нашей системой не важна.
- Изоляция программ от основной системы.
- Установка программ на компьютере с ограниченными правами, или на атомных дистрибутивах.
Всё это, естественно, возможно и при управлениями контейнерами “вручную”, но Distrobox здорово упрощает весь этот процесс, например, создать контейнер для Убунты максимально просто:
# создание обычного контейнера Ubuntu
distrobox create -i ubuntu:20.04
Далее мы можем просто зайти “внутрь” контейнера:
distrobox enter ubuntu
и установить любые программы, которые доступны с apt
на Ubuntu.
apt-get install ripgrep
И всё: можно использовать rg
, в том числе для поиска на своей основной системе.
Чтобы не “заходить” каждый раз внутрь контейнера для запуска приложений, возможно также “экспортировать”
их наружу:
distrobox-export --bin `which rg`
Теперь мы можем использовать ripgrep
напрямую, export
создал для нас удобный скрипт, который
фоном запустит контейнер с приложением и выполнит команду.
Зачем такое не нужно?
Distrobox всё-таки не обеспечивает 100% безопасную песочницу, т.к. интегрирует контейнеры с основной системой. Если нам нужна надежная изоляция для нашей работы, правильно всё таки использовать обычные docker/podman или иные средства виртуализации.
Чем Distrobox может быть интересен разработчику?
- Быстро получаем воспроизводимую среду для разработки.
- Устанавливаем библиоткеки, редакторы/IDE, дебаггеры (например, легко можно использовать последнюю версию Neovim внутри Distrobox)
- Можем использовать разные версии программ в разных контейнерах.
- Если чего-то нет в репозитории конкретного дистрибутива, всега можно создать еще один.
Еще один плюс: декларативные описания среды контейнера.
Поддерживается создание заранее настроенных конфиг-файлом контейнеров, с предустановленными приложениями
с distrobox-assemble.
Описанный нами в *.ini
файле контейнер, можно запустить на любой машине, где установлен Distrobox, и сразу начать работать.
Затем можно удалить контейнер, пересоздать, запустить несколько точно таких же на другом компьютере.
Для интерисующихся ML-инженерией будет интересно,
что можно легко получить настроенную среду с Pytorch
и всеми GPU драйверами
(AMD драйвер насколько мне известно, поддерживает работу прямо из контейнера, NVidia дожны быть установлены всё-таки и на основной системе
и продублированы в контейнера).
Что умеет еще?
Distrobox в целом делает работу со своими контейнерами очень просто, например, все контейнеры можно проапдейтить одной командой.
Ещё один интересный вариант использования: наши контейнеры могу включать init-систему systemd
.
А это открывает нам окно, для, например, использования docker’а изнутри podman контейнера
без необходимости установки его на базовой системе.
Выводы
В целом это один из самых интересных инструментов для Linux, с которыми я встречался, и также это ещё один шажок в стороту того, что конкретный дистрибутив и его пакетный менеджер становятся всё менее важны сами по себе, и в целом от Linux мы лишь хотим устойчивую среду для запуска наших приложений в контейнерах или форматах приложений вроде Flatpak или AppImage.