Podman
Podman – это инструмент с открытым исходным кодом для поиска, сборки, передачи и запуска приложений. Является утилитой командной строки с аналогичными docker командами, однако не требует дополнительный сервис для работы и может работать без прав доступа root. По умолчанию использует в качестве Container Runtime crun (ранее runc).
Возможность работать с контейнерами без прав root приводит к нескольким особенностям:
- все файлы Podman (образы, контейнеры и др.) пользователей с правами доступа root хранятся в каталоге
/var/lib/containers
, без прав доступа root – в~/.local/share/containers
- пользователи без root прав по умолчанию не могут использовать привилегированные порты и полноценно использовать некоторые команды
Официальная комикс-раскраска про Podman от RedHat
Установка Podman
apt-get install podman podman-compose
Если Вам нужен Docker-совместимый сокет (например, для Docker CLI или других инструментов), включите службу:
systemctl enable --now podman.socket
Для rootless (пользовательский режим):
systemctl --user enable --now podman.socket
Rootless режим
Для использования podman непривилегированными пользователями, необходимо произвести ряд дополнительных действий по настройке прав:
Проверить наличие разрешения на создание пользовательских пространств имён:
sysctl kernel.unprivileged_userns_clone
Если отсутствует, то разрешаем (устанавливаем пакет с необходимой конфигурацией)
apt-get install sysctl-conf-userns
Предоставить права на запуск исполняемых файлов /usr/bin/newuidmap
и /usr/bin/newgidmap
пользователям, не являющимся владельцами файла и не принадлежащим к группе владельца файла:
control newgidmap public
control newuidmap public
Поскольку эти исполняемые файлы обращаются к системным вызовам setuid()
и setgid()
, чтобы лишний раз не выдавать SUID бит, задайте этим файлам соответствующие file capabilities:
setcap cap_setuid+ep /usr/bin/newuidmap
setcap cap_setgid+ep /usr/bin/newgidmap
Если при попытке работы с podman под непривилегированным пользователем (например, "$ podman images"
) выдаётся ошибка "Error: kernel does not support overlay fs: 'overlay' is not supported ..."
, то нужно донастроить Fuse
:
Под пользователем root:
apt-get install fuse-overlayfs
control fusermount fuseonly
usermod -aG fuse <your_unprivileged_user_here>
Далее нужно перезайти под непривилегированным пользователем и проверить, что нет ошибок - вывод должен быть примерно такого вида:
$ fusermount -V
# fusermount version: 2.9.9
$ fusermount3 -V
# fusermount3 version: 3.16.2
Этих действий достаточно для запуска podman непривилегированными пользователями.
Примечание:
Чтобы podman могли запускать непривилегированные пользователи, для каждого такого пользователя должна существовать запись конфигурации subuid и subgid. Новые пользователи, созданные после установки podman, имеют эти записи по умолчанию.
Для пользователей, у которых нет записей в /etc/subuid
и /etc/subgid
, можно создать запись с помощью команды usermod
, например:
usermod --add-subuids 100000-165535 --add-subgids 100000-165535 имя_пользователя
Данная команда выделяет заданный диапазон UID и GID пользователю, что позволит пользователю и группе с именем пользователя запускать контейнеры Podman.
В случае попытки добавить доменного пользователя, имя пользователя вносится в /etc/subuid
и /etc/subgid
вручную.
Указанный выше диапазон UID и GID уже может быть занят другим пользователем, т.к. это диапазон по умолчанию для первого пользователя. Просмотреть занятые диапазоны можно в файлах /etc/subuid
и /etc/subgid
, например:
cat /etc/subuid
# user:100000:65536
# user2:165536:65536
Многим образам требуется 65536 uid/gid для сопоставления. Рекомендуется выделять как минимум столько uid/gid для каждого пользователя.
Для применения изменений в subuid
и subgid
необходимо выполнить команду:
$ podman system migrate
Запуск образов
Podman предоставляет совместимый с Docker интерфейс CLI, а следовательно допустимо настроить при необходимости alias docker=podman
:
echo "alias docker=podman" >> ~/.bashrc
Загрузка образа из репозитория:
podman pull registry.altlinux.org/alt/alt
Запуск контейнера из образа:
podman run -it --name alt registry.altlinux.org/alt/alt
Podman Desktop
Документация - https://podman-desktop.io/docs/intro
Шаг 1. Установка необходимых компонентов
apt-get install flatpak podman podman-compose
Шаг 2. Установка Podman Desktop
Скачайте последнюю версию Podman Desktop
Далее нужно установить скаченный файл:
flatpak install --user $HOME/Downloads/podman-desktop-<version>.flatpak
Альтернативный вариант
Добавляем новый репозиторий FlatHub:
flatpak remote-add --if-not-exists --user flathub https://flathub.org/repo/flathub.flatpakrepo
Устанавливаем через FlatHub:
flatpak install --user flathub io.podman_desktop.PodmanDesktop
Шаг 3. Инициализация Podman machine
podman machine init
Шаг 4. Запуск Podman Machine
podman machine start
Если при podman machine start
есть ошибка:
Starting machine "podman-machine-default"
Error: could not find "gvproxy" in one of [/usr/local/libexec/podman /usr/local/lib/podman /usr/libexec/podman /usr/lib/podman]. To resolve this error, set the helper_binaries_dir key in the `[engine]` section of containers.conf to the directory containing your helper binaries.
Тогда нужно сделать следующее:
curl -s https://api.github.com/repos/containers/gvisor-tap-vsock/releases/latest | awk 'BEGIN { FS = "\"\\s*:\\s*" } /browser_download_url/ && /linux-amd64/ {print $2}' | xargs wget -O gvproxy-linux-amd64
chmod +x ./gvproxy-linux-amd64
mkdir -p /usr/local/lib/podman/
mv gvproxy-linux-amd64 /usr/local/lib/podman/gvproxy
Если появляется ошибка:
Error: failed to find virtiofsd: exec: "virtiofsd": executable file not found in $PATH
Тогда:
apt-get install virtiofsd
ln -s /usr/libexec/virtiofsd /usr/local/bin/virtiofsd
Шаг 5. Запуск Podman Desktop
Либо через терминал:
flatpak run io.podman_desktop.PodmanDesktop
Либо в меню найти Podman Desktop
Далее, необходимо просто следовать указаниям.
Вкладка Kubernetes (Kind) - создание кластера
Если у Вас при создании кластера появляется ошибка:
using podman due to KIND_EXPERIMENTAL_PROVIDER
enabling experimental podman provider
Creating cluster "kind-cluster" ...
• Ensuring node image (kindest/node:v1.33.1) 🖼 ...
✓ Ensuring node image (kindest/node:v1.33.1) 🖼
• Preparing nodes 📦 ...
✗ Preparing nodes 📦
Deleted nodes: ["kind-cluster-control-plane"]
ERROR: failed to create cluster: command "podman run --name kind-cluster-control-plane --hostname kind-cluster-control-plane --label io.x-k8s.kind.role=control-plane --privileged --tmpfs /tmp --tmpfs /run --volume 159a433f83bcdfb6ee583e25aabfe42b633ae24e418a0cf5e05da0c372f3b603:/var:suid,exec,dev --volume /lib/modules:/lib/modules:ro -e KIND_EXPERIMENTAL_CONTAINERD_SNAPSHOTTER --detach --tty --net kind --label io.x-k8s.kind.cluster=kind-cluster -e container=podman --cgroupns=private --volume /dev/mapper:/dev/mapper --device /dev/fuse --publish=0.0.0.0:9090:80/tcp --publish=0.0.0.0:9443:443/tcp --publish=127.0.0.1:34193:6443/tcp -e KUBECONFIG=/etc/kubernetes/admin.conf docker.io/kindest/node@sha256:050072256b9a903bd914c0b2866828150cb229cea0efe5892e2b644d5dd3b34f" failed with error: exit status 126
Command Output: Error: setting up Pasta: pasta failed with exit code 1:
Failed to open() /dev/net/tun: Permission denied
Failed to set up tap device in namespace
В качестве решения данной проблемы, измените права:
chmod 666 /dev/net/tun