Данная статья применима к:
- Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8)
- Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7) c установленным обновлением БЮЛЛЕТЕНЬ № 2022-0819SE17 (оперативное обновление 1.7.2) с подключенным расширенным репозиторием ;
- Astra Linux Special Edition РУСБ.10015-10 c установленным обновлением БЮЛЛЕТЕНЬ № 2022-0819SE17 (оперативное обновление 1.7.2) с подключенным расширенным репозиторием;
- Astra Linux Special Edition РУСБ.10015-17 с подключенным расширенным репозиторием .
- Astra Linux Special Edition РУСБ.10015-37 (очередное обновление 7.7) c установленным обновлением БЮЛЛЕТЕНЬ № 2022-0819SE17 (оперативное обновление 1.7.2) с подключенным расширенным репозиторием ;
- Astra Linux Special Edition РУСБ.10152-02 (очередное обновление 4.7 с установленным обновлением БЮЛЛЕТЕНЬ № 2022-0926SE47 (оперативное обновление 4.7.2)
Внимание!
В Astra Linux Special Edition очередное обновление 1.8 программное обеспечение podman включено в состав основного репозитория.
В более ранних обновлениях это ПО находится в составе расширенного репозитория, и при его использовании следует учитывать следующее:
- Программное обеспечение расширенного репозитория является сторонним по отношению к Astra Linux, не дорабатывается с точки зрения выполнения требований по безопасности информации и не проверяется при сертификации.
Подробнее см. Использование стороннего программного обеспечения в аттестованных информационных системах, функционирующих под управлением Astra Linux Special Edition. - При использовании программного обеспечения расширенного репозитория рекомендуется для дополнительной изоляции процессов осуществлять их запуск в изолированной программной среде (контейнере). При использовании для этих целей Docker-контейнеров их запуск целесообразно осуществлять от имени непривилегированного пользователя в rootless-режиме, а при включенном мандатном контроле целостности (МКЦ) с применением технологии запуска контейнеров на пониженном или выделенном уровне МКЦ. Подробнее см. Руководство по КСЗ в составе эксплуатационной документации используемого обновления.
Введение
Podman — инструмент командной строки с открытым исходным кодом, предоставляющий возможности поиска, сборки, передачи и запуска приложений в контейнерной изоляции. Функционально podman аналогичен системе контейнерной изоляции docker, но предоставляет дополнительные возможности по управлению группами контейнеров (т.н. оркестрация контейнеров, container orchestration) и может работать без прав доступа суперпользователя (root).
--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 или из командной строки командой:
При работке с включенным мандатным управлением доступом (МРД) после установки пакета необходимо перезапустить пользовательскую сессию или перезагрузить операционную систему.
Настройка
- Убедиться, что у пользователей, которые работают (должны работать) с podman имеются выделенные диапазоны идентификаторов. Проверить наличие диапазона можно командой:cat /etc/subuid /etc/subgid | grep <имя_пользователя>Если диапазоны не назначены, то их можно назначить вручную (при этом необходимо следить, чтобы диапазоны не пересекались):sudo usermod --add-subuids <первое_значение_диапазона>-<последнее_значение_диапазона> --add-subgids <первое_значение_диапазона>-<последнее_значение_диапазона> <имя_пользователя>После изменения диапазонов перезапустить запущенные контейнеры. Это можно сделать либо вручную, либо командой:sudo -u <имя_пользователя> podman system migrate
- Если предполагается, что непривилегированные контейнеры должны принимать сетевые подключения к привилегированным IP-портам (IP-порты с номерами менее 1024), то разрешить такие подключения для непривилегированных пользователей:
- Временное разрешение до перезагрузки:sudo sysctl net.ipv4.ip_unprivileged_port_start=0
- Постоянное разрешение:sudo sysctl -w net.ipv4.ip_unprivileged_port_start=0
sudo -u <имя_пользователя> podman system migrate - Временное разрешение до перезагрузки:
Стандартные команды
Стандартный вызов инструмента имеет следующий синтаксис:
- опции — необязательные модификаторы команд;
- podman-команда — действие к исполнению. Команды при этом имеют собственные опции и аргументы и могут иметь собственные подкоманды, например docker pod create.
Стандартные команды podman в основном аналогичны командам docker . Получить список опций и команд с их описанием можно выполнив команду:
Пример вывода команды:
Подробные справки по podman-командам доступны в справочной системе man. Названия страниц справок формируются как podman-<команда>[-<подкоманда>]. Например, для команды attach справка может быть получена командой:
Базовый функционал
Включение отладки
Для включения отладки используется опция --log-level с указанием требуемого уровня отладки. Возможные уровни отладки (перечислены в порядке уменьшения количества выводимой информации):
- trace;
- debug;
- info;
- warn (применяется по умолчанию);
- warning;
- error;
- fatal;
- panic.
Отладочная информация выводится в стандартный поток сообщений об ошибках (stderr). Пример команды с включенным уровнем отладки debug:
podman --log-level debug ps -a
Аутентификация по паролю при подключении к репозиториям
Репозитории образов могут требовать для подключения аутентификационные данные. Для выполнения базовой аутентификации (аутентификации по имени и паролю) используется podman-команда login:
Для удаления сохраненных аутентификационных данных используется команда:
Загрузка готовых образов
Готовые образы доступны в сети Интернет в репозиториях (registry) образов. Для загрузки образа можно использовать podman-команду pull:
registry.astralinux.ru/library/alse:1.7.4
. Как и в docker, поиск и загрузка образа могут быть выполнены одной командой запуска контейнера (podman-команда run). Например, загрузка образа и запуск контейнера Astra Linux Special Edition 1.7.4 из репозитория registry.astralinux.ru:
Примеры общедоступных репозиториев образов:
Получить список используемых репозиториев можно командой:
map[search:[registry.redhat.io docker.io]]
Поиск готовых образов
Для поиска образов в репозиториях используется podman-команда search. Репозиторий, в котором должен выполняться поиск, может быть указан в аргументе команды как префикс шаблона для поиска. Например, поиск в репозитории Astra Linux (registry.astralinux.ru):
Пример вывода команды:
Также репозитории, в которых должен выполняться поиск можно указать в файле /etc/containers/registries.conf в виде списка:
Не рекомендуется использовать эту возможность, так как существует риск подмены образа одноименным из ранее указанного репозитория.
Рекомендуется всегда использовать полные имена образов (имена с явным указанием репозиториев).
unqualified-search-registries = [ 'registry.redhat.io', 'docker.io']
При этом поиск будет выполняться в том порядке, в котором перечислены репозитории.
Также можно задать репозитории для поиска по полным именам. Эти параметры должны располагаться в конфигурационном файле после параметра unqualified-search-registries. Например, определение собственного репозитория на основе пакета docker-registry может выглядеть так:
[[registry]] location="registry:5000" insecure=true
Где:
- registry — имя сервера (должно разрешаться в IP-адрес этого сервера). Может быть заменено IP-адресом сервера;
- 5000 — IP-порт (используется docker-registry по умолчанию);
- insecure=true — разрешение работать по протоколу HTTP (используется docker-registry по умолчанию).
Полное описание синтаксиса файла /etc/containers/registries.conf доступно в справочной системе man:
Список загруженных образов
Список загруженных образов можно получить 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, например:
Получение списка запущенных и сохраненных контейнеров
Для получения списка запущенных (работающих) контейнеров используется docker-команда ps:
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, например:
Для остановки контейнера используется podman-команда stop:
Удаление контейнера
Перед удалением контейнер должен быть остановлен.
Команда:
Получение информации о контейнере, журналов контейнера, статистики работы контейнеров
Получение полной информации о контейнере:
Удаление образа
Для удаления образа предварительно необходимо остановить и удалить все созданные из него контейнеры.
Команда:
Создание собственного контейнера из существующего образа
Создать dockerfile с указанием образа, из которого будет создаваться контейнер (образ registry.astralinux.ru/library/alse:1.7.4) и команд для его создания (команда mkdir /testdir и команда echo test > /testdir/testfile):
echo -e "FROM registry.astralinux.ru/library/alse:1.7.4\n RUN mkdir /testdir\n RUN echo test > /testdir/testfile" > DockerfileСоздать контейнер:
podman --runtime=runc --cgroup-manager=cgroupfs build -t testbuild .
Создание собственного образа
Для создания собственных образов можно использовать модифицированный сценарий из статьи Создание Docker-образов Astra Linux, заменив в нем команды docker на команды podman:
Для применения сценария требуется установить пакет debootstrap:
Сценарий использует переменные окружения:
- REPO — репозиторий, из которого будет собираться образ debootstrap (по умолчанию — https://dl.astralinux.ru/astra/stable/orel/repository);
- IMAGE — имя создаваемого образа (по умолчанию - astra_linux_ce_2.12);
- ROOTFS_IMAGE — имя промежуточного образа (по умолчанию - <имя_создаваемого_образа>-rootfs);
- CODENAME — имя дистрибутива (по умолчанию — orel).
Пример сценария:
#!/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" trap - EXIT 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 --runtime=runc --cgroup-manager=cgroupfs 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
Пример запуска сценария для создания образа Astra Linux Special Edition 1.7 из Интернет-репозитория (предполагается, что сценарий сохранен в файле build.sh):
podman image `alse1.7` has been generated
Создание собственного репозитория образов
Создание собственного репозитория образов с помощью пакета docker-registry
Так как репозитории образов podman совместимы с репозиториями образов docker для создания собственного репозитория можно использовать пакет 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/ после установки пакета docker-registry.
Для того, чтобы podman работал с используемым по умолчанию протоколом HTTP (вместо HTTPS) следует обозначить репозиторий как "небезопасный", для чего в конфигурационный файл /etc/containers/registries.conf добавить секцию описания репозитория с параметром insecure, например:
[[registry]] location = "localhost:5000" insecure = true
Для полного отключения аутентификации (предоставления анонимного доступа к репозиторию) следует:
Удалить из конфигурационного файла секцию:
auth: htpasswd: realm: basic-realm path: /etc/docker/registry
Перезапустить службу docker-registry:
sudo systemctl restart docker-registry
Для настройки базовой аутентификации (аутентификации по паролю):
Установить пакет apache2-utils из базового репозитория:
sudo apt install apache2-utilsСоздать файл для хранения паролей, например, файл /etc/docker/registry-pass:
sudo touch /etc/docker/registry-passОграничить права доступа к этому файлу, предоставив при этом право чтения служебному пользователю docker-registry :
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:
sudo systemctl restart docker-registryДля каждого пользователя репозитория выполнить команду (добавлять пользователей можно по мере необходимости):
sudo htpasswd -B -b /etc/docker/registry-pass <имя> <пароль>Опция -B указывает способ построения хеша пароля (bcrypt).
Опция -b позволяет указать пароль в командной строке, что может быть небезопасно. Если ее не использовать, то пароль будет запрошен в интерактивном режиме.
Создание собственного репозитория образов собственными средствами podman
Материал находится в разработке.
(Статья по ссылке устарела и применима частично https://thenewstack.io/tutorial-host-a-local-podman-image-registry/).
Загрузка образа в репозиторий
Предположим, что:
- ранее установлен пакет docker-registry и, соответственно запущена служба локального репозитория образов;
- служба использует IP-порт 5000;
- для упрощения принимается, что в службе настроен анонимный доступ;
- имеется ранее созданный пользовательский образ localhost/alse1.7.
Для загрузки образа:
Создать новый тег образа, соответствующий имени репозитория, в который будет выполняться загрузка:
podman tag alse1.7 localhost:5000/alse1.7Опционально убедиться, что тег создался:
podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/alse1.7 latest 8359adc98b69 2 hours ago 209 MB
localhost:5000/alse1.7 latest 8359adc98b69 2 hours ago 209 MBЗагрузить "тегированный" образ в репозиторий:
podman push localhost:5000/alse1.7
Getting image source signatures
Copying blob e5a6e1aacdde done
Copying blob 39122d40d697 done
Copying config 8359adc98b done
Writing manifest to image destination
Storing signaturesОпционально убедиться, что образ загружен:
podman search localhost:5000/alseОбраз также будет доступен по внешнему сетевому IP-адресу (в примере ниже - 10.107.0.227):
NAME DESCRIPTION
localhost:5000/alse1.7podman search 10.107.0.227:5000/alse
NAME DESCRIPTION
10.107.0.227:5000/alse1.7
Оркестрация контейнеров (работа с подами)
Создание нового пода
Создание нового пода:
При создании пода:
- если имя пода не задано то используется случайно сгенерированное имя;
- генерируется полный идентификатор (выводится на экран при успешном создании пода);
- в поде создается служебный контейнер (так называемый infra-контейнер), для чего загружается специальный образ podman-pause. Этот контейнер не выполняет никаких функций, а используется для резервирования места для пода в пространстве имен. Это позволяет в дальнейшем подключать к поду другие (функциональные) контейнеры.
В дальнейшем поды идентифицируются именами или идентификаторами - полным идентификатором, или кратким (первые символы полного идентификатора).
Список существующих подов
Проверить список подов можно командой:
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 — ошибка получения статуса.
Получить имена контейнеров в подах можно командой:
POD ID NAME STATUS CREATED INFRA ID NAMES 312fb1c5553f testpod Created 56 minutes ago 76972a488dbb friendly_rhodes,312fb1c5553f-infra,brave_turing
Имена контейнеров перечислены в столбце NAMES через запятую.
Добавление контейнера в под
Для добавления контейнеров в под используются podman-команды создания и запуска контейнеров с опцией --pod=<идентификатор_пода>, например:
Управление подами
Команды для управления подами:
Команда | Справочная страница | Description |
---|---|---|
clone | Создать копию существующего пода. | |
create | Создать новый под. | |
exists | Проверить, существует ли под в локальном хранилище. | |
inspect | Получить описание пода. | |
kill | Прекратить основной процесс в одном или нескольких подах. | |
logs | Получить журналы пода для одного или нескольких контейнеров. | |
pause | Приостановить один или несколько подов. | |
prune | Удалить все остановленные поды и их контейнеры. | |
ps | Получить список подов. | |
restart | Перезапустить один или несколько подов. | |
rm | Удалить один или несколько остановленных подов. | |
start | Запустить один или несколько подов. | |
stats | Получить статистику использования ресурсов одного или нескольких подов. | |
stop | Остановить один или несколько подов. | |
top | Получить список исполняющихся процессов в контейнерах пода. | |
unpause | Запустить приостановленные один или несколько подов. |
Особенности работы в Astra Linux Special Edition
Выполнение команд podman от имени других учетных записей
Выполнение команд podman с нулевой меткой безопасности от имени других учетных записей
Для выполнения команд podman от имени других учетных записей можно использовать конструкцию:
- -u <имя_пользователя> — опция, определяющая от имени какого пользователя (целевого пользователя) будет выполнена команда;
- -H — опция, присваивающая переменной HOME значение домашнего каталоге целевого пользователя;
- -i — опция, обеспечивающая перед выполнением команды переход в домашний каталог целевого пользователя.
Выполнение команд podman с ненулевой меткой безопасности от имени других учетных записей
Для присвоения ненулевой метки безопасности используется команда pdp-exec: