Поиск по сайту:

Как управлять контейнерами с помощью Podman и Skopeo в RHEL 8


Одна из проблем, с которыми разработчики сталкивались в прошлом, — обеспечить надежную работу приложений в различных вычислительных средах. Зачастую приложения не работали должным образом или сталкивались с ошибками и вообще выходили из строя. Именно здесь родилась концепция контейнеров.

Что такое образы контейнеров?

Образы контейнера – это статические файлы, поставляемые с исполняемым кодом, который выполняется в изолированной среде. Образ контейнера содержит системные библиотеки, зависимости и другие настройки платформы, необходимые приложению для работы в различных средах.

Red Hat Linux предоставляет набор полезных инструментов для работы с контейнерами, которые можно использовать для прямой работы с контейнерами Linux с помощью необходимых команд Docker. К ним относятся:

  • Podman – это контейнерный движок без демона для запуска и управления контейнерами OCI как в корневом, так и в безрутовом режиме. Podman аналогичен Docker и имеет те же параметры команды, за исключением того, что Docker является демоном. Вы можете извлекать, запускать образы контейнеров и управлять ими с помощью podman почти так же, как и с Docker. Podman обладает множеством расширенных функций, полностью интегрируется с системами и предлагает поддержку пользовательского пространства имен, включая запуск контейнеров без необходимости использования root-пользователя.
  • Skopeo: это инструмент командной строки, используемый для копирования образов контейнеров из одного реестра в другой. Вы можете использовать Skopeo для копирования изображений на определенный хост и с него, а также для копирования изображений в другой реестр контейнеров или среду. Помимо копирования изображений, вы можете использовать его для проверки изображений из различных реестров и использования подписей для создания и проверки изображений.
  • Buildah: это набор инструментов командной строки, используемый для создания и управления образами контейнеров OCI с использованием файлов Docker.

В этой статье мы сосредоточимся на управлении контейнерами с помощью podman и Skopeo.

Поиск образов контейнеров из удаленного реестра

Команда podman search позволяет выполнять поиск образов контейнеров в выбранных удаленных реестрах. Список реестров по умолчанию определен в файле registries.conf, расположенном в каталоге /etc/containers/.

Реестры состоят из 3 разделов.

  • [registries.search] – в этом разделе указаны реестры по умолчанию, в которых podman может искать образы контейнеров. Он ищет запрошенное изображение в реестрах registry.access.redhat.com, registry.redhat.io и docker.io.

  • [registries.insecure] – в этом разделе указаны реестры, которые не реализуют шифрование TLS, т. е. небезопасные реестры. По умолчанию записи не указаны.

  • [registries.block] — блокирует или запрещает доступ к указанным реестрам из вашей локальной системы. По умолчанию записи не указаны.

Как обычный пользователь (не root), выполняющий команду podman, вы можете определить свой собственный файл registries.conf в своем домашнем каталоге ($HOME/.config). /containers/registries.conf), чтобы переопределить общесистемные настройки.

Правила указания реестров

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

  • Каждый реестр должен быть заключен в одинарные кавычки.
  • Реестры могут быть указаны с использованием имени хоста или IP-адреса.
  • Если указано несколько реестров, их следует разделить запятыми.
  • Если в реестре используется нестандартный порт (например, TCP-порты 443 для безопасного и 80 для небезопасного), номер порта должен быть указан рядом с именем реестра, например. registry.example.com:5566.

Чтобы найти в реестре образ контейнера, используя синтаксис:

podman search registry/container_image

Например, чтобы найти образ Redis в реестре registry.redhat.io, вызовите команду:

podman search registry.redhat.io/redis

Для поиска образа контейнера MariaDB запустите.

podman search registry.redhat.io/mariadb

Чтобы получить подробное описание образа контейнера, используйте параметр --no-trunc перед именем образа контейнера в полученных результатах. Например, мы попытаемся получить подробное описание образа контейнера MariaDB, как показано:

podman search --no-trunc registry.redhat.io/rhel8/mariadb-103

Получение образов контейнеров

Извлечение или получение образов контейнеров из удаленного реестра требует, чтобы вы сначала прошли аутентификацию, прежде чем что-либо еще. Например, чтобы получить образ контейнера MariaDB, сначала войдите в реестр Redhat:

podman login

Укажите свое имя пользователя и пароль и нажмите «ENTER» на клавиатуре. Если все пойдет хорошо, вы должны получить сообщение с подтверждением того, что вход в реестр прошел успешно.

