Podman#

Предупреждение

В Astra Linux Special Edition очередное обновление 1.8 программное обеспечение podman включено в состав основного репозитория.

В более ранних обновлениях это ПО находится в составе расширенного репозитория, и при его использовании следует учитывать следующее:

Программное обеспечение расширенного репозитория является сторонним по отношению к Astra Linux, не дорабатывается с точки зрения выполнения требований по безопасности информации и не проверяется при сертификации.

При использовании программного обеспечения расширенного репозитория рекомендуется для дополнительной изоляции процессов осуществлять их запуск в изолированной программной среде (контейнере). При использовании для этих целей Docker-контейнеров их запуск целесообразно осуществлять от имени непривилегированного пользователя в rootless-режиме, а при включенном мандатном контроле целостности (МКЦ) с применением технологии запуска контейнеров на пониженном или выделенном уровне МКЦ. Подробнее см. Руководство по КСЗ в составе эксплуатационной документации используемого обновления.

Введение#

Podman — инструмент командной строки с открытым исходным кодом, предоставляющий возможности поиска, сборки, передачи и запуска приложений в контейнерной изоляции. Функционально podman аналогичен системе контейнерной изоляции docker, но предоставляет дополнительные возможности по управлению группами контейнеров (т.н. оркестрация контейнеров, container orchestration) и может работать без прав доступа суперпользователя (root).

Предупреждение

По умолчанию podman использует в качестве средства контейнеризации библиотеку crun. В Astra Linux работа контейнеров поддерживается только при использовании контейнеризации runc, т.е. при работе в Astra Linux для запуска контейнеров следует использовать опции команды podman –runtime=runc и –cgroup-manager=cgroupfs.

Работа с контейнерами без прав суперпользователя имеет следующие особенности:

  • файлы непривилегированных пользователей хранятся в их домашних каталогах, в подкаталоге .local/share/containers;

  • непривилегированные пользователи по умолчанию не могут использовать привилегированные сетевые порты и некоторые команды;

Podman использует контейнеры стандарта Open Container Initiative (OCI), что обеспечивает совместимость с образами docker.

Термины#

Терминология podman совпадает с терминологией docker, см. Установка и администрирование Docker в Astra Linux Special Edition.

Дополнительно применяются термины:

  • под (pod) — группа контейнеров, выполняющихся совместно и разделяющих общие ресурсы. Подробное описание концепции подов доступно по ссылке: Pods;

  • регистр (registry) — служба, обеспечивающая хранение и распространение образов;

  • репозиторий (repository) — хранилище образов;

  • тэг (tag) — буквенно-цифровой идентификатор, присваиваемый образу в репозитории для дифференциации версий образов.

Установка#

Инструмент podman представлен одноименным пакетом podman. Для установки пакета в обновлениях, вышедших до очередного обновления Astra Linux Special Edition 1.8, требуется подключить расширенный репозиторий. Пакет может быть установлен с помощью графического менеджера пакетов synaptic или из командной строки командой:

sudo apt install podman

При работке с включенным мандатным управлением доступом (МРД) после установки пакета необходимо перезапустить пользовательскую сессию или перезагрузить операционную систему.

Стандартные команды#

Стандартный вызов инструмента имеет следующий синтаксис:

podman <опции> <podman-команда>

Где:

  • опции — необязательные модификаторы команд;

  • podman-команда — действие к исполнению. Команды при этом имеют собственные опции и аргументы и могут иметь собственные подкоманды, например docker pod create.

Стандартные команды podman в основном аналогичны командам docker. Получить список опций и команд с их описанием можно выполнив команду:

podman --help

Подробные справки по podman-командам доступны в справочной системе man. Названия страниц справок формируются как podman-<команда>[-<подкоманда>]. Например, для команды attach справка может быть получена командой:

man podman-attach

А для команды podman create — командой:

man podman-pod-create

Полный список podman-команд с их описанием и описанием отличий от docker доступен по ссылке: containers/podman.

Базовый функционал#

Включение отладки#

Для включения отладки используется опция –log-level с указанием требуемого уровня отладки. Возможные уровни отладки (перечислены в порядке уменьшения количества выводимой информации):

  • trace;

  • debug;

  • info;

  • warn (применяется по умолчанию);

  • warning;

  • error;

  • fatal;

  • panic.

Отладочная информация выводится в стандартный поток сообщений об ошибках (stderr). Пример команды с включенным уровнем отладки debug:

podman --log-level debug ps -a

Загрузка готовых образов#

Готовые образы доступны в сети Интернет в репозиториях (registry) образов. Для загрузки образа можно использовать podman-команду pull:

podman pull <имя_образа>

Имя образа может включать явное указание репозитория (полное имя), например, образ Astra Linux Special Edition 1.7.4 из репозитория registry.astralinux.ru: registry.astralinux.ru/library/alse:1.7.4.

Как и в docker, поиск и загрузка образа могут быть выполнены одной командой запуска контейнера (podman-команда run). Например, загрузка образа и запуск контейнера Astra Linux Special Edition 1.7.4 из репозитория registry.astralinux.ru:

podman --runtime=runc --cgroup-manager=cgroupfs run -it --rm registry.astralinux.ru/library/alse:1.7.4 /bin/bash

Примеры общедоступных репозиториев образов:

  • registry.fedoraproject.org;

  • registry.redhat.io;

  • docker.io.

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

podman info -f "{{.Registries}}"

Пример вывода команды:

map[search:[registry.redhat.io docker.io]]

Поиск готовых образов#

