Что такое Podman: для чего используют

В этой статье мы рассмотрим 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:

  1. Создайте файл compose.yml. Как правило, пример файла можно найти в документации проекта. Пример файла для caddy доступен на странице docker hub
  2. Выполните команду: podman compose up -d
  3. Проверьте, что контейнер запущен и работает: 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 мы можем посмотреть список таблиц:

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.

1
1380