Данная статья применима к:
- 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 с подключенным расширенным репозиторием.
Введение
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) — группа контейнеров, выполняющихся совместно и разделяющих общие ресурсы.
Установка
Инструмент podman представлен одноименным пакетом podman. Для установки пакета требуется подключить расширенный репозиторий. После подключения репозитория пакет может быть установлен с помощью Графический менеджер пакетов synaptic или из командной строки командой:
Дополнительно сразу можно установить пакет crun, который может использоваться в качестве альтернативного средства контейнеризации.
Стандартные команды
Стандартный вызов инструмента имеет следующий синтаксис:
- опции — необязательные модификаторы команд;
- podman-команда — действие к исполнению. Команды при этом имеют собственные опции и аргументы.
Стандартные команды podman в основном аналогичны командам docker. Получить список опций и команд с их описанием можно выполнив команду:
Пример вывода команды:
Подробные справки по podman-командам доступны в справочной системе man. Названия страниц справок формируются как podman-<команда>. Например, для команды attach справка может быть получена командой:
Базовый функционал
Загрузка готовых образов
Готовые образы доступны в сети Интернет в репозиториях (registry) образов. Для загрузки образа можно использовать podman-команду pull:
Примеры общедоступных репозиториев образов:
Поиск готовых образов
Для поиска образов в репозиториях используется podman-команда search.
Репозиторий, в котором должен выполняться поиск, может быть указан в аргументе команды как префикс шаблона для поиска. Например, поиск шаблона nginx в репозитории образов docker.io:
unqualified-search-registries = [ 'registry.redhat.io', 'docker.io']
При этом поиск будет выполняться в том порядке, в котором перечислены репозитории.
Список загруженных образов
Список загруженных образов можно получить 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:
Удаление контейнера
Перед удалением контейнер должен быть остановлен.
Команда:
Получение информации о контейнере, журналов контейнера, статистики работы контейнеров
Получение полной информации о контейнере:
Удаление образа
Для удаления образа предварительно необходимо остановить и удалить все созданные из него контейнеры.
Команда:
Монтирование директорий в контейнер:
Создадим директорию:
# mkdir /testshare && touch /testshare/file{0..9}
# podman --runtime /usr/local/sbin/runc run --name mynginx2 --mount type=bind,source=/testshare,target=/mnt -d nginx \\\ для запуска с runc
# podman run --name mynginx2 --mount type=bind,source=/testshare,target=/mnt -d nginx \\\ для запуска с crun
Подключимся к контейнеру и проверим базовые операции:
# podman exec -it mynginx2 bash
root@0801a2718d97:/# ls /mnt
file0 file1 file10 file2 file3 file4 file5 file6 file7 file8 file9
root@0801a2718d97:/# rm /mnt/file{4,6,8}
root@0801a2718d97:/# touch /mnt/test{0..5}
root@0801a2718d97:/# ls /mnt
file0 file1 file10 file2 file3 file5 file7 file9 test0 test1 test2 test3 test4 test5
Создание собственного контейнера:
Создадим Dockerfile:
FROM ubuntu
RUN mkdir /testdir
RUN echo "test" > /testdir/testfile
Запустим сборку:
# podman build -t testbuikd .
STEP 1: FROM nginx
STEP 2: RUN mkdir /testdir
--> Using cache 9ad3677934ae4d1ba71c99b586a84e885c4941a0f47d3dabcac63d9e51c1a598
--> 9ad3677934a
STEP 3: RUN echo "test" > /testdir/testfile
--> Using cache ac3596aed905f61f22a357dd0ea8f5e72e6387ff34225d55f648a9d46928df2e
STEP 4: COMMIT testbuild
--> ac3596aed90
ac3596aed905f61f22a357dd0ea8f5e72e6387ff34225d55f648a9d46928df2e
# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/testbuild latest ac3596aed905 6 minutes ago 146 MB
# podman run -ti testbuild bash
root@3886ae971306:/# cat /testdir/testfile
test
Создание собственного образа:
Изменим скрипт из статьи(принцип работы тот же) - https://wiki.astralinux.ru/pages/viewpage.action?pageId=137563067
Необходимы правки
#!/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)