Оглавление |
---|
Информация | ||
---|---|---|
| ||
|
Предупреждение | ||
---|---|---|
| ||
Программное обеспечение расширенного репозитория является сторонним по отношению к Astra Linux, не дорабатывается с точки зрения выполнения требований по безопасности информации и не проверяется при сертификации. При использовании программного обеспечения расширенного репозитория рекомендуется для дополнительной изоляции процессов осуществлять их запуск в изолированной программной среде (контейнере) [п. 7.2 РукКСЗ1]. При использовании для этих целей Docker-контейнеров их запуск целесообразно осуществлять от имени непривилегированного пользователя в rootless-режиме, а при включенном мандатном контроле целостности (МКЦ) с применением технологии запуска контейнеров на пониженном [п. 7.2.1] или выделенном [п. 7.2.7] уровне МКЦ. |
Введение
Podman — инструмент командной строки с открытым исходным кодом, предоставляющий возможности поиска, сборки, передачи и запуска приложений в контейнерной изоляции. Функционально podman аналогичен системе контейнерной изоляции docker, но реализация podman не использует отдельные системные службы предоставляет дополнительные возможности по управлению группами контейнеров (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 |
Пример вывода команды:
Блок кода | ||
---|---|---|
| ||
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 |
Базовый функционал
Загрузка готовых образов
Готовые образы доступны в сети Интернет в репозиториях (registry) образов. Для загрузки образа можно использовать podman-команду pull:
Command |
---|
podman pull <имя_образа> |
Или, как и в 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 |
Также репозитории, в которых должен выполняться поиск можно указать в файле /etc/containers/registries.conf в виде списка:
Блок кода |
---|
unqualified-search-registries = [ 'registry.redhat.io', 'docker.io'] |
При этом поиск будет выполняться в том порядке, в котором перечислены репозитории.
Список загруженных образов
Список загруженных образов можно получить 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)
Создание собственного репозитория образов
https://thenewstack.io/tutorial-host-a-local-podman-image-registry/