Login Succeeded!

Теперь вы можете извлечь изображение, используя показанный синтаксис:

podman pull <registry>[:<port>]/[<namespace>/]<name>:<tag>

<registry> относится к удаленному хосту или реестру, который предоставляет репозиторий образов контейнеров в TCP <port>. <namespace> и <name> вместе определяют образ контейнера на основе <namespace> в реестре. Наконец, параметр <tag> указывает версию образа контейнера. Если ничего не указано, используется тег по умолчанию – последний.

Всегда рекомендуется добавлять доверенные реестры, то есть те, которые обеспечивают шифрование и не позволяют анонимным пользователям создавать учетные записи со случайными именами.

Чтобы получить образ MariaDB, выполните команду:

podman pull registry.redhat.io/rhel8/mariadb-103
  • <registry> – реестр.redhat.io
  • <namespace> – rhel8
  • <имя> – MariaDB
  • <tag> — 103.

Для последующего извлечения образов контейнеров дальнейший вход в систему не требуется, поскольку вы уже прошли аутентификацию. Чтобы получить образ контейнера Redis, просто запустите:

podman pull registry.redhat.io/rhscl/redis-5-rhel7

Перечисление образов контейнеров

Как только вы закончите извлекать изображения, вы сможете просмотреть изображения, существующие в настоящее время на вашем хосте, выполнив команду podman images.

podman images

Проверка образов контейнеров

Прежде чем запускать контейнер, всегда полезно протестировать образ и понять, что он делает. Команда podman Inspect распечатывает море метаданных о контейнере, таких как ОС и архитектура.

Чтобы проверить изображение, запустите команду Podman Inspect, а затем укажите идентификатор изображения или репозиторий.

podman inspect IMAGE ID
OR
podman inspect REPOSITORY

В приведенном ниже примере мы проверяем контейнер MariaDB.

podman inspect registry.redhat.io/rhel8/mariadb-103

Чтобы получить определенные метаданные для контейнера, передайте параметр --format, за которым следуют метаданные и идентификатор контейнера (идентификатор изображения или имя).

В приведенном ниже примере мы получаем информацию об архитектуре и описании базового контейнера RHEL 8, который находится в разделе «Ярлыки».

podman inspect --format=’{{.Labels.architecture}}’ image ID
podman inspect --format=’{{.Labels.description}}’ image ID

Чтобы проверить удаленный образ из другого реестра, используйте команду skopeo Inspect. В приведенном ниже примере мы проверяем образ инициализации RHEL 8, размещенный в Docker.

skopeo inspect docker://registry.redhat.io/rhel8-beta/rhel-init

Маркировка изображений контейнеров

Как вы могли заметить, имена изображений обычно носят общий характер. Например, изображение Redis помечено:

registry.redhat.io/rhscl/redis-5-rhel7

Маркировка изображений дает им более интуитивно понятное имя, позволяющее лучше понять, что они содержат. С помощью команды podman tag вы можете создать тег изображения, который по сути является псевдонимом имени изображения, состоящего из разных частей.

Это:

registry/username/NAME:tag

Например, чтобы изменить общее имя образа Redis с идентификатором 646f2730318c , мы выполним команду:

podman tag 646f2730318c myredis

Чтобы добавить тег, в конце добавьте полное двоеточие, а затем номер тега:

podman tag 646f2730318c myredis:5.0

Без добавления номера тега ему будет просто присвоен атрибут последний.

Запуск образов контейнеров

Чтобы запустить контейнер, используйте команду podman run. Например:

podman run image_id

Чтобы запустить контейнер в фоновом режиме в качестве службы-демона, используйте параметр -d, как показано.

podman run -d image_id

Например, чтобы запустить образ redis с идентификатором 646f2730318c, мы выполним команду:

podman run -d 646f2730318c

Если вы используете контейнер на базе такой операционной системы, как базовый образ RHEL 8, вы можете получить доступ к оболочке с помощью директивы -it. Параметр -i создает интерактивный сеанс, а параметр -t создает сеанс терминала. Опция --name задает имя контейнера mybash, а это идентификатор изображения ecbc6f53bba0 базового образа.

podman run -it --name=mybash ecbc6f53bba0

После этого вы можете запускать любые команды оболочки. В приведенном ниже примере мы проверяем версию ОС образа контейнера.

cat /etc/os-release