Для поиска образов в репозиториях используется podman-команда search. Репозиторий, в котором должен выполняться поиск, может быть указан в аргументе команды как префикс шаблона для поиска. Например, поиск в репозитории Astra Linux (registry.astralinux.ru):

podman search --list-tags registry.astralinux.ru/alse

Список загруженных образов#

Список загруженных образов можно получить podman-командой images:

podman images

Пример вывода команды:

REPOSITORY                           TAG         IMAGE ID      CREATED      SIZE
registry.astralinux.ru/library/alse  1.7.4       557b8fe356eb  7 weeks ago  98.4 MB

Запуск контейнера из образа#

Для запуска контейнера из загруженного образа используется podman-команда run, например:

podman run -it --rm registry.astralinux.ru/library/alse:1.7.4 /bin/bash

Для запуска контейнера в фоновом режиме используется опция podman-команды -d:

podman run -d <имя_образа>

При запуске контейнера к его файловой системе может быть примонтирован каталог из файловой системы хост-машины. Для это используется опция –mount, например:

podman run --mount type=bind,source=<монтируемый_каталог>,target=<точка_монтирования> <имя_образа>

Получение списка запущенных и сохраненных контейнеров#

Для получения списка запущенных (работающих) контейнеров используется docker-команда ps:

podman ps

Для получения списка всех контейнеров (в том числе завершивших работу) используется опция -a:

podman ps -a

Запуск сохраненного контейнера#

Для запуска сохраненного контейнера используется podman-команда start, например:

podman start <идентификатор_контейнера>

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

Для остановки контейнера используется podman-команда stop:

podman stop <идентификатор_контейнера>

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

Примечание

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

Команда:

podman rm <идентификатор_контейнера>

Получение информации о контейнере, журналов контейнера, статистики работы контейнеров#

Получение полной информации о контейнере:

podman inspect <идентификатор_контейнера>

Эта команда выдает значительный объем информации, сократить который можно с помощью опции –format. Например, получить только сетевой адрес контейнера:

podman inspect <идентификатор_контейнера> --format '{{.NetworkSettings.IPAddress}}'

Для получения журналов контейнера используется podman-команда logs:

podman logs <идентификатор_контейнера>

Для получения статистики работы контейнеров используется podman-команда stats:

podman stats

Эта команда после запуска не завершает свою работу, а выводит статистику с заданным интервалом (по-умолчанию - 5 секунд). Для однократного вывода статистики с последующим завершением работы использовать опцию –no-stream:

podman stats --no-stream

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

Примечание

Для удаления образа предварительно необходимо остановить и удалить все созданные из него контейнеры.

Команда:

podman rmi <идентификатор_образа>

Оркестрация контейнеров#

Создание нового пода#

podman --cgroup-manager cgroupfs pod create <имя_пода>

При создании пода:

  • если имя пода не задано то используется случайно сгенерированное имя;

  • генерируется полный идентификатор (выводится на экран при успешном создании пода);

  • в поде создается служебный контейнер (так называемый infra-контейнер), для чего загружается специальный образ podman-pause. Этот контейнер не выполняет никаких функций, а используется для резервирования места для пода в пространстве имен. Это позволяет в дальнейшем подключать к поду другие (функциональные) контейнеры.

В дальнейшем поды идентифицируются именами или идентификаторами - полным идентификатором, или кратким (первые символы полного идентификатора).

Список существующих подов#

Проверить список подов можно командой:

podman pod ps

Команда отображает краткий идентификатор пода (POD ID, для отображения полных идентификаторов использовать опцию –no-trunc), имя пода (NAME), а также идентификатор infra-контейнера (INFRA ID). Количество контейнеров (# OF CONTAINERS) в новом поде всегда один — это служебный infra-контейнер. Статус пода (STATUS) может иметь следующие значения:

  • Created — в поде нет исполняющихся или остановленных контейнеров;

  • Running — хотя бы один контейнер исполняется;

  • Stopped — исполняющихся контейнеров нет, есть хотя бы один остановленный;

  • Exited — все контейнеры остановлены.

  • Dead — ошибка получения статуса.

Получить имена контейнеров в подах можно командой:

podman pod ps --ctr-names

Имена контейнеров перечислены в столбце NAMES через запятую.

Добавление контейнера в под#

Для добавления контейнеров в под используются podman-команды создания и запуска контейнеров с опцией –pod=<идентификатор_пода>, например:

podman create --pod=testpod nginx

Особенности работы в Astra Linux Special Edition#

Выполнение команд podman от имени других учетных записей#

Выполнение команд podman с нулевой меткой безопасности от имени других учетных записей

Для выполнения команд podman от имени других учетных записей можно использовать конструкцию:

sudo -u <имя_пользователя> -H -i podman <podman-команда>

Где:

  • u <имя_пользователя> — опция, определяющая от имени какого пользователя (целевого пользователя) будет выполнена команда;

  • H — опция, присваивающая переменной HOME значение домашнего каталоге целевого пользователя;

  • i — опция, обеспечивающая перед выполнением команды переход в домашний каталог целевого пользователя.

Выполнение команд podman с ненулевой меткой безопасности от имени других учетных записей#

Для присвоения ненулевой метки безопасности используется команда pdp-exec:

sudo pdp-exec -u macuser -l "1:0:0:0" -- bash -c 'HOME=/home/.pdp/macuser/l1i0c0x0t0x0 ; TMP=/var/private/tmp/l1i0c0x0t0x0 ; cd $HOME ; podman images'

Подробная информация находится в статье