В этой статье мы рассмотрим 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/amd64CentOS Stream
Инструмент контейнеризации Podman доступен по умолчанию в репозитории AppStream для CentOS Stream версии 9 и выше. Для установки используйте следующую команду:
sudo dnf -y install podmanDebian
Podman доступен в репозиториях Debian 11 и выше:
sudo apt-get -y install podmanFedora
В актуальных версиях 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Чтобы запустить 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По умолчанию в качестве средства контейнеризации будет использоваться 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.