Гид по технологиям

Podman: установка и базовые команды на Rocky Linux

6 min read Контейнеры Обновлено 25 Nov 2025
Установка и базовые команды Podman
Установка и базовые команды Podman

Иллюстрация Podman и контейнеров

Podman — бездемонный OCI-совместимый движок контейнеризации, который можно использовать вместо Docker. В этой статье показано, как установить Podman на Rocky Linux, искать и скачивать образы, запускать и управлять контейнерами и подами, а также приведены советы по безопасности, миграции и короткие чеклисты для ролей.

Введение — что такое Podman

Podman — это свободная и открытая платформа для контейнеров, созданная для разработки, управления и запуска контейнеров и подов в среде Linux. Проект развивала компания Red Hat и активное сообщество с 2018 года.

Ключевые особенности в одну строку:

  • Бездемонная архитектура: Podman не требует постоянно работающего фонового процесса (демона).
  • OCI-совместимость: может работать с теми же образами, что и Docker.
  • Работа без root: поддержка запуска контейнеров от непривилегированных пользователей.

Важно: под “бездемонная” архитектурой понимается отсутствие единого системного демона, уменьшающего точку отказа и улучшая безопасность.

Предварительные требования

  1. Сервер на базе Rocky Linux.
  2. Непривилегированный пользователь, имеющий возможность выполнять sudo для административных команд.
  3. Система должна быть обновлена:
$ sudo dnf update

Важно: обновление пакетов перед установкой минимизирует конфликты зависимостей.

Установка Podman

Podman входит в модуль container-tools вместе с Buildah и Skopeo. Для Rocky Linux 8 рекомендован модульный метод установки.

Установите набор инструментов контейнеризации:

$ sudo dnf module install container-tools

Проверьте установленную версию:

$ podman --version
podman version 3.2.3

Поиск и загрузка образов

Чтобы найти образ Nginx в реестре, используйте:

$ podman search nginx

Результат поиска образа Nginx в Podman

В выводе отображается реестр, имя образа и краткое описание.

Чтобы скачать образ, используйте один из вариантов:

$ podman pull docker.io/library/nginx

OR

$ podman pull nginx

Просмотреть загруженные образы:

$ podman images
REPOSITORY               TAG         IMAGE ID      CREATED     SIZE
docker.io/library/nginx  latest      f8f4ffc8092c  3 days ago  138 MB

Запуск контейнеров

Запустим контейнер Nginx в фоновом режиме и назовём его webserver:

$ podman run -d --name webserver nginx 

Можно запустить ещё один контейнер на том же образе с другим именем:

$ podman run -d --name webserver2 nginx

Один образ может служить основой для произвольного числа контейнеров.

Список и остановка контейнеров

Список запущенных контейнеров:

$ podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED         STATUS             PORTS       NAMES
19b6668bc627  docker.io/library/nginx:latest  nginx -g daemon o...  31 seconds ago  Up 31 seconds ago              webserver
35a286ba5a55  docker.io/library/nginx:latest  nginx -g daemon o...  2 seconds ago   Up 3 seconds ago               webserver2

Остановка контейнера:

$ podman stop webserver
webserver

Проверка статуса:

$ podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED             STATUS                 PORTS       NAMES
35a286ba5a55  docker.io/library/nginx:latest  nginx -g daemon o...  About a minute ago  Up About a minute ago              webserver2

Чтобы увидеть все контейнеры, включая остановленные, используйте флаг -a:

$ podman ps -a
CONTAINER ID  IMAGE                           COMMAND               CREATED             STATUS                     PORTS       NAMES
19b6668bc627  docker.io/library/nginx:latest  nginx -g daemon o...  2 minutes ago       Exited (0) 35 seconds ago              webserver
35a286ba5a55  docker.io/library/nginx:latest  nginx -g daemon o...  About a minute ago  Up About a minute ago                  webserver2

Запуск остановленного контейнера

$ podman start webserver
webserver

Проверка:

$ podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS             PORTS       NAMES
19b6668bc627  docker.io/library/nginx:latest  nginx -g daemon o...  3 minutes ago  Up 16 seconds ago              webserver
35a286ba5a55  docker.io/library/nginx:latest  nginx -g daemon o...  2 minutes ago  Up 2 minutes ago               webserver2

Удаление контейнера

Перед удалением контейнер должен быть остановлен:

$ podman stop webserver2

Удаление контейнера:

