Prévia do material em texto
<p>Название</p><p>Dolor Set Amet</p><p>LOREM IPSUM</p><p>Глава 1</p><p>PODMAN</p><p>Podman является альтернативой проекту Docker</p><p>и позволяет управлять контейнерами без</p><p>наличия фонового системного сервиса и не</p><p>требуя root-прав.</p><p>Контейнеры</p><p>Контейнеры Linux стали ключевой</p><p>технологией упаковки и доставки</p><p>приложений с открытым исходным кодом,</p><p>сочетающей легкую изоляцию приложений</p><p>с гибкостью методов развертывания на</p><p>основе образов.</p><p>LXC (англ. Linux Containers) — система виртуализации на уровне</p><p>операционной системы для запуска нескольких изолированных</p><p>экземпляров операционной системы Linux на одном узле. LXC не</p><p>использует виртуальные машины, а создаёт виртуальное окружение</p><p>с собственным пространством процессов и сетевым стеком.</p><p>СОДЕРЖАНИЕ</p><p>1. Контейнеры</p><p>2. Типы образов</p><p>3. Работа с образами контейнеров</p><p>4. Работа с контейнерами</p><p>5. Работа с модулями</p><p>6. Добавление ПО в работающий</p><p>контейнер</p><p>7. Scopeo, Buildah</p><p>8. Запуск специальных образов</p><p>2</p><p>RHEL реализует контейнеры Linux с использованием основных</p><p>технологий, таких как:</p><p>• Контрольные группы (cgroups) для управления ресурсами</p><p>• Пространства имен для изоляции процесса</p><p>• SELinux для безопасности</p><p>• Безопасное «мультипользование» (multi-tenancy)</p><p>Эти технологии снижают вероятность взлома системы</p><p>безопасности и предоставляют среду для создания и запуска</p><p>контейнеров корпоративного уровня.</p><p>Red Hat OpenShift предоставляет мощные инструменты командной</p><p>строки и веб-интерфейса для создания, управления и запуска</p><p>контейнеров в модулях, называемых модулями.</p><p>3</p><p>Red Hat позволяет создавать и управлять отдельными</p><p>контейнерами и образами контейнеров вне OpenShift.</p><p>Red Hat предоставляет набор инструментов командной строки,</p><p>которые могут работать без контейнерного движка. Это:</p><p>• podman - для непосредственного управления подами и</p><p>образами контейнера (run,stop,start,ps,attach,exec, и так далее)</p><p>• buildah - для создания, отправки и подписания образов</p><p>контейнеров</p><p>• skopeo - для копирования, просмотра, удаления и подписи</p><p>образов</p><p>• runc - для предоставления функций запуска и сборки</p><p>контейнера для podman и buildah</p><p>4</p><p>• crun - необязательная среда выполнения, которая может быть</p><p>настроена и обеспечивает большую гибкость, контроль и</p><p>безопасность для контейнеров без супер-пользователя root.</p><p>Поскольку эти инструменты совместимы с Open Container Initiative</p><p>(OCI), их можно использовать для управления теми же</p><p>контейнерами Linux, которые создаются и управляются Docker и</p><p>другими OCI-совместимыми движками контейнеров . Однако они</p><p>особенно подходят для запуска непосредственно в Red Hat</p><p>Enterprise Linux в</p><p>случаях использования</p><p>с одним узлом.</p><p>5</p><p>Open Container Initiative - это проект Linux Foundation, начатый Docker в июне</p><p>2015 года с целью разработки открытых стандартов для виртуализации на</p><p>уровне операционной системы, в первую очередь контейнеров Linux.</p><p>Запуск контейнеров без Docker</p><p>Red Hat удалила движок контейнера Docker и команду docker из</p><p>RHEL 8.</p><p>Инструменты Podman, Skopeo и Buildah</p><p>были разработаны для замены командных функций Docker. Каждый</p><p>инструмент в этом сценарии более легкий и ориентирован на</p><p>подмножество функций.</p><p>Основные преимущества инструментов Podman, Skopeo и Buildah:</p><p>• Работа в режиме без root - контейнеры без root намного</p><p>безопаснее, поскольку работают без каких-либо дополнительных</p><p>привилегий.</p><p>• Не требуется демон - у этих инструментов гораздо меньше</p><p>требований к ресурсам в режиме ожидания, поскольку, когда вы не 6</p><p>ПРИМЕЧАНИЕ</p><p>Docker не поддерживается в RHEL 8.</p><p>запускаете контейнеры, Podman не работает, а демон всегда</p><p>работает.</p><p>• Встроенная интеграция с systemd - Podman позволяет</p><p>создавать файлы модулей systemd и запускать контейнеры как</p><p>системные службы.</p><p>Если вы по-прежнему хотите использовать</p><p>Docker в RHEL, вы можете получить Docker</p><p>из разных исходных проектов, но он не</p><p>поддерживается в RHEL 8.</p><p>Поскольку в Podman реализовано так много</p><p>функций командной строки Docker, вы</p><p>можете настроить псевдоним (alias), чтобы</p><p>использовать docker но работать с podman.</p><p>7</p><p>podman-docker Этот псевдоним устанавливается</p><p>при установке пакета. В результате каждый раз, когда вы</p><p>запускаете docker команду, она фактически запускает podman</p><p>команду.</p><p>Podman также поддерживает Docker Socket API, поэтому</p><p>пакет podman-docker также устанавливает связь между /var/run/</p><p>docker.sock и /var/run/podman/podman.sock.</p><p>В результате, вы можете продолжать запускать команды API</p><p>Docker с docker-py (A Python library for the Docker Engine API) и docker-</p><p>compose инструментов , не требуя</p><p>Docker-демона. Podman обслужит</p><p>запросы.</p><p>8</p><p>Выбор архитектуры RHEL для контейнеров</p><p>Red Hat предоставляет образы контейнеров и связанное с ними</p><p>программное обеспечение для следующих компьютерных</p><p>архитектур:</p><p>• AMD64 и Intel 64 (нет поддержки 32-разрядных архитектур)</p><p>• PowerPC 8 и 9 64-бит</p><p>• 64-битный IBM Z</p><p>• ARM 64-бит</p><p>Установка контейнерных инструментов</p><p>Эта процедура показывает, как вы можете установить</p><p>модуль container-tools, который содержит инструменты Podman,</p><p>Buildah, Skopeo и runc.</p><p>9</p><p>Процедура</p><p>1. Установите модуль container-tools:</p><p># yum module install -y container-tools</p><p>Установите пакет podman-docker:</p><p># yum install -y podman-docker</p><p>Настройка rootless контейнеров</p><p>Запуск контейнерных инструментов, таких как Podman, Skopeo или Buildah,</p><p>от имени пользователя с привилегиями суперпользователя (пользователь</p><p>root) - лучший способ гарантировать, что ваши контейнеры имеют полный</p><p>доступ ко всем функциям, доступным в вашей системе.</p><p>10</p><p>Однако с помощью функции под названием «Rootless Containers»,</p><p>обычно доступной в RHEL 8.1, вы можете работать с контейнерами</p><p>как обычный пользователь.</p><p>Хотя контейнерные движки, такие как Docker, позволяют запускать</p><p>команды Docker от имени обычного (не root) пользователя, демон</p><p>Docker, выполняющий эти запросы, запускается от имени</p><p>пользователя root. В результате обычные пользователи могут</p><p>отправлять запросы через свои контейнеры, которые могут нанести</p><p>вред системе. Настраивая пользователей контейнера без root,</p><p>системные администраторы предотвращают потенциально опасные</p><p>действия контейнера со стороны обычных пользователей, при этом</p><p>позволяя этим пользователям безопасно запускать большинство</p><p>функций контейнера под своими учетными записями.</p><p>11</p><p>Далее рассмотрим, как настроить вашу систему для использования</p><p>инструментов Podman, Skopeo и Buildah для работы с контейнерами</p><p>в качестве пользователя без полномочий root (rootless).</p><p>Переключимся на обычного пользователя и запустим:</p><p>podman pull registry.access.redhat.com/ubi8/ubi</p><p>Проверим скачанные образы podman images:</p><p>12</p><p>Запустите контейнер с именем myubi и отобразите версию ОС:</p><p>podman run --name=myubi registry.access.redhat.com/ubi8/ubi cat /etc/os-release</p><p>13</p><p>Особые рекомендации rootless контейнеров</p><p>При запуске контейнеров от имени обычного пользователя</p><p>необходимо учитывать несколько факторов:</p><p>• Путь к хранилищу хост-контейнера различается для</p><p>пользователей root ( /var/lib/containers/storage) и пользователей</p><p>без полномочий root ( $HOME/.local/share/containers/storage).</p><p>14</p><p>• Пользователям, использующим контейнеры без root-доступа,</p><p>дается специальное разрешение на запуск в качестве диапазона</p><p>идентификаторов пользователей и групп в хост-системе. Однако у</p><p>них нет привилегий root для операционной системы на хосте.</p><p>• Если вам нужно настроить среду контейнера без root, создайте</p><p>файлы конфигурации в своем домашнем каталоге ( $HOME/.config/</p><p>containers). Файлы конфигурации включают storage.conf(для</p><p>настройки хранилища) и containers.conf(для различных настроек</p><p>контейнера). Вы также можете создать файл registries.conf для</p><p>идентификации реестров контейнеров, доступных при</p><p>использовании Podman для извлечения, поиска или запуска</p><p>изображений.</p><p>15</p><p>• Есть некоторые системные функции, которые нельзя изменить</p><p>без привилегий root. Например, вы не можете изменить системные</p><p>часы, установив SYS_TIME внутри контейнера и запустив службу</p><p>сетевого времени (ntpd). Вы должны</p><p>запустить этот контейнер от</p><p>имени пользователя root, минуя среду контейнера без root и</p><p>используя среду пользователя root. Например:</p><p>$ sudo podman run -d --cap-add SYS_TIME ntpd</p><p>Обратите внимание, что этот пример позволяет ntpd настроить</p><p>время для всей системы, а не только внутри контейнера.</p><p>• Контейнер без root не может получить доступ к порту с</p><p>номером меньше 1024. Внутри пространства имен контейнера без root он</p><p>может, например, запустить службу, которая предоставляет порт 80 из службы httpd</p><p>из контейнера, но недоступна за пределами пространства имен:</p><p>$ podman run -d httpd</p><p>16</p><p>Однако контейнеру потребуются привилегии root, используя среду</p><p>контейнера корневого пользователя, чтобы предоставить этот порт</p><p>хост-системе:</p><p>$ sudo podman run -d -p 80:80 httpd</p><p>• Администратор рабочей станции может разрешить</p><p>пользователям предоставлять услуги на портах с номерами ниже</p><p>1024, но они должны понимать последствия для безопасности.</p><p>Обычный пользователь может, например, запустить веб-сервер на официальном</p><p>порту 80 и убедить внешних пользователей, что он настроен администратором. Это</p><p>приемлемо на рабочей станции для тестирования, но может быть не очень хорошей</p><p>идеей для сервера разработки, доступного по сети, и определенно не должно</p><p>выполняться на производственных серверах. Чтобы разрешить</p><p>пользователям подключаться к портам до 80, выполните следующую</p><p>команду:</p><p># echo 80 > /proc/sys/net/ipv4/ip_unprivileged_port_start 17</p><p>Типы образов контейнеров</p><p>Образ контейнера (container image) - это двоичный файл, который</p><p>включает в себя все требования для работы одного контейнера и</p><p>метаданные, описывающие его потребности и возможности.</p><p>Есть два типа образов контейнеров:</p><p>• Базовые образы Red Hat Enterprise Linux (RHEL base images)</p><p>• Универсальные базовые образы Red Hat (UBI images)</p><p>Оба типа образов контейнеров созданы на основе компонентов Red</p><p>Hat Enterprise Linux.</p><p>Используя эти контейнеры, пользователи могут получить большую</p><p>надежность, безопасность, производительность и жизненный цикл.</p><p>18</p><p>Основное различие между двумя типами образов контейнеров</p><p>заключается в том, что образы UBI позволяют обмениваться</p><p>образами контейнеров с другими.</p><p>Вы можете создать контейнерное приложение с помощью UBI,</p><p>отправить его на выбранный вами сервер реестра, легко</p><p>поделиться им с другими и даже развернуть его на платформах,</p><p>отличных от Red Hat.</p><p>Образы UBI призваны стать основой для сценариев использования</p><p>облачных и веб-приложений, разработанных в контейнерах.</p><p>19</p><p>Общие характеристики образов контейнеров RHEL</p><p>Следующие характеристики применимы как к базовым</p><p>изображениям RHEL, так и к изображениям UBI.</p><p>Как правило, образы контейнеров RHEL:</p><p>• Поддерживаются: поддерживается Red Hat для</p><p>использования с контейнерными приложениями. Они содержат те</p><p>же защищенные, протестированные и сертифицированные</p><p>программные пакеты, что и в Red Hat Enterprise Linux.</p><p>• Каталогизированы: внесен в каталог контейнеров Red Hat с</p><p>описаниями, техническими данными и индексом</p><p>работоспособности для каждого образа.</p><p>• Обновлены: предлагается с четко определенным графиком</p><p>обновлений. 20</p><p>• Отслеживаются: отслеживается с помощью исправлений</p><p>продукта Red Hat, чтобы помочь понять изменения, добавляемые в</p><p>каждое обновление.</p><p>• Возможность повторного использования: образы</p><p>контейнеров необходимо загрузить и кэшировать в</p><p>производственной среде один раз. Каждый образ контейнера</p><p>может быть повторно использован всеми контейнерами, которые</p><p>включают его в качестве своей основы.</p><p>Характеристики UBI образов</p><p>UBI-образы позволяют обмениваться образами контейнеров с</p><p>другими. Предлагаются четыре образа UBI: micro, minimal, standard,</p><p>и init. Для сборки ваших приложений доступны образы среды</p><p>выполнения перед сборкой и репозитории YUM.</p><p>21</p><p>К UBI образам относятся следующие характеристики:</p><p>• Создано из содержимого RHEL: образы Red Hat Universal</p><p>Base создаются из подмножества обычного содержимого Red Hat</p><p>Enterprise Linux.</p><p>• Распространяемый (Redistributable): образы UBI позволяют</p><p>стандартизировать Red Hat для клиентов, партнеров, независимых</p><p>поставщиков программного обеспечения и других. С помощью</p><p>образов UBI вы можете создавать свои образы контейнеров на</p><p>основе официального программного обеспечения Red Hat, которое</p><p>можно бесплатно распространять и развертывать.</p><p>• Предоставляет набор из четырех базовых образов: micro,</p><p>minimal, standard, и init.</p><p>22</p><p>• Предоставляет набор предварительно созданных образов</p><p>контейнеров: образы среды выполнения, основанные на потоках</p><p>приложений, обеспечивают основу для приложений, которые могут</p><p>извлечь выгоду из стандартных поддерживаемых сред выполнения,</p><p>таких как python, perl, php, dotnet, nodejs и ruby.</p><p>• Предоставляет набор связанных репозиториев YUM:</p><p>репозитории YUM включают пакеты RPM и обновления, которые</p><p>позволяют добавлять зависимости приложений и перестраивать</p><p>образы контейнеров UBI.</p><p>◦ Репозиторий ubi-8-baseos содержит распространяемое</p><p>подмножество пакетов RHEL, которые вы можете включить в свой</p><p>контейнер.</p><p>23</p><p>◦ Репозиторий ubi-8-appstream содержит пакеты потоков</p><p>приложений, которые вы можете добавить в образ UBI, чтобы</p><p>помочь вам стандартизировать среды, которые вы используете с</p><p>приложениями, требующими определенного времени выполнения.</p><p>◦ Добавление RPM UBI: вы можете добавлять пакеты RPM в</p><p>образы UBI из предварительно настроенных репозиториев UBI.</p><p>• Лицензирование: вы можете свободно использовать и</p><p>распространять образы UBI при условии соблюдения</p><p>Лицензионного соглашения с конечным пользователем</p><p>универсального базового образа Red Hat (https://www.redhat.com/licenses/</p><p>EULA_Red_Hat_Universal_Base_Image_English_20190422.pdf).</p><p>24</p><p>Работа с образами контейнеров</p><p>Далее мы рассмотрим как получить образ, проверить, пометить,</p><p>сохранить, загрузить, распространить, определить подпись образа.</p><p>Настройка реестров контейнеров</p><p>Используя команду podman search, вы можете искать образы в</p><p>выбранных реестрах контейнеров. Вы также можете искать</p><p>изображения в реестре контейнеров Red Hat.</p><p>Реестр контейнеров Red Hat включает описание образа, его</p><p>содержимое, индекс работоспособности и другую информацию.</p><p>25</p><p>Вы можете найти список реестров в файле конфигурации registries.conf. Как</p><p>пользователь root отредактируйте файл /etc/containers/registries.conf, чтобы</p><p>изменить настройки поиска по умолчанию для всей системы.</p><p>Как пользователь создайте файл $HOME/.config/containers/registries.conf, чтобы</p><p>переопределить общесистемные настройки.</p><p>mkdir .config/containers</p><p>vim .config/containers/registries.conf</p><p>[registries.search]</p><p>registries = ['registry.access.redhat.com', 'registry.redhat.io', 'docker.io']</p><p>[registries.insecure]</p><p>registries = []</p><p>[registries.block]</p><p>registries = []</p><p>26</p><p>• По умолчанию команда podman search ищет образы</p><p>контейнеров в реестрах, перечисленных в</p><p>разделе [registries.search], в указанном порядке. Команда ищет</p><p>требуемый файл в registry.access.redhat.com, registry.redhat.io</p><p>и docker.io.</p><p>• В разделе [registries.insecure] определены реестры, которые</p><p>не используют шифрование TLS для связи с реестром, что делает</p><p>их небезопасными.</p><p>• Раздел [registries.block] определяет реестры, доступ к</p><p>которым локальной системе запрещен.</p><p>27</p><p>Убедитесь, что вы соблюдаете условия при настройке реестров</p><p>контейнеров:</p><p>Каждый реестр должен быть заключен в одинарные кавычки.</p><p>Если для ключа registries = задано несколько реестров, вы должны</p><p>разделить эти реестры запятыми.</p><p>Вы можете идентифицировать реестры по IP-адресу или имени</p><p>хоста.</p><p>Если реестр использует нестандартный порт, отличный от TCP-</p><p>портов 443 для зашифрованных и 80 для незашифрованных</p><p>соединений, введите номер этого порта с именем реестра.</p><p>Например: host.example.com:9999.</p><p>Система выполняет поиск реестров в том порядке, в котором они</p><p>отображаются в списке. 28</p><p>Чтобы получить доступ к незащищенным реестрам, добавьте</p><p>полное имя (FQDN) реестра в раздел [registries.insecure] файла /etc/</p><p>containers/registries.conf. Например:</p><p>[registries.insecure]</p><p>registries = ['insecure-registry.example.com']</p><p>Поиск образов контейнеров</p><p>Ниже объясняется, как искать образы postresql-10 в реестре</p><p>quay.io.</p><p>Процедура</p><p>1. Авторизуйтесь в реестре:</p><p># podman login quay.io</p><p>29</p><p>2. Найдите образ:</p><p>• Чтобы найти определенный образ в определенном реестре,</p><p>введите:</p><p>podman search quay.io/postgresql-10</p><p>Для поиска образа во всех реестрах введите:</p><p>30</p><p>Чтобы отобразить полные описания, передайте команде параметр --</p><p>no-trunc.</p><p>Получение образов из реестров</p><p>Чтобы получить образы контейнеров из удаленного реестра, такого</p><p>как собственный реестр контейнеров Red Hat, и добавить их в</p><p>локальную систему, используйте команду podman pull:</p><p>#podman pull <registry>[:<port>]/[<namespace>/]<name>:<tag></p><p>Например, registry.redhat.io/ubi8/ubi идентифицируется так:</p><p>Сервер реестра (registry.redhat.io)</p><p>Пространство имен (ubi8)</p><p>Имя образа (ubi)</p><p>Если существует несколько версий одного и того же образа, добавьте тег, чтобы явно указать имя образа.</p><p>По умолчанию podman использует :latest, например ubi8/ubi:latest. 31</p><p>Пример:</p><p>1. Авторизуемся в реестре</p><p>podman login registry.redhat.io</p><p>2. Вытащим образ registry.redhat.io/ubi8/ubi</p><p>3. Чтобы просмотреть список всех образов, загруженных в вашу</p><p>локальную систему используем команду: podman images</p><p>32</p><p>Red Hat предоставляет следующие реестры:</p><p>• registry.redhat.io (требуется аутентификация)</p><p>• registry.access.redhat.com (не требует аутентификации)</p><p>• registry.connect.redhat.com (содержит образы программы Red Hat Partner Connect)</p><p>Проверка локальных образов</p><p>После того как вы перенесете образ в локальную систему и</p><p>запустите его, вы можете использовать команду podman inspect</p><p>для изучения образа. Например, используйте его, чтобы понять, что</p><p>делает образ, и проверить, какое программное обеспечение</p><p>находится внутри образа. Команда podman inspect отображает</p><p>информацию о контейнерах и образах, идентифицированных по</p><p>имени или идентификатору.</p><p>33</p><p>пример:</p><p>Проверим образ registry.redhat.io/ubi8/ubi:</p><p>podman inspect registry.redhat.io/ubi8/ubi</p><p>Проверка удаленных образов</p><p>Используйте команду skopeo inspect для отображения информации</p><p>об образе из реестра удаленных контейнеров, прежде чем</p><p>переносить образ в свою систему.</p><p>34</p><p>пример:</p><p>Предварительно проверим образ registry.redhat.io/ubi8/ubi-init</p><p>skopeo inspect docker://registry.redhat.io/ubi8/ubi-init</p><p>35</p><p>Добавление тегов к образам</p><p>Используйте команду podman tag, чтобы добавить дополнительное</p><p>имя к локальному образу. Это дополнительное имя может состоять</p><p>из нескольких частей: registryhost/username/NAME:tag</p><p>Пример:</p><p>Получим список образов podman images</p><p>Присвойте имя myubi образу registry.redhat.io/ubi8/ubi</p><p>По имени: podman tag registry.redhat.io/ubi8/ubi myubi</p><p>или по IMAGE ID: podman tag ad42391b9b46 myubi</p><p>36</p><p>Проверим снова образы:</p><p>Обратите внимание, что тег по умолчанию является latest для обоих образов. Всем</p><p>образам присвоен один идентификатор ad42391b9b46.</p><p>Добавим тег 8.4 в registry.redhat.io/ubi8/ubi</p><p>Это можно сделать двумя способами, либо по имени, либо по ID</p><p>$ podman tag registry.redhat.io/ubi8/ubi myubi:8.4</p><p>$ podman tag ad42391b9b46 myubi:8.4</p><p>37</p><p>Сохранение и загрузка образов</p><p>Используйте команду podman save, чтобы сохранить образ в архив</p><p>контейнера. Вы можете восстановить его позже в другой</p><p>контейнерной среде или отправить кому-то другому. Вы можете</p><p>использовать опцию --format, чтобы указать формат архива.</p><p>Поддерживаемые форматы::</p><p>• docker-archive</p><p>• oci-archive</p><p>• oci-dir (каталог с типом манифеста oci)</p><p>• docker-dir (каталог с типом манифеста v2s2)</p><p>Формат по умолчанию-docker-dir.</p><p>38</p><p>Используйте команду podman load, чтобы загрузить образ из архива</p><p>образов контейнера в хранилище контейнера.</p><p>Пример:</p><p>Сохраним образ registry.redhat.io/rhel8/rsyslog как tarball</p><p>podman pull registry.redhat.io/rhel8/rsyslog:latest</p><p>podman save -o myrsyslog.tar registry.redhat.io/rhel8/rsyslog:latest</p><p>В формате docker-dir по умолчанию:</p><p>podman save -o myrsyslog.tar registry.redhat.io/rhel8/rsyslog:latest</p><p>Проверим архив:</p><p>file myrsyslog.tar</p><p>Убедились что на выходе получили tar-архив.</p><p>39</p><p>Теперь, чтобы загрузить образ registry.redhat.io/rhel8/rsyslog:latest из</p><p>архива myrsyslog.tar, нам нужно использовать команду:</p><p>$ podman load -i myrsyslog.tar</p><p>Loaded image(s): registry.redhat.io/rhel8/rsyslog:latest</p><p>Распространение UBI образов</p><p>Используйте команду podman push, чтобы отправить UBI образ в свой или сторонний</p><p>реестр и поделиться им с другими.</p><p>пример:</p><p>добавьте к образу ubi дополнительное имя :</p><p># podman tag registry.redhat.io/ubi8/ubi registry.example.com:5000/ubi8/ubi</p><p>Отправьте образ registry.example.com:5000/ubi8/ubi из локального хранилища в</p><p>реестр:</p><p># podman push registry.example.com:5000/ubi8/ubi 40</p><p>Определение политики проверки подписи образа</p><p>Red Hat предоставляет подписи для образов в реестре контейнеров</p><p>Red Hat. YAML-файлы в каталоге /etc/containers/registries.d/ и</p><p>файл /etc/containers/policy.json определяют политику проверки</p><p>подписи при запуске от имени пользователя root.</p><p>Политика доверия в файле /etc/containers/policy.json описывает</p><p>область реестра (реестр и/или хранилище) для доверия.</p><p>По умолчанию средство контейнера считывает политику из файла</p><p>$HOME/.config/containers/policy.json, если он существует. В</p><p>противном случае средство контейнера считывает политику из</p><p>файла /etc/containers/policy.json.</p><p>41</p><p>Доверие определяется с помощью трех параметров:</p><p>• Имя реестра или реестра/репозитория</p><p>• Один или несколько открытых ключей GPG</p><p>• Сервер подписи</p><p>Посмотрим файл /etc/containers/policy.json</p><p>42</p><p>Red Hat распространяет подписи из этих URI:</p><p>https://access.redhat.com/webassets/docker/content/sigstore</p><p>https://registry.redhat.io/containers/sigstore</p><p>https://access.redhat.com/webassets/docker/content/sigstore</p><p>https://access.redhat.com/webassets/docker/content/sigstore</p><p>https://registry.redhat.io/containers/sigstore</p><p>https://registry.redhat.io/containers/sigstore</p><p>Чтобы обновить существующую область доверия для реестров</p><p>registry.access.redhat.com и registry.redhat.io, введите под рутом:</p><p>podman image trust set -f /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release registry.access.redhat.com</p><p>podman image trust set -f /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release registry.redhat.io</p><p>Чтобы снова проверить</p><p>конфигурацию политики</p><p>доверия, откройте файл</p><p>/etc/containers/policy.json</p><p>Добавлены разделы</p><p>«registry.access.redhat.com»</p><p>и «registry.redhat.io».</p><p>43</p><p>Создайте файл /etc/containers/registries.d/registry.access.redhat.com.yaml</p><p>со следующим содержимым, чтобы определить хранилище сигнатур</p><p>для образов контейнеров из реестра registry.access.redhat.com:</p><p>vim /etc/containers/registries.d/registry.access.redhat.com.yaml</p><p>docker:</p><p>registry.access.redhat.com:</p><p>sigstore: https://access.redhat.com/webassets/docker/content/sigstore</p><p>vim /etc/containers/registries.d/registry.redhat.io.yaml</p><p>docker:</p><p>registry.redhat.io:</p><p>sigstore: https://registry.redhat.io/containers/sigstore</p><p>44</p><p>Чтобы отобразить trust-конфигурацию («доверия»), введите:</p><p>podman image trust show</p><p>Чтобы отклонить политику доверия по умолчанию, введите:</p><p># podman image trust set -t reject default</p><p>Вы можете посмотреть что в файле /etc/containers/policy.json, раздел</p><p>«default» изменится с «insecureAcceptAnything» на «reject».</p><p>Удаление образов</p><p>Используйте команду podman rmi, чтобы удалить локально</p><p>сохраненные образы контейнеров. Вы можете удалить образ по его</p><p>идентификатору или имени.</p><p>45</p><p>пример:</p><p>Вывести все образы в вашей локальной системе:</p><p>$ podman images</p><p>Список всех контейнеров:</p><p>$ podman ps -a</p><p>Чтобы удалить образ registry.redhat.io/rhel8/rsyslog, вы должны</p><p>остановить все контейнеры, запущенные из этого образа, с</p><p>помощью команды podman stop. Вы можете остановить контейнер</p><p>по его идентификатору или имени.</p><p>Остановите контейнер mysyslog: $ podman stop mysyslog</p><p>Удалите образ registry.redhat.io/rhel8/rsyslog:</p><p>$ podman rmi registry.redhat.io/rhel8/rsyslog 46</p><p>Чтобы удалить несколько образов,</p><p>укажите образы через пробел:</p><p>$ podman rmi registry.redhat.io/rhel8/rsyslog registry.redhat.io/ubi8/ubi</p><p>Чтобы удалить все образы из вашей системы:</p><p>$ podman rmi -a</p><p>Чтобы удалить образы, с которыми связано несколько имен (тегов),</p><p>добавьте параметр -f для их удаления:</p><p>$ podman rmi -f ad42391b9b46</p><p>Работа с контейнерами</p><p>Контейнеры представляют собой запущенный или остановленный</p><p>процесс, созданный из файлов, расположенных в распакованном</p><p>образе контейнера. Вы можете использовать инструмент Podman</p><p>для работы с контейнерами.</p><p>47</p><p>Команда podman run запускает процесс в новом контейнере на</p><p>основе образа контейнера. Если образ контейнера еще не</p><p>загружен, то podman run извлекает образ и все зависимости от</p><p>образа из репозитория таким же образом, как и при запуске</p><p>podman pull image, прежде чем запускать контейнер из этого</p><p>образа. Процесс-контейнер имеет собственную файловую систему,</p><p>собственную сеть и собственное изолированное дерево процессов.</p><p>Команда podman run имеет синтаксис:</p><p>podman run [options] image [command [arg ...]]</p><p>Основные опции команды:</p><p>--detach (-d): запускает контейнер в фоновом режиме и печатает</p><p>новый идентификатор контейнера.</p><p>48</p><p>--attach (-a): запускает контейнер в режиме foreground (на переднем плане).</p><p>--name (-n): присваивает имя контейнеру. Если имя не присвоено</p><p>контейнеру с помощью --name, то он генерирует случайное</p><p>строковое имя.</p><p>--rm: автоматически удалять контейнер при выходе. Обратите</p><p>внимание, что контейнер не будет удален, если он не может быть</p><p>успешно создан или запущен.</p><p>--tty (-t): выделяет и присоединяет псевдотерминал к стандартному</p><p>вводу контейнера.</p><p>--interactive (-i): для интерактивных</p><p>процессов используйте -i и -t вместе,</p><p>чтобы выделить терминал для процесса</p><p>контейнера. 49</p><p>Ключи -i -t</p><p>часто пишут</p><p>как -it.</p><p>Запуск команд в контейнере с хоста</p><p>$ podman run --rm registry.access.redhat.com/ubi8/ubi cat /etc/os-release</p><p>NAME="Red Hat Enterprise Linux"</p><p>VERSION="8.2 (Ootpa)"</p><p>Из-за опции --rm вы не должны видеть никакого контейнера в</p><p>выводе $ podman ps</p><p>Выполнение команд внутри контейнера</p><p>$ podman run --name=myubi -it registry.access.redhat.com/ubi8/ubi /bin/bash</p><p>Опция -i создает интерактивный сеанс. Без параметра -t оболочка</p><p>остается открытой, но вы не можете ничего вводить в оболочку.</p><p>Опция -t открывает сеанс терминала. Без опции -i</p><p>оболочка открывается, а затем завершается.</p><p>50</p><p>Введите exit, чтобы</p><p>выйти из контейнера и</p><p>вернуться к хосту</p><p>Используйте команду podman ps, чтобы вывести список запущенных</p><p>контейнеров в системе.</p><p>Чтобы перечислить все контейнеры, запущенные или</p><p>остановленные: $ podman ps -a</p><p>Если вы запустите контейнер, а затем остановите его, но не удалите,</p><p>контейнер будет сохранен в вашей локальной системе и будет готов</p><p>к повторному запуску. Вы можете использовать команду podman</p><p>start для повторного запуска контейнеров. Вы можете указать</p><p>контейнеры по их идентификатору контейнера или имени.</p><p>Запуск контейнера в неинтерактивном режиме:</p><p>$ podman start myubi</p><p>В качестве альтернативы вы можете использовать podman start 1984555a2c27.</p><p>51</p><p>В интерактивном режиме используйте параметры -a( --attach) и -t( --</p><p>interactive) для работы с оболочкой контейнера bash:</p><p>$ podman start -a -i myubi</p><p>В качестве альтернативы вы можете использовать podman start -a -i</p><p>1984555a2c27.</p><p>Чтобы вернуться в хосту выйдя из контейнера, нажмите exit.</p><p>Используйте команду podman inspect для проверки метаданных</p><p>существующего контейнера в формате JSON. Вы можете указать</p><p>контейнеры по их идентификатору контейнера или имени.</p><p>Чтобы получить все метаданные: $ podman inspect 64ad95327c74</p><p>Чтобы получить определенные элементы из файла JSON, например</p><p>отметку времени StartedAt:</p><p>$ podman inspect --format = '{{. State.StartedAt}}' 64ad95327c74</p><p>52</p><p>Примеры других элементов:</p><p>.Path чтобы увидеть, как команда запускается с контейнером</p><p>.Args аргументы команды</p><p>.Config.ExposedPorts Порты TCP или UDP, открытые из контейнера</p><p>.State.Pid чтобы увидеть идентификатор процесса контейнера</p><p>.HostConfig.PortBindings сопоставление портов от контейнера к</p><p>хосту</p><p>53</p><p>Подключение каталога на локальном хосте к контейнеру</p><p>Пример ниже показывает, как вы можете сделать сообщения</p><p>журнала из контейнера доступными для хост-системы, подключив</p><p>устройство хоста /dev/log внутрь контейнера.</p><p>Запустите контейнер с именем log_test и смонтируйте устройство</p><p>хоста /dev/log внутрь контейнера:</p><p># podman run --name="log_test" -v /dev/log:/dev/log --rm</p><p>registry.redhat.io/ubi8/ubi logger "Testing logging to the host"</p><p>Используйте утилиту journalctl для отображения журналов:</p><p>54</p><p>Монтирование файловой системы контейнера</p><p>Используйте команду podman mount, чтобы смонтировать</p><p>корневую файловую систему рабочего контейнера в месте,</p><p>доступном с хоста.</p><p>Запустите контейнер с именем mysyslog:</p><p>podman run -d --name=mysyslog registry.redhat.io/rhel8/rsyslog</p><p>Смонтируйте контейнер mysyslog: podman mount mysyslog</p><p>55</p><p>Смотрим содержимое точки монтирования с помощью команды ls:</p><p>ls /var/lib/containers/storage/overlay/c733a941b5497bf600f53a7a1c0dbcf85e69faeb49943fcafa35a6ec6ee8c312/merged</p><p>Показать версию ОС:</p><p>cat /var/lib/containers/storage/overlay/</p><p>c733a941b5497bf600f53a7a1c0dbcf85e69faeb49943fcafa35a6ec6ee8c</p><p>312/merged/etc/os-release</p><p>56</p><p>Запуск сервиса как демона со статическим IP-адресом</p><p>В следующем примере сервис rsyslog запускается как процесс-</p><p>демон в фоновом режиме. Параметр --ip устанавливает для сетевого</p><p>интерфейса контейнера определенный IP-адрес (например, 10.88.0.44). После этого</p><p>вы можете запустить команду podman inspect, чтобы убедиться, что вы правильно</p><p>установили IP-адрес.</p><p>Установите сетевой интерфейс контейнера на IP-адрес 10.88.0.44:</p><p>podman run -d --ip=10.88.0.44 registry.redhat.io/rhel7/rsyslog</p><p>57</p><p>Выполнение команд внутри запущенного контейнера</p><p>Используйте команду podman exec, чтобы выполнить команду в</p><p>запущенном контейнере и исследовать этот контейнер. Причина</p><p>использования команды podman exec вместо команды podman run</p><p>заключается в том, что вы можете исследовать запущенный</p><p>контейнер, не прерывая работу контейнера.</p><p>пример: Выполните команду rpm -qa внутри контейнера myrsyslog,</p><p>чтобы вывести список всех установленных пакетов:</p><p>58</p><p>пример: Выполните команду /bin/bash в контейнере myrsyslog:</p><p>Выходим из</p><p>контейнера</p><p>командой: exit</p><p>59</p><p>Совместное использование файлов между двумя контейнерами</p><p>Вы можете использовать тома для сохранения данных в</p><p>контейнерах, даже если контейнер удален. Тома можно</p><p>использовать для обмена данными между несколькими</p><p>контейнерами. Том-это директория, которая хранится на хост-</p><p>компьютере. Том может быть разделен между контейнером и</p><p>хостом.</p><p>Основными преимуществами</p><p>являются:</p><p>• Тома могут быть разделены</p><p>между контейнерами.</p><p>• Томами проще создавать</p><p>резервные копии или переносить данные.</p><p>•Объемы не увеличивают размер контейнеров. 60</p><p>пример: Создадим новый раздел</p><p>под названием hostvolume:</p><p>podman volume create hostvolume</p><p>Отобразим информацию о созданном разделе hostvolume:</p><p>podman volume inspect hostvolume</p><p>Если вы запустите под обычным пользователем команду podman volume create</p><p>hostvolume, то точка монтирования изменится на: "/home/username/.local/share/</p><p>containers/storage/volumes/hostvolume/_data"</p><p>61</p><p>Обратите внимание, что создается том в каталоге томов. Вы можете</p><p>сохранить путь к точке монтирования в переменной для облегчения</p><p>манипуляций:</p><p>mntPoint = $(podman volume inspect hostvolume --format {{.Mountpoint}})</p><p>Создайте текстовый файл внутри каталога, используя путь,</p><p>сохраненный в переменной mntPoint:</p><p>echo "Hello from host" >> $mntPoint/host.txt</p><p>62</p><p>Запустите контейнер с именем myubi1 и сопоставьте каталог, определенный именем</p><p>тома hostvolume на хосте, с каталогом / containervolume1 в контейнере:</p><p>podman run -it --name myubi1 -v hostvolume:/containervolume1</p><p>registry.redhat.io/rhel7/rsyslog:latest /bin/bash</p><p>Создайте текстовый файл в каталоге / containervolume1:</p><p>echo "Hello from container 1" >> /containervolume1/container1.txt</p><p>Отсоединитесь от контейнера с помощью клавиш CTRL+p</p><p>и CTRL+q или exit.</p><p>Перечислите файлы в общем томе на</p><p>хосте, вы должны увидеть два файла:</p><p>63</p><p>Обратите внимание, что если вы используете путь к тому, определенный переменной mntPoint (-v $ mntPoint: /</p><p>containervolume1), данные могут быть потеряны при выполнении команды podman volume prune, которая удаляет</p><p>неиспользуемые тома. Всегда используйте -v hostvolume_name: / containervolume_name.</p><p>Экспорт и импорт контейнеров</p><p>Вы можете использовать команду podman export для экспорта файловой системы</p><p>работающего контейнера в архив на вашем локальном компьютере. Например, если у</p><p>вас есть большой контейнер, который вы используете нечасто, или контейнер, снимок</p><p>которого вы хотите сохранить, чтобы вернуться к нему позже, вы можете</p><p>использовать команду podman</p><p>export, чтобы экспортировать</p><p>текущий снимок вашего</p><p>запущенного контейнера в tarball.</p><p>Вы можете использовать команду</p><p>podman import, чтобы</p><p>импортировать архив и сохранить</p><p>его как образ файловой системы.</p><p>Затем вы можете запустить этот</p><p>образ файловой системы или</p><p>использовать его как слой для</p><p>других изображений. 64</p><p>пример: Запустите контейнер myubi на основе образа</p><p>egistry.redhat.io/rhel7/rsyslog:</p><p>podman run -dt --name=myubi registry.redhat.io/rhel7/rsyslog:latest</p><p>Подключимся к контейнеру,</p><p>создадим файл и выйдем</p><p>Экспортируйте файловую систему myubi как myubi-container.tar на</p><p>локальный компьютер: podman export -o myubi.tar 97aaa7a99704</p><p>65</p><p>-d, --detach Run container in background and print container ID</p><p>Импортируйте файл myubi.tar и сохраните его как образ файловой</p><p>системы: podman import myubi.tar myubi-imported</p><p>Отобразим содержимого файла тестового файла:</p><p>podman run -it --name=myubi-imported 5a98e77ee403 cat testfile</p><p>66</p><p>Остановка контейнеров</p><p>Используйте команду podman stop, чтобы остановить работающий</p><p>контейнер. Вы можете указать контейнеры по их идентификатору</p><p>контейнера или имени.</p><p>podman stop myubi</p><p>podman stop ad42391b9b46</p><p>Команда podman stop отправляет сигнал SIGTERM для завершения работающего</p><p>контейнера. Если контейнер не останавливается после определенного периода (по</p><p>умолчанию 10 секунд), Podman отправляет сигнал SIGKILL.</p><p>Вы также можете использовать команду podman kill, чтобы убить контейнер (SIGKILL)</p><p>или отправить другой сигнал контейнеру. Вот пример отправки сигнала SIGHUP</p><p>контейнеру (если он поддерживается приложением, SIGHUP заставляет приложение</p><p>перечитывать свои файлы конфигурации):</p><p>podman kill --signal="SIGHUP" ad42391b9b46 67</p><p>Удаление контейнеров</p><p>Используйте команду podman rm для удаления контейнеров. Вы</p><p>можете указать контейнеры с помощью идентификатора или имени</p><p>контейнера.</p><p>Чтобы удалить запущенный контейнер, сначала остановите</p><p>контейнер podman stop, а затем удалите его podman rm</p><p>68</p><p>69</p><p>70</p><p>71</p><p>72</p><p>73</p><p>74</p><p>75</p><p>76</p><p>77</p><p>78</p><p>79</p><p>80</p><p>81</p><p>82</p><p>83</p><p>84</p><p>85</p><p>86</p><p>87</p><p>88</p><p>89</p><p>90</p>