Чтобы выйти из контейнера, просто вызовите команду выхода.

exit

После выхода из контейнера он автоматически останавливается. Чтобы снова запустить контейнер, используйте команду podman start с флагом -ai, как показано.

podman start -ai mybash

Опять же, это дает вам доступ к оболочке.

Перечисление запущенных образов контейнеров

Чтобы просмотреть список запущенных в данный момент контейнеров, используйте команду podman ps, как показано.

podman ps

Чтобы просмотреть все контейнеры, включая те, которые вышли после запуска, используйте команду:

podman ps -a

Настройка образов контейнеров для автоматического запуска под службой Systemd

В этом разделе мы сосредоточимся на том, как можно настроить контейнер для запуска непосредственно в системе RHEL в качестве службы systemd.

Сначала получите желаемое изображение. В данном случае мы извлекли образ Redis из Docker Hub:

podman pull docker.io/redis

Если в вашей системе работает SELinux, вам необходимо активировать логическое значение container_manage_cgroup для запуска контейнеров с помощью systemd.

setsebool -p container_manage_cgroup on

После этого запустите образ контейнера в фоновом режиме и назначьте ему желаемое имя образа. В этом примере мы назвали наш образ redis_server и сопоставили порт 6379 из контейнера с нашим хостом RHEL 8.

podman run -d --name redis_server -p 6379:6379 redis

Далее мы собираемся создать файл конфигурации модуля systemd для Redis в каталоге /etc/systemd/system/.

vim /etc/systemd/system/redis-container.service

Вставьте содержимое ниже в файл.

[Unit]
Description=Redis container

[Service]
Restart=always
ExecStart=/usr/bin/podman start -a redis_server
ExecStop=/usr/bin/podman stop -t 2 redis_server

[Install]
WantedBy=local.target

Сохраните и выйдите из файла.

Затем настройте контейнер на автоматический запуск при загрузке.

systemctl enable redis-container.service

Затем запустите контейнер и проверьте его рабочий статус.

systemctl start redis-container.service
systemctl status redis-container.service

Настройка постоянного хранилища для образов контейнеров

При запуске контейнеров разумно настроить постоянное внешнее хранилище на хосте. Это обеспечивает резервную копию на случай, если контейнер выйдет из строя или будет случайно удален.

Чтобы сохранить данные, мы собираемся сопоставить каталог, расположенный на хосте, с каталогом внутри контейнера.

podman run --privileged -it -v /var/lib/containers/backup_storage:/mnt registry.redhat.io/ubi8/ubi /bin/bash

Параметр --privileged передается, когда для SELinux установлено принудительное применение. Параметр -v указывает внешний том, расположенный на хосте. Томом контейнера здесь является каталог /mnt.

Получив доступ к оболочке, мы создадим образец файла testing.txt в каталоге /mnt, как показано.

echo "This tests persistent external storage" > /mnt/testing.txt

Затем мы выйдем из контейнера и проверим, существует ли файл во внешнем хранилище, расположенном на хосте.

exit
cat /var/lib/containers/backup_storage/testing.txt

ВыводПроверяется постоянное внешнее хранилище.

Остановка и удаление контейнеров

Завершив запуск контейнера, вы можете остановить его с помощью команды podman stop, за которой следует container-id, который вы можете получить из podman ps< /стронг> команда.

podman stop container-id

Чтобы удалить контейнеры, которые вам больше не нужны, сначала убедитесь, что вы остановили его, а затем вызовите команду podman rm, за которой следует указать идентификатор или имя контейнера в качестве опции.

podman rm container-id

Чтобы удалить несколько контейнеров одновременно с помощью одной команды, укажите идентификаторы контейнеров, разделенные пробелом.

podman rm container-id-1 container-id-2 container-id-3

Чтобы очистить все ваши контейнеры, выполните команду:

podman rm -a

Удаление изображения

Чтобы удалить образ, сначала убедитесь, что все контейнеры, созданные из образов, остановлены и удалены, как обсуждалось в предыдущем подразделе.

Затем продолжите и запустите команду podman -rmi, за которой следует идентификатор изображения, как показано:

podman -rmi image-id

Заключение

На этом завершается глава об управлении контейнерами и работе с ними в RHEL 8. Мы надеемся, что это руководство дало хорошее представление о контейнерах и о том, как вы можете взаимодействовать и управлять ими в вашей системе RHEL с помощью podman и Skopeo.