В этой статье мы рассмотрим Podman (также известен как Pod Manager) – инструмент контейнеризации, известный в качестве альтернативы Docker.
Основные особенности Podman следующие:
- контейнеры могут быть запущены как от имени root, так и от имени непривилегированного пользователя, что снижает риски с точки зрения безопасности;
- в отличие от Docker, Podman не использует демон для запуска и управления контейнерами, что повышает стабильность (падение демона не приводит к падению всех контейнеров) и безопасность системы;
- Podman позволяет создавать группы контейнеров – поды – и управлять ими.
Podman соответствует стандарту Open Containers Initiative (OCI), который определяет основные принципы работы с контейнерами, благодаря чему Podman совместим с Docker. Как заявляют сами разработчики: "Большинство пользователей могут просто заменить Docker на Podman (например, через alias docker=podman) без каких-либо проблем".
Далее мы разберем процесс установки Podman, а также Podman в действии – наиболее популярные операции с контейнерами, образами и подами.
Установка Podman
Рассмотрим процесс установки Podman для популярных дистрибутивов Linux:
Ubuntu
В этой статье мы будем использовать виртуальный сервер с установленной Ubuntu 24.04. Podman доступен для установки из официальных репозиториев для Ubuntu версии 20.10 и выше.
Выполните apt update, чтобы обновить списки пакетов:
sudo apt update
Затем установите платформу контейнеризации Podman:
sudo apt-get -y install podman
Проверьте версию, чтобы убедиться, что пакет установлен:
# podman version
Client: Podman
Engine Version: 4.9.3
API Version: 4.9.3
Go Version: go1.22.2
Built: Thu Jan 1 00:00:00 1970
OS/Arch: linux/amd64
CentOS Stream
Инструмент контейнеризации Podman доступен по умолчанию в репозитории AppStream для CentOS Stream версии 9 и выше. Для установки используйте следующую команду:
sudo dnf -y install podman
Debian
Podman доступен в репозиториях Debian 11 и выше:
sudo apt-get -y install podman
Fedora
В актуальных версиях Fedora Podman предустановлен.
Контейнеризация и работа с образами в Podman
Рассмотрим работу с контейнерами в Podman на примере контейнера с веб-сервером Caddy. Для начала загрузим сам образ из официального репозитория:
$ podman pull docker.io/caddy
Trying to pull docker.io/library/caddy:latest...
Getting image source signatures
Copying blob 4f4fb700ef54 done |
Copying blob 0a9a5dfd008f done |
Copying blob 9c63ec053486 done |
Copying blob 6fd3ccaa8d5e done |
Copying blob b8a5ec399796 done |
Copying config 51f0c496a5 done |
Writing manifest to image destination 51f0c496a59a692cbf86a9973f1ecdc68ac444c1b97ac0b87e0ea90f0597fe69
Обратите внимание!
Контейнеры, запущенные без прав суперпользователя, не могут использовать порты < 1024. Запускайте контейнеры, использующие порты в диапазоне до 1024 порта, используя права суперпользователя или непосредственно из-под пользователя root.
Чтобы запустить rootless-контейнер (т. е. контейнер, не требующий привилегий суперпользователя для своего запуска и работы) на порту 8080, необходимо выполнить следующую команду:
podman run --name caddy_server -d -p 8080:80 docker.io/caddy
Для запуска контейнера с правами суперпользователя на порту 80 используйте следующую команду:
sudo podman run --name caddy_server -d -p 80:80 docker.io/caddy
Вы можете проверить, какие порты использует контейнер, выполнив следующую команду:
podman port <название-контейнера>
В нашем случае контейнер называется caddy_server:
podman port caddy_server
80/tcp -> 0.0.0.0:80
Проверим логи Caddy, чтобы убедиться, что сервер запущен и корректно работает. Команда для просмотра логов контейнера также аналогична Docker:
podman logs <название-контейнера>
Или используем флаг -l для просмотра последнего контейнера:
podman logs -l
Выполнение команд в контейнере
Если необходимо выполнить какие-либо настройки или действия внутри контейнера, используйте следующую команду:
podman exec -it <название-контейнера> sh
Например, войдем в оболочку контейнера и отредактируем конфигурацию Caddy:
$ podman exec -it caddy_server sh
$ vi /etc/caddy/Caddyfile
Для выхода из контейнера используйте сочетание клавиш Ctrl+D или введите команду exit.
Для выполнения команд в контейнере, не входя в его оболочку, используйте ключ -d:
podman exec -d <название-контейнера> <команда>
Например, загрузим обновленный конфигурационный файл, который мы ранее изменили, в Caddy. Необходимо также указать путь к конфигурационному файлу внутри контейнера после параметра --config:
podman exec -d caddy_server caddy --config /etc/caddy/Caddyfile reload
Другие популярные команды для работы с технологией контейнеризации аналогичны Docker, например:
- podman ps – список всех запущенных контейнеров
- podman ps -a – список всех контейнеров, запущенных и остановленных
- podman stop <container-name> – остановка контейнера
- podman rm <container-name> – удаление контейнера
Просмотр и удаление образов
Вы можете посмотреть список всех образов:
podman images
Чтобы очистить дисковое пространство, можно удалить ненужные образы:
podman image rm <название-образа>
Использование compose
Podman имеет команду compose, которая позволяет использовать docker compose или podman-compose. Для корректной работы с ними необходимо активировать podman.socket:
$ systemctl --user start podman.socket
$ systemctl --user enable podman.socket
Проверим, что сокет запущен и работает:
$ systemctl --user status podman.socket
● podman.socket - Podman API Socket
Loaded: loaded (/usr/lib/systemd/user/podman.socket; enabled; preset: enabled)
Active: active (listening) since Thu 2025-03-27 08:57:20 UTC; 2h 20min ago
Triggers: ● podman.service
Docs: man:podman-system-service(1)
Listen: /run/user/1002/podman/podman.sock (Stream)
CGroup: /user.slice/user-1002.slice/user@1002.service/app.slice/podman.socket
Mar 27 08:57:20 zgirawpmgx systemd[753650]: Listening on podman.socket - Podman API Socket.
Затем установите следующую переменную окружения:
export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/podman/podman.sock
Обратите внимание!
Podman-compose не является частью официального проекта Podman и разрабатывается сообществом, устанавливать его необходимо отдельно.
По умолчанию в качестве средства контейнеризации будет использоваться docker-compose. Чтобы использовать podman-compose, установите переменную окружения:
export PODMAN_COMPOSE_PROVIDER=podman-compose
Использование podman compose аналогично использованию docker compose:
- Создайте файл compose.yml. Как правило, пример файла можно найти в документации проекта. Пример файла для caddy доступен на странице docker hub
- Выполните команду: podman compose up -d
- Проверьте, что контейнер запущен и работает: podman ps
Если контейнер не был запущен, проверьте его логи командой podman logs <название-контейнера>
Полная замена Docker
Если вы хотите, чтобы скрипты и программы использовали в своей работе Podman вместо Docker, установите пакет podman-docker. Он создаст символическую ссылку, и в системе контейнеризации по умолчанию будет использоваться Podman.
Установить пакет в Ubuntu можно следующей командой:
$ sudo apt install podman-docker
В Fedora/RHEL/CentOS:
sudo dnf install podman-docker
После установки пакета при выполнении команды docker мы получим следующее сообщение:
$ docker
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
Manage pods, containers and images
Usage:
podman [options] [command]
Теперь в системе по умолчанию будет использоваться Podman.
Работа с подами в Podman
Одной из особенностей Podman является возможность создавать поды – аналоги подов Kubernetes, групп из одного или нескольких контейнеров, работающих с общим хранилищем, сетью и параметрами запуска контейнеров. Для примера создадим под с phpMyAdmin и MySQL, при этом снаружи будет доступен только phpMyAdmin.
Создадим под. Обратите внимание, что необходимые для работы контейнеров порты мы указываем при создании пода:
$ podman pod create --name betutorial_pod -p 8080:80
Выполним команду, чтобы посмотреть список подов. Созданный под отобразится в списке. Заметим, что количество контейнеров у пустого пода равно одному:
$ podman pod ls
POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS
87f4beed2648 betutorial_pod Created About a minute ago 37996df9f1bf 1
Создадим и добавим в под контейнер с MySQL:
$ podman run -d --pod betutorial_pod --name mysql -e MYSQL_ROOT_PASSWORD=secret -e MYSQL_DATABASE=testdb -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /my/own/datadir:/var/lib/mysql docker.io/library/mysql:8.0
Разберем команду для запуска Podman:
- -d – запуск контейнера в фоне;
- --pod betutorial_pod – под, в который будет добавлен контейнер;
- --name mysql – наименование контейнера;
- -e MYSQL_ROOT_PASSWORD=secret – переменные окружения, необходимые для работы MySQL;
- -v /my/own/datadir:/var/lib/mysql – том, где будут храниться данные mysql. Вместо /my/own/datadir укажите свою директорию;
- docker.io/library/mysql:8.0 – образ MySQL.
Далее запускаем контейнер с phpMyAdmin (без указания рабочих портов):
$ podman run -d --pod betutorial_pod --name phpmyadmin -e PMA_HOST=mysql docker.io/phpmyadmin/phpmyadmin
Проверим, что под работает:
$ podman pod ps
POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS
fa40f44bb553 betutorial_pod Running 3 hours ago c0c688dd36b3 3
Проверим, что все контейнеры в поде запущены и работают:
$ podman ps -a --pod
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAME
d3cde76c2efb localhost/podman-pause:4.9.3-0 40 minutes ago Up 26 minutes 0.0.0.0:8080->80/tcp 472c50e4395e-infra 472c50e4395e betutorial_pod
9578b306413b docker.io/phpmyadmin/phpmyadmin:latest apache2-foregroun... 36 minutes ago Up 26 minutes 0.0.0.0:8080->80/tcp phpmyadmin 472c50e4395e betutorial_pod
cc9e277d3603 docker.io/library/mysql:8.0 mysqld 27 minutes ago Up 26 minutes 0.0.0.0:8080->80/tcp mysql 472c50e4395e betutorial_pod
Теперь убедимся, что MySQL доступен только изнутри пода.
Через phpMyAdmin мы можем посмотреть список таблиц:
Получить список таблиц снаружи мы не сможем:
$ mysql -h 127.0.0.1 -u root -psecret -e "SHOW DATABASES;"
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1:3306' (111)
Команды остановки и удаления подов аналогичны командам контейнеров:
- podman pod stop <pod-name> – остановка пода
- podman pod rm <pod-name> – удаление пода
Работа с томами в подах
При создании пода вы можете указать том, доступ к которому будут иметь все контейнеры пода. Том может быть создан на основе существующей директории в системе, например:
$ podman pod create --name betutorial_pod -p 8080:80 --volume /my/own/datadir:/data
где вместо /my/own/datadir укажите необходимую директорию, вместо /data – желаемый путь к тому в контейнере.
Вы также можете создать именной том:
$ podman pod create --name betutorial_pod -p 8080:80 --volume beget_volume:/data
Именные тома для контейнеров, работающих с правами суперпользователя, будут храниться в директории /var/lib/containers/storage/volumes/, тома для rootless-контейнеров (не использующих права суперпользователя) будут сохранены в директории ~/.local/share/containers/storage/volumes/.
Проверим путь к созданному тому:
$ podman volume inspect my_volume | grep Mountpoint
"Mountpoint": "/home/user/.local/share/containers/storage/volumes/beget_volume/_data",
Посмотреть список томов вы можете, выполнив команду podman volume ls.
Посмотреть полный список команд podman pod вы можете в документации.
Если возникнут вопросы, напишите нам, пожалуйста, тикет из панели управления аккаунта (раздел “Помощь и поддержка”), а если вы захотите подискутировать о сравнении Podman vs Docker или обсудить другие темы с коллегами по цеху и сотрудниками облачной IT-платформы Beget – ждем вас в нашем сообществе в Telegram.