Оглавление |
---|
Информация | ||
---|---|---|
| ||
|
Предупреждение | ||
---|---|---|
| ||
Программное обеспечение расширенного репозитория является сторонним по отношению к Astra Linux, не дорабатывается с точки зрения выполнения требований по безопасности информации и не проверяется при сертификации. При использовании программного обеспечения расширенного репозитория рекомендуется для дополнительной изоляции процессов осуществлять их запуск в изолированной программной среде (контейнере) [п. 7.2 РукКСЗ1]. При использовании для этих целей Docker-контейнеров их запуск целесообразно осуществлять от имени непривилегированного пользователя в rootless-режиме, а при включенном мандатном контроле целостности (МКЦ) с применением технологии запуска контейнеров на пониженном [п. 7.2.1] или выделенном [п. 7.2.7] уровне МКЦ. |
Введение
Podman — инструмент командной строки с открытым исходным кодом, предоставляющий возможности поиска, сборки, передачи и запуска приложений в контейнерной изоляции. Функционально podman аналогичен системе контейнерной изоляции docker, но предоставляет дополнительные возможности по управлению группами контейнеров (container orchestration) и может работать без прав доступа суперпользователя (root). По умолчанию podman использует в качестве средства контейнеризации библиотеку crun (ранее runc). Работа с контейнерами без прав суперпользователя имеет следующие особенности:
- файлы непривилегированных пользователей хранятся в их домашних каталогах, подкаталог .local/share/containers;
- непривилегированные пользователи по умолчанию не могут использовать привилегированные сетевые порты и некоторые команды;
Podman использует контейнеры стандарта Open Container Initiative (OCI), что обеспечивает совместимость с образами docker.
Термины
Терминология podman совпадает с терминологией docker, см. Применение системы изоляции приложений docker в ОС Astra Linux Special Edition 1.7.
Дополнительно применяются термины:
- под (pod) — группа контейнеров, выполняющихся совместно и разделяющих общие ресурсы. Подробное описание концепции подов доступно по ссылке: Pods;
- регистр (registry) — служба, обеспечивающая хранение и распространение образов;
- репозиторий (repository) — хранилище образов;
- тэг (tag) — буквенно-цифровой идентификатор, присваиваемый образу в репозитории для дифференциации версий образов.
Установка
Инструмент podman представлен одноименным пакетом podman. Для установки пакета требуется подключить расширенный репозиторий. После подключения репозитория пакет может быть установлен с помощью Графический менеджер пакетов synaptic или из командной строки командой:
Command |
---|
sudo apt install podman |
Дополнительно сразу можно установить пакет crun, который может использоваться в качестве альтернативного средства контейнеризации.
Стандартные команды
Стандартный вызов инструмента имеет следующий синтаксис:
Command |
---|
podman <опции> <podman-команда> |
Где:
- опции — необязательные модификаторы команд;
- podman-команда — действие к исполнению. Команды при этом имеют собственные опции и аргументы и могут иметь собственные подкоманды, например docker pod create.
Стандартные команды podman в основном аналогичны командам docker. Получить список опций и команд с их описанием можно выполнив команду:
Command |
---|
podman --help |
Пример вывода команды:
Блок кода | ||
---|---|---|
| ||
Manage pods, containers and images Usage: podman [options] [command] Available Commands: attach Attach to a running container auto-update Auto update containers according to their auto-update policy build Build an image using instructions from Containerfiles commit Create new image based on the changed container container Manage containers cp Copy files/folders between a container and the local filesystem create Create but do not start a container diff Display the changes to the object's file system events Show podman events exec Run a process in a running container export Export container's filesystem contents as a tar archive generate Generate structured data based on containers, pods or volumes healthcheck Manage health checks on containers help Help about any command history Show history of a specified image image Manage images images List images in local storage import Import a tarball to create a filesystem image info Display podman system information init Initialize one or more containers inspect Display the configuration of object denoted by ID kill Kill one or more running containers with a specific signal kube Play containers, pods or volumes from a structured file load Load image(s) from a tar archive login Login to a container registry logout Logout of a container registry logs Fetch the logs of one or more containers machine Manage a virtual machine manifest Manipulate manifest lists and image indexes mount Mount a working container's root filesystem network Manage networks pause Pause all the processes in one or more containers pod Manage pods port List port mappings or a specific mapping for the container ps List containers pull Pull an image from a registry push Push an image to a specified destination rename Rename an existing container restart Restart one or more containers rm Remove one or more containers rmi Removes one or more images from local storage run Run a command in a new container save Save image(s) to an archive search Search registry for image secret Manage secrets start Start one or more containers stats Display a live stream of container resource usage statistics stop Stop one or more containers system Manage podman tag Add an additional name to a local image top Display the running processes of a container unmount Unmounts working container's root filesystem unpause Unpause the processes in one or more containers unshare Run a command in a modified user namespace untag Remove a name from a local image update update an existing container version Display the Podman version information volume Manage volumes wait Block on one or more containers Options: --cgroup-manager string Cgroup manager to use ("cgroupfs"|"systemd") (default "systemd") --conmon string Path of the conmon binary -c, --connection string Connection to use for remote Podman service --events-backend string Events backend to use ("file"|"journald"|"none") (default "file") --help Help for podman --hooks-dir strings Set the OCI hooks directory path (may be set multiple times) (default [/usr/share/containers/oci/hooks.d]) --identity string path to SSH identity file, (CONTAINER_SSHKEY) --log-level string Log messages above specified level (trace, debug, info, warn, warning, error, fatal, panic) (default "warn") --namespace string Set the libpod namespace, used to create separate views of the containers and pods on the system --network-cmd-path string Path to the command for configuring the network --network-config-dir string Path of the configuration directory for networks --noout do not output to stdout -r, --remote Access remote Podman service --root string Path to the root directory in which data, including images, is stored --runroot string Path to the 'run directory' where all state information is stored --runtime string Path to the OCI-compatible binary used to run containers. (default "runc") --runtime-flag stringArray add global flags for the container runtime --ssh string define the ssh mode (default "golang") --storage-driver string Select which storage driver is used to manage storage of images and containers --storage-opt stringArray Used to pass an option to the storage driver --syslog Output logging information to syslog as well as the console (default false) --tmpdir string Path to the tmp directory for libpod state content. Note: use the environment variable 'TMPDIR' to change the temporary storage location for container images, '/var/tmp'. --url string URL to access Podman service (CONTAINER_HOST) (default "unix:/run/user/1000/podman/podman.sock") -v, --version version for podman --volumepath string Path to the volume directory in which volume data is stored |
Подробные справки по podman-командам доступны в справочной системе man. Названия страниц справок формируются как podman-<команда>[-<подкоманда>]. Например, для команды attach справка может быть получена командой:
Command |
---|
man podman-attach |
А для команды podman create — командой:
Command |
---|
man podman-pod-create |
Полный список podman-команд с их описанием и описанием отличий от docker доступен по ссылке: https://github.com/containers/podman/blob/main/transfer.md.
Базовый функционал
Включение отладки
Для включения отладки используется опция --log-level с указанием требуемого уровня отладки. Возможные уровни отладки (перечислены в порядке уменьшения количества выводимой информации):
- trace;
- debug;
- info;
- warn (применяется по умолчанию);
- warning;
- error;
- fatal;
- panic.
Отладочная информация выводится в стандартный поток сообщений об ошибках (stderr).
Пример:
Блок кода |
---|
podman --log-level debug ps -a |
Аутентификация по паролю при подключении к репозиториям аутентификации
Репозитории образов могут требовать для подключения аутентификационные данные. Для выполнения базовой аутентификации (имя и пароль) используется podman-команда login:
Command |
---|
podman login <имя_репозитория>[:<порт_репозитория>] |
например:
Command |
---|
podman login repo:5000 |
Команда запрашивает имя и пароль, и сохраняет их в формате, пригодном для использования следующими командами.
Для удаления сохраненных данных используется команда:
Command |
---|
podman logоut <имя_репозитория>[:<порт_репозитория>] |
Загрузка готовых образов
Готовые образы доступны в сети Интернет в репозиториях (registry) образов. Для загрузки образа можно использовать podman-команду pull:
Command |
---|
podman pull <имя_образа> |
Имя образа может включать явное указание репозитория (полное имя), например, образ Astra Linux Special Edition 1.7.4 из репозитория registry.astralinux.ru: registry.astralinux.ru/library/alse:1.7.4
.
Как и в docker, поиск и загрузка образа могут быть выполнены одной командой запуска контейнера (run), например загрузка образа и запуск контейнера Astra Linux Special Edition 1.7.4 из репозитория registry.astralinux.ru:
Command |
---|
podman run -it --rm registry.astralinux.ru/library/alse:1.7.4 /bin/bash |
Примеры общедоступных репозиториев образов:
Получить список используемых репозиториев можно командой:
Command |
---|
podman info -f "{{.Registries}}" |
Блок кода |
---|
map[search:[registry.redhat.io docker.io]] |
Поиск готовых образов
Для поиска образов в репозиториях используется podman-команда search.
Информация |
---|
Репозиторий registry.astralinux.ru возможность поиска не поддерживает. |
Репозиторий, в котором должен выполняться поиск, может быть указан в аргументе команды как префикс шаблона для поиска. Например, поиск шаблона nginx в репозитории образов docker.io:
Command |
---|
podman search docker.io/nginx |
Также репозитории, в которых должен выполняться поиск можно указать в файле /etc/containers/registries.conf в виде списка:
Предупреждение |
---|
Приведенная ниже опция unqualified-search-registries позволяет выполнять поиск в указанных репозиториях по кратким именам образов, т.е. именам, не содержащим явное указание репозитория. Не рекомендуется использовать эту возможность, так как существует риск подмены образа одноименным из ранее указанного репозиотрия. Рекомендуется всегда использовать полные имена образов (имена с явным указанием репозиториев). |
Блок кода |
---|
unqualified-search-registries = [ 'registry.redhat.io', 'docker.io'] |
При этом поиск будет выполняться в том порядке, в котором перечислены репозитории.
Якорь | ||||
---|---|---|---|---|
|
Блок кода |
---|
[[registry]] location="registry:5000" insecure=true |
Где:
- registry — имя сервера (должно разрешаться в IP-адрес этого сервера). Может быть заменено IP-адресом сервера;
- 5000 — IP-порт (используется docker-registry по умолчанию);
- insecure=true — разрешение работать по протоколу HTTP (используется docker-registry по умолчанию).
Полное описание синтаксиса файла /etc/containers/registries.conf доступно в справочной системе man:
Command |
---|
man containers-redistries.conf |
Список загруженных образов
Список загруженных образов можно получить podman-командой images:
Command |
---|
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, например:
Command |
---|
podman run -it --rm registry.astralinux.ru/library/alse:1.7.4 /bin/bash |
Для запуска контейнера в фоновом режиме используется опция podman-команды -d:
Command |
---|
podman run -d <имя_образа> |
При запуске контейнера к его файловой системе может быть примонтирован каталог из файловой системы хост-машины. Для это используется опция --mount, например:
Command |
---|
podman run --mount type=bind,source=<монтируемый_каталог>,target=<точка_монтирования> <имя_образа> |
Получение списка запущенных и сохраненных контейнеров
Для получения списка запущенных (работающих) контейнеров используется docker-команда ps:
Command |
---|
podman ps |
Для получения списка всех контейнеров (в том числе завершивших работу) используется опция -a:
Command |
---|
podman ps -a |
Блок кода |
---|
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0468d9f62e2d registry.astralinux.ru/library/alse:1.7.4 /bin/bash 12 seconds ago Exited (0) 5 seconds ago priceless_hertz |
Далее для идентификации контейнеров используются либо их числовые идентификаторы (CONTAINER ID) либо имена (NAMES).
Запуск сохраненного контейнера
Для запуска сохраненного контейнера используется podman-команда start, например:
Command |
---|
podman start <идентификатор_контейнера> |
Остановка контейнера
Для остановки контейнера используется podman-команда stop:
Command |
---|
podman stop <идентификатор_контейнера> |
Удаление контейнера
Информация |
---|
Перед удалением контейнер должен быть остановлен. |
Команда:
Command |
---|
podman rm <идентификатор_контейнера> |
Получение информации о контейнере, журналов контейнера, статистики работы контейнеров
Получение полной информации о контейнере:
Command |
---|
podman inspect <идентификатор_контейнера> |
Эта команда выдает значительный объем информации, сократить который можно с помощью опции --format. Например, получить только сетевой адрес контейнера:
Command |
---|
podman inspect <идентификатор_контейнера> --format '{{.NetworkSettings.IPAddress}}' |
Для получения журналов контейнера используется podman-команда logs:
Command |
---|
podman logs <идентификатор_контейнера> |
Для получения статистики работы контейнеров используется podman-команда stats:
Command |
---|
podman stats |
Эта команда после запуска не завершает свою работу, а выводит статистику с заданным интервалом (по-умолчанию - 5 секунд). Для однократного вывода статистики с последующим завершением работы использовать опцию --no-stream:
Command |
---|
podman stats --no-stream |
Удаление образа
Информация |
---|
Для удаления образа предварительно необходимо остановить и удалить все созданные из него контейнеры. |
Команда:
Command |
---|
podman rmi <идентификатор_образа> |
Создание собственного контейнера из существующего образа
echo -e "FROM registry.astralinux.ru/library/alse:1.7.4\nRUN mkdir /testdir\nRUN echo test > /testdir/testfile" > Dockerfile
podman build -t testbuikd .
Создание собственного образа
Для создания образов можно использовать модифицированный сценарий из статьи Создание Docker-образов Astra Linux, заменив в нем команды docker на команды podman:
Информация | ||
---|---|---|
Для применения сценария требуется установить пакет debootstrap:
|
Блок кода |
---|
#!/bin/sh if [ -z $REPO ]; then REPO="https://dl.astralinux.ru/astra/stable/orel/repository" fi set -e IMAGE="${IMAGE:-astra_linux_ce_2.12}" ROOTFS_IMAGE="$IMAGE-rootfs" CODENAME="${CODENAME:-orel}" TMPDIR=`mktemp -d` cd $TMPDIR cleanup() { cd $HOME # debootstrap leaves mounted /proc and /sys folders in chroot when terminated by Ctrl-C sudo umount $TMPDIR/proc $TMPDIR/sys 2>&1 >/dev/null || true # Delete temporary data at exit sudo rm -rf $TMPDIR } trap cleanup EXIT sudo -E debootstrap --no-check-gpg --variant=minbase --include=apt-transport-https,ca-certificates \ --components=main,contrib,non-free "$CODENAME" ./chroot "$REPO" echo "deb $REPO $CODENAME contrib main non-free" | sudo tee ./chroot/etc/apt/sources.list podman rmi "$ROOTFS_IMAGE" || true sudo tar -C chroot -c . | podman import - "$ROOTFS_IMAGE" podman rmi "$IMAGE" || true podman build --network=host --no-cache=true -t "$IMAGE" - <<EOF FROM $ROOTFS_IMAGE ENV TERM xterm-256color ENV DEBIAN_FRONTEND noninteractive RUN apt-get update WORKDIR / CMD bash EOF printf 'podman image `%s` has been generated\n' "$IMAGE" exit 0 |
Запустим:
# ./build.sh
...
podman image `astra_linux_ce_2.12` has been generated
umount: /tmp/tmp.b6LT9fyry0/proc: no mount point specified.
umount: /tmp/tmp.b6LT9fyry0/sys: no mount point specified.
# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/astra_linux_ce_2.12 latest 50c61172d57c 9 seconds ago 218 MB
# podman run -ti astra_linux_ce_2.12 bash
root@9145be5d7e9e:/# cat /etc/astra_version
CE 2.12.44 (orel)
Создание собственного репозитория образов
Якорь | ||||
---|---|---|---|---|
|
Так как репозитории podman совместимы с репозиториями docker для создания собственного репозитория можно использовать пакет docker-registry, входящий в состав базового репозитория. Настройка клиентского подключения к такому репозиторию описана выше. Установить пакет можно командой:
Command |
---|
sudo apt install docker-registry |
При установке пакета:
- создается служебный пользователь docker-registry, от имени которого работает служба;
- создается каталог для размещения репозитория (/var/lib/docker-registry/);
создается конфигурационный файл /etc/docker/registry/config.yml со следующим содержимым:
Блок кода version: 0.1 log: fields: service: registry storage: cache: blobdescriptor: inmemory filesystem: rootdirectory: /var/lib/docker-registry delete: enabled: true http: addr: :5000 headers: X-Content-Type-Options: [nosniff] auth: htpasswd: realm: basic-realm path: /etc/docker/registry health: storagedriver: enabled: true interval: 10s threshold: 3
По при этом регистр (служба репозитория) работает со следующими параметрами:
- подключение к службе возможно через IP-порт 5000 внешних сетевых интерфейсов;
- используется протокол HTTP;
- используется базовая аутентификация пользователей (т.е имя и пароль).
Описание конфигурационного файла доступно в каталоге /usr/share/doc/docker-registry/ после установки пакета dicker-registry.
Для полного отключения аутентификации (предоставления анонимного доступа к репозиторию) следует:
Удалить из конфигурационного файла секцию:
Блок кода auth: htpasswd: realm: basic-realm path: /etc/docker/registry
Перезапустить службу docker-registry:
Блок кода sudo systemctl restart docker-registry
Для настройки базовой аутентификации (аутентификации по паролю):
Установить пакет apache2-utils из базового репозитория:
Command sudo apt install apache2-utils Создать файл для хранения паролей, например, файл /etc/docker/registry-pass:
Command sudo touch /etc/docker/registry-pass Ограничить права доступа к этому файлу, предоставив при этом право чтения служебному пользователю docker-registry :
Command sudo chmod 640 /etc/docker/registry-pass
sudo setfacl -m u:docker-registry:r /etc/docker/registry-passВ конфигурационном файле /etc/docker/registry/config.yml указать путь к созданному файлу с паролями (/etc/docker/registry-pass) в блоке auth:htpasswd:path:
Блок кода auth: htpasswd: realm: basic-realm path: /etc/docker/registry-pass
Перезапустить службу docker-registry:
Command sudo systemctl restart docker-registry Для каждого пользователя репозитория выполнить команду (добавлять пользователей можно по мере необходимости):
Command sudo htpasswd -B -b /etc/docker/registry-pass <имя> <пароль> Опция -B указывает способ построения хеша пароля (bcrypt).
Опция -b позволяет указать пароль в командной строке, что может быть небезопасно. Если ее не использовать, то пароль будет запрошен в интерактивном режиме.
Создание собственного репозитория образов собственными средствами podman
(статья по ссылке устарела и применима частично) https://thenewstack.io/tutorial-host-a-local-podman-image-registry/
Загрузка образа в репозиторий
Оркестрация контейнеров (работа с подами)
Создание нового пода
Создание нового пода:
Command |
---|
podman --cgroup-manager cgroupfs pod create <имя_пода> |
При создании пода:
- если имя пода не задано то используется случайно сгенериророванное имя;
- генерируется полный идентификатор (выводится на экран при успешном создании пода);
- в поде создается служебный контейнер (так называемый infra-контейнер), для чего загружается специальный образ podman-pause. Этот контейнер не выполняет никаких функций, а используется для резервирования места для пода в пространстве имен. Это позволяет в дальнейшем подключать к поду другие (функциональные) контейнеры.
В дальнейшем поды идентифицируются именами или идентификаторами - полным идентификатором, или кратким (первые символы полного идентификатора).
Список существующих подов
Проверить список подов можно командой:
Command |
---|
podman pod ps |
пример вывода команды:
Блок кода |
---|
POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS 312fb1c5553f testpod Created 22 minutes ago 76972a488dbb 1 |
Команда отображает краткий идентификатор пода (POD ID, для отображения полных идентификаторов использовать опцию --no-trunc), имя пода (NAME), а также идентификатор infra-контейнера (INFRA ID). Количество контейнеров (# OF CONTAINERS) в новом поде всегда один — это служебный infra-контейнер. Статус пода (STATUS) может иметь следующие значения:
- Created — в поде нет исполняющихся или остановленных контейнеров;
- Running — хотя бы один контейнер исполняется;
- Stopped — исполняющихся контейнеров нет, есть хотя бы один остановленный;
- Exited — все контейнеры остановлены.
- Dead — ошибка получения статуса.
Получить имена контейнеров в подах можно командой:
Command |
---|
podman pod ps --ctr-names |
Пример вывода команды:
Блок кода |
---|
POD ID NAME STATUS CREATED INFRA ID NAMES 312fb1c5553f testpod Created 56 minutes ago 76972a488dbb friendly_rhodes,312fb1c5553f-infra,brave_turing |
Имена контейнеров перечислены в столбце NAMES через запятую.
Добавление контейнера в под
Для добавления контейнеров в под используются podman-команды создания и запуска контейнеров с опцией --pod=<идентификатор_пода>, например:
Command |
---|
podman create --pod=testpod nginx |
Управление подами
Команды для управления подами:
Команда | Справочная страница | Description |
---|---|---|
clone | Создать копию существующего пода. | |
create | Создать новый под. | |
exists | Проверить, существует ли под в локальном хранилище. | |
inspect | Получить описание пода. | |
kill | Прекратить основной процесс в одном или нескольких подах. | |
logs | Получить журналы пода для одного или нескольких контейнеров. | |
pause | Приостановить один или несколько подов. | |
prune | Удалить все остановленные поды и их контейнеры. | |
ps | Получить список подов. | |
restart | Перезапустить один или несколько подов. | |
rm | Удалить один или несколько остановленных подов. | |
start | Запустить один или несколько подов. | |
stats | Получить статистику использования ресурсов одного или нескольких подов. | |
stop | Остановить один или несколько подов. | |
top | Получить список исполняющихся процессов в контейнерах пода. | |
unpause | Запустить приостановленные один или несколько подов. |
Особенности работы в Astra Linux Special Edition Edition
Выполнение команд podman от имени других учетных записей
Выполнение команд podman с нулевой меткой безопасности от имени других учетных записей
Для выполнения команд podman от имени других учетных записей можно использовать конструкцию:
Command |
---|
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'