Оглавление |
---|
Информация | ||
---|---|---|
| ||
|
Введение
Podman — инструмент командной строки с открытым исходным кодом, предоставляющий возможности поиска, сборки, передачи и запуска приложений в контейнерной изоляции. Функционально podman аналогичен системе контейнерной изоляции docker, но реализация podman не использует отдельные системные службы и может работать без прав доступа суперпользователя (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, который может использоваться в качестве альтернативного средства контейнеризации.
|
Предупреждение | ||
---|---|---|
| ||
Программное обеспечение расширенного репозитория является сторонним по отношению к Astra Linux, не дорабатывается с точки зрения выполнения требований по безопасности информации и не проверяется при сертификации. При использовании программного обеспечения расширенного репозитория рекомендуется для дополнительной изоляции процессов осуществлять их запуск в изолированной программной среде (контейнере) [п. 7.2 РукКСЗ1]. При использовании для этих целей Docker-контейнеров их запуск целесообразно осуществлять от имени непривилегированного пользователя в rootless-режиме, а при включенном мандатном контроле целостности (МКЦ) с применением технологии запуска контейнеров на пониженном [п. 7.2.1] или выделенном [п. 7.2.7] уровне МКЦ. |
Введение
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 1.7.
Дополнительно применяются термины:
- под (pod) — группа контейнеров, выполняющихся совместно и разделяющих общие ресурсы. Подробное описание концепции подов доступно по ссылке: Pods;
- регистр (registry) — служба, обеспечивающая хранение и распространение образов;
- репозиторий (repository) — хранилище образов;
- тэг (tag) — буквенно-цифровой идентификатор, присваиваемый образу в репозитории для дифференциации версий образов.
Установка
Инструмент podman представлен одноименным пакетом podman. Для установки пакета требуется подключить расширенный репозиторий. После подключения репозитория пакет может быть установлен с помощью графического менеджера пакетов synaptic или из командной строки командой:
Command |
---|
sudo apt install podman |
При работке с включенным мандатным управлением доступом (МРД) после установки пакета необходимо перезапустить пользовательскую сессию или перезагрузить операционную систему.
Стандартные команды
Стандартный вызов инструмента имеет следующий синтаксис:
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 |
Стандартные команды
Стандартный вызов инструмента имеет следующий синтаксис:
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А для команды podman create — командой:
Command |
---|
podman pull <имя_образа> |
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). Пример команды с включенным уровнем отладки debug:
Блок кода |
---|
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, поиск и загрузка образа могут быть выполнены одной командой запуска контейнера (podman-команда run). Например, загрузка образа и запуск контейнера Astra Linux Special Edition 1.7.4 из репозитория registry.astralinux.ru:
Command |
---|
podman --runtime=runc --cgroup-manager=cgroupfs run -it -- |
Или, как и в 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 <имя_образа>info -f "{{.Registries}}" |
Блок кода |
---|
map[search:[registry.redhat.io docker.io]] |
Поиск готовых образов
Для поиска образов в репозиториях используется podman-команда search. Репозиторий, в котором должен выполняться поиск, может быть указан в аргументе команды как префикс шаблона для поиска. Например, поиск в репозитории Astra Linux (registry.astralinux.ru)При запуске контейнера к его файловой системе может быть примонтирован каталог из файловой системы хост-машины. Для это используется опция --mount, например:
Command |
---|
podman run --mount type=bind,source=<монтируемый_каталог>,target=<точка_монтирования> <имя_образа> |
Получение списка запущенных и сохраненных контейнеров
Для получения списка запущенных (работающих) контейнеров используется docker-команда ps:
Command |
---|
podman ps |
Для получения списка всех контейнеров (в том числе завершивших работу) используется опция -a:
Command |
---|
podman ps -a |
search --list-tags registry.astralinux.ru/alse |
Пример вывода команды:
Блок кода | ||
---|---|---|
| ||
NAMECONTAINER ID IMAGE TAG registry.astralinux.ru/alse 1.7 registry.astralinux.ru/alse 1.7.0 registry.astralinux.ru/alse 1.7.0-mg9.0.0 registry.astralinux.ru/alse 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/
1.7.1
registry.astralinux.ru/alse 1.7.1-mg9.0.0
registry.astralinux.ru/alse 1.7.2
registry.astralinux.ru/alse 1.7.2-mg9.0.0
registry.astralinux.ru/alse 1.7.3
registry.astralinux.ru/alse 1.7.3-mg8.2.1
registry.astralinux.ru/alse 1.7.3-mg9.0.0
registry.astralinux.ru/alse 1.7.3uu1
registry.astralinux.ru/alse 1.7.3uu1-mg9.1.1
registry.astralinux.ru/alse 1.7.3uu1-mg9.1.2
registry.astralinux.ru/alse 1.7.3uu2
registry.astralinux.ru/alse 1.7.3uu2-mg9.2.0
registry.astralinux.ru/alse 1.7.4
registry.astralinux.ru/alse 1.7.4-mg11.2.0
registry.astralinux.ru/alse 1.7.4-mg11.3.0
registry.astralinux.ru/alse 1.7.4uu1
registry.astralinux.ru/alse 1.7.4uu1-mg11.3.0
registry.astralinux.ru/alse latest |
Также репозитории, в которых должен выполняться поиск можно указать в файле /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 <идентификатор_образа> |
Создание собственного контейнера из существующего образа
Создать dockerfile с указанием образа, из которого будет создаваться контейнер (образ registry.astralinux.ru/library/alse:1.7.4) и команд для его создания (команда mkdir /testdir и команда echo test > /testdir/testfile):
Command echo -e "FROM registry.astralinux.ru/library/alse:1.7.4\nRUN mkdir /testdir\nRUN echo test > /testdir/testfile" > Dockerfile Создать контейнер:
Command 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):
Command |
---|
REPO="https://dl.astralinux.ru/astra/stable/1.7_x86-64/repository-main" IMAGE="alse1.7" CODENAME="1.7_x86-64" bash build.sh |
Успешное создание образа завершается сообщением:
Блок кода |
---|
podman image `alse1.7` has been generated |
Создание собственного репозитория образов
Якорь | ||||
---|---|---|---|---|
|
Так как репозитории образов 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/ после установки пакета 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 из базового репозитория:
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/). |
Загрузка образа в репозиторий
Предположим, что:
- ранее установлен пакет docker-registry и, соответственно запущена служба локального репозитория образов;
- служба использует IP-порт 5000;
- для упрощения принимается, что в службе настроен анонимный доступ;
- имеется ранее созданный пользовательский образ localhost/alse1.7.
Для загрузки образа:
Создать новый тег образа, соответствующий имени репозитория, в который будет выполняться загрузка:
Command podman tag alse1.7 localhost:5000/alse1.7 Опционально убедиться, что тег создался:
Command Title 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Загрузить "тегированный" образ в репозиторий:
Command Title 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Опционально убедиться, что образ загружен:
Command Title podman search localhost:5000/alse NAME DESCRIPTION
localhost:5000/alse1.7Образ также будет доступен по внешнему сетевому IP-адресу (в примере ниже - 10.107.0.227):
Command Title podman search 10.107.0.227:5000/alse NAME DESCRIPTION
10.107.0.227:5000/alse1.7
Оркестрация контейнеров (работа с подами)
Создание нового пода
Создание нового пода:
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
Выполнение команд podman от имени других учетных записей
Выполнение команд podman с нулевой меткой безопасности от имени других учетных записей
Для выполнения команд podman от имени других учетных записей можно использовать конструкцию:
Command |
---|
sudo -u <имя_пользователя> -H -i podman <podman-команда> |
Где:
- -u <имя_пользователя> — опция, определяющая от имени какого пользователя (целевого пользователя) будет выполнена команда;
- -H — опция, присваивающая переменной HOME значение домашнего каталоге целевого пользователя;
- -i — опция, обеспечивающая перед выполнением команды переход в домашний каталог целевого пользователя.
Выполнение команд podman с ненулевой меткой безопасности от имени других учетных записей
Для присвоения ненулевой метки безопасности используется команда pdp-exec:
Command |
---|
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' |