$ podman rm webserver2

Можно принудительно удалить запущенный контейнер флагом –force:

$ podman rm webserver2 --force
35a286ba5a553d5f88e3d9795780f893cfb58bf4a126c4912d1ec56b9d0e5a27

Принудительное завершение (kill)

Остановка и принудительное завершение отличаются: stop выполняет аккуратное завершение, kill отправляет сигнал, который может привести к потере данных.

Пример принудительного завершения с SIGKILL:

$ podman kill -s 9 webserver2

Чтобы убить все контейнеры, используйте –all или -a; чтобы только последний — –latest или -l.

Удаление образа

Удаление одного образа:

$ podman rmi registry.redhat.io/rhel8/rsyslog

Удаление нескольких образов через пробел:

$ podman rmi registry.redhat.io/rhel8/rsyslog registry.redhat.io/ubi8/ubi

Удаление всех образов:

$ podman rmi -a

Просмотр логов контейнера

Просмотр логов:

$ podman logs webserver
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
......

Ограничить вывод последними 5 строками:

$ podman logs --tail=5 webserver
2021/10/05 10:13:52 [notice] 1#1: built by gcc 8.3.0 (Debian 8.3.0-6)
2021/10/05 10:13:52 [notice] 1#1: OS: Linux 4.18.0-305.19.1.el8_4.x86_64
2021/10/05 10:13:52 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 262144:262144
2021/10/05 10:13:52 [notice] 1#1: start worker processes
2021/10/05 10:13:52 [notice] 1#1: start worker process 23

Добавить отметки времени:

$ podman logs -t webserver
2021-10-05T09:25:02.026967459Z /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
2021-10-05T09:25:02.026967459Z /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
2021-10-05T09:25:02.033956297Z /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
2021-10-05T09:25:02.043751152Z 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
2021-10-05T09:25:02.064561317Z 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
.....

Инспекция контейнеров

Команда inspect выводит подробную информацию в формате JSON:

$ podman inspect webserver
[
    {
        "Id": "19b6668bc6278a66b3ffc98ae1515af25f5bebcd20bf26de803cae41c4485f59",
        "Created": "2021-10-05T09:25:01.784949744Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
        "State": {
            "OciVersion": "1.0.2-dev",
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 4423,
....

Чтобы получить конкретное поле, используйте –format. Пример: время старта контейнера:

$ podman inspect webserver --format '{{.State.StartedAt}}'
2021-10-05 10:13:52.794806322 +0000 UTC

Доступ к Shell контейнера

Получить интерактивный терминал внутри контейнера:

$ podman exec -it webserver2 /bin/bash

Поды — уникальная особенность Podman

Podman поддерживает Pods — группу контейнеров, которые разделяют сетевой и/или PID неймспейсы и управляются как единое целое. Это схоже с концепцией Pod в Kubernetes.

Создадим pod:

$ podman pod create --name mypod

Запустим контейнеры внутри pod:

$ podman run --pod mypod --name myimage1 image:latest
$ podman run --pod mypod --name myimage2 diff-image:latest

Управление pod и контейнерами внутри него — те же привычные команды:

$ podman kill mypod      # Kill all containers
$ podman restart mypod   # Restart all containers
$ podman stop mypod      # Stop all containers
$ podman pod ps         # List all pods
$ podman pod top mypod   # Display running processes in a pod
$ podman pod inspect mypod # Inspect a Pod
$ podman pod rm mypod    # Remove the pod

Когда Podman подходит, а когда нет

Когда использовать Podman:

  • Нужна работа без системного демона и минимизация прав доступа.
  • Требуется совместимость с OCI-образами и локальная разработка контейнеров.
  • Планы по переходу на Kubernetes (Pods упрощают модель).

Когда Podman может не подойти:

  • Если ваш рабочий процесс жёстко привязан к Docker-демону или специфичным API докера, которые не покрываются совместимостью.
  • В некоторых enterprise-интеграциях требуется Docker Engine из-за поставщика ПО.

Альтернативы

  • Docker Engine — наиболее распространённый движок, удобен для начинающих и широкого экосообщества.
  • containerd — более «низкоуровневый» компонент, используется внутри Docker и Kubernetes.
  • Buildah/Skopeo — дополнительные инструменты для сборки и работы с образами (часть набора container-tools).

Советы по миграции с Docker

  • Podman совместим с OCI-образами, поэтому большинство образов Docker можно запускать без изменений.
  • Для совместимости CLI можно установить пакет podman-docker, который предоставляет команду docker, перенаправляющую вызовы к Podman.
  • Учтите различия в поведении демона и systemd-интеграции: некоторые сценарии, завязанные на Docker daemon, потребуют адаптации.

Меры безопасности (жёсткие советы)

  • Запускайте контейнеры от непривилегированных пользователей, когда это возможно (rootless containers).
  • Ограничивайте возможности (capabilities) и монтирования только необходимыми правами.
  • Используйте подписанные образы и проверку целостности (при наличии инфраструктуры подписей).
  • Минимизируйте слои в образах и используйте минимальные базовые образы.
  • Применяйте политики SELinux/AppArmor и сетевые политики для ограничения взаимодействий.

Ролевые чек-листы

Разработчик:

  • Собирать и тестировать образы локально.
  • Запускать контейнеры в rootless-режиме для тестов.
  • Писать лёгкие Dockerfile/Containerfile и проверять размер образа.

Оператор/DevOps:

  • Настроить системные обновления и мониторинг Podman-сервисов.
  • Автоматизировать загрузку/удаление образов и ротацию логов.
  • Настроить резервирование и политики хранения образов.

SRE/Безопасность:

  • Настроить сканирование образов на уязвимости.
  • Ограничить сетевые и системные привилегии контейнеров.
  • Проверять соответствие политик SELinux и namespace.

Быстрый SOP / Playbook для типичных задач

  1. Установка: проверить dnf update → dnf module install container-tools.
  2. Скачать образ: podman pull <образ>.
  3. Запустить контейнер: podman run -d –name <имя> <образ>.
  4. Просмотреть логи: podman logs -t –tail=100 <имя>.
  5. Остановить и удалить: podman stop <имя> && podman rm <имя>.
  6. Очистка образов: podman rmi -a.

Критерии приёмки

  • Контейнер успешно запускается и отвечает на ожидаемые запросы.
  • Логи доступны и содержат отметки времени (если требуется).
  • Образ хранится в реестре и доступен для развёртывания.
  • При запуске в rootless-режиме контейнеры не требуют прав root в хосте.

Маленькая методология принятия решений (heuristic)

Если важна безопасность и отсутствие демона → выбирайте Podman. Если нужен конкретный интегрированный пайплайн, завязанный на Docker Engine → оцените затраты на адаптацию.

Мини-глоссарий (1 строка каждый)

  • Контейнер: изолированный экземпляр приложения с зависимостями.
  • Образ (image): шаблон для создания контейнера.
  • Pod: группа контейнеров, управляемая как единое целое.
  • Rootless: режим запуска контейнеров без root-привилегий.

Decision flowchart (Mermaid)

flowchart TD
  A[Нужна контейнеризация?] --> B{Требуется демон?}
  B -- Да --> C[Docker Engine или containerd]
  B -- Нет --> D[Podman]
  D --> E{Нужна совместимость Docker CLI?}
  E -- Да --> F[Установить podman-docker]
  E -- Нет --> G[Использовать Podman напрямую]

Заключение

Это руководство покрывает базовую установку и основные команды Podman на Rocky Linux: поиск и загрузку образов, запуск и управление контейнерами и подами, просмотр логов и инспекцию. Podman подходит для сценариев, где важна безопасность и отсутствие единой точки отказа, а также удобен при интеграции с Kubernetes.

Если у вас остались вопросы по конкретным сценариям или вы хотите мигрировать готовую инфраструктуру с Docker — опишите ваш случай, и можно разработать пошаговый план миграции.

Wichtig: если вы используете Podman в продакшне, протестируйте политики безопасности и резервные сценарии до переноса нагрузки.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Discord не обновляется в Windows 10 — быстрые исправления
Технологии

Discord не обновляется в Windows 10 — быстрые исправления

Экспорт контактов iPhone в Windows 10
How-to

Экспорт контактов iPhone в Windows 10

Тыловые 5.1 колонки не работают после Windows 10
Требуется решение

Тыловые 5.1 колонки не работают после Windows 10

Как недорого работать в дороге — гаджеты и планы
Удалённая работа

Как недорого работать в дороге — гаджеты и планы

Где находятся файлы конфигурации Apache
Инфраструктура

Где находятся файлы конфигурации Apache

Встроенный администратор в Windows 11: включить/отключить
Windows

Встроенный администратор в Windows 11: включить/отключить