Дерево страниц

Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.

Оглавление


Информация
titleДанная статья применима к:
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7), РУСБ.10015-37 (очередное обновление 7.7), РУСБ.10015-10 c установленным обновлением БЮЛЛЕТЕНЬ № 2022-0819SE17 (оперативное обновление 1.7.2) с подключенным расширенным репозиторием;
  • Astra Linux Special Edition РУСБ.10015-17 с подключенным расширенным репозиторием.



Предупреждение
titleВнимание!

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

При использовании программного обеспечения расширенного репозитория рекомендуется для дополнительной изоляции процессов осуществлять их запуск в изолированной программной среде (контейнере) [п. 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) — группа контейнеров, выполняющихся совместно и разделяющих общие ресурсы;
  • регистр (registry) — служба, обеспечивающая хранение и распространение образов;
  • репозиторий (repository) — хранилище образов;
  • тэг (tag) — буквенно-цифровой идентификатор, присваиваемый образу в репозитории для дифференциации версий образов.

Установка

Инструмент podman представлен одноименным пакетом podman. Для установки пакета требуется подключить расширенный репозиторий. После подключения репозитория пакет может быть установлен с помощью Графический менеджер пакетов synaptic или из командной строки командой:

Command
sudo apt install podman

Дополнительно сразу можно установить пакет crun, который может использоваться в качестве альтернативного средства контейнеризации.

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

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

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

Где:

  • опции — необязательные модификаторы команд;
  • podman-команда — действие к исполнению. Команды при этом имеют собственные опции и аргументы.

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

Command
podman --help

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

Блок кода
collapsetrue
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-команд с их описанием и описанием отличий от docker доступен по ссылке: https://github.com/containers/podman/blob/main/transfer.md.

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

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

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

Command

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

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

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

  • trace;
  • debug;
  • info;
  • warn (применяется по умолчанию);
  • warning;
  • error;
  • fatal;
  • panic.

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

Пример:

Блок кода
podman --log-level debug ps -a 

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

Готовые образы доступны в сети Интернет в репозиториях (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

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

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

Для поиска образов в репозиториях используется podman-команда search.

Информация
Репозиторий registry.astralinux.ru возможность поиска не поддерживает.

Репозиторий, в котором должен выполняться поиск, может быть указан в аргументе команды как префикс шаблона для поиска. Например, поиск шаблона nginx в репозитории образов docker.io:

Command

podman search docker.io/nginx

Также репозитории, в которых должен выполняться поиск можно указать в файле

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 позволяет выполнять поиск в указанных репозиториях по кратким именам образов, т.е. именам, не содержащим явное указание репозитория.
Не рекомендуется использовать эту возможность, так как существует риск подмены образа одноименным из ранее указанного репозиотрия.
Рекомендуется всегда использовать полные имена образов (имена с явным указанием репозиториев).
/etc/containers/registries.conf в виде списка:


Блок кода
unqualified-search-registries = [ 'registry.redhat.io', 'docker.io']

При этом поиск будет выполняться в том порядке, в котором перечислены репозитории.

Полное описание синтаксиса файла  /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:

Command
sudo apt install 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)



Создание собственного репозитория образов

https://thenewstack.io/tutorial-host-a-local-podman-image-registry/

Загрузка образа в репозиторий


Оркестрация контейнеров (работа с подами)


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

Работа в сессии SSH

Работа с включенным МКЦ

Запуск контейнера от имени высокоцелостного пользователя

Запуск контейнера от имени низкоцелостного пользователя

Контроль уязвимостей в контейнерах