Оглавление |
---|
Информация | ||
---|---|---|
| ||
|
Введение
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 или из командной строки командой:
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 <имя_образа> |
Получение списка запущенных и сохраненных контейнеров
Для получения списка запущенных (работающих) контейнеров используется 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 <идентификатор_образа> |
Монтирование директорий в контейнер:
Создадим директорию:
# 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)