Перейти до змісту

Podman

Вступ

Примітка

Цей документ представляє розширений вміст із [батьківського документа](../../gemstones/containers/podman.md). Якщо вам потрібна коротка інструкція, цього батьківського документа може бути достатньо. 

Podman (Pod Manager) — це інструмент керування контейнерами та зображеннями, сумісний з OCI (Ініціатива відкритого контейнера).

Podman:

  • працює без демона (може запускати контейнери як службу systemd)
  • дозволяє вам керувати контейнерами як непривілейований користувач (не обов’язково бути root)
  • включені, на відміну від докерів, у сховища Rocky Linux

Це робить Podman не лише сумісним із докерами альтернативним середовищем виконання контейнерів, але й набагато більше.

Встановлення Podman

Використовуйте утиліту dnf для встановлення Podman:

dnf install podman

Ви можете отримати список доступних підкоманд podman за допомогою наступної команди:

$ 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Створює зображення, використовуючи інструкції з Containerfiles
commitСтворює нове зображення на основі зміненого контейнера
containerКерує контейнерами
cpКопіює файли/папки між контейнером і локальною файловою системою
createСтворює, але не запускає контейнер
execЗапускає процес у запущеному контейнері
imageКерує зображеннями
imagesПерераховує зображення в локальному сховищі
infoВідображає інформацію про систему Podman
initІніціалізує один або кілька контейнерів
inspectВідображає конфігурацію об'єкта, позначеного ID
killВбиває один або кілька запущених контейнерів за допомогою певного сигналу
loginВхід до реєстру контейнерів
logsОтримує журнали одного або кількох контейнерів
networkКерує мережами
pauseПризупиняє всі процеси в одному або кількох контейнерах
psПерераховує контейнери
pullВитягує образ із реєстру
pushНадсилає зображення до вказаного пункту призначення
restartПерезапускає один або кілька контейнерів
rmВидаляє один або кілька контейнерів
rmiВилучає одне або кілька зображень із локального сховища
runВиконує команду в новому контейнері
startЗапускає один або декілька контейнерів
statsВідображає прямий потік статистики використання ресурсів контейнера
stopЗупиняє один або декілька контейнерів
systemКерує podman
topВідображає запущені процеси контейнера
unpauseВідновлює процеси в одному або кількох контейнерах
volumeКерує обсягами

Примітка

Podman може запускати майже будь-яку команду Docker завдяки подібному інтерфейсу CLI.

Якщо вам потрібно використовувати файл створення, не забудьте встановити пакет podman-compose:

dnf install podman-compose

Додавання контейнера

Запустіть Nextcloud автономну хмарну платформу як на прикладі:

podman run -d -p 8080:80 nextcloud

Ви отримаєте підказку вибрати реєстр контейнерів для завантаження. У нашому прикладі ви будете використовувати docker.io/library/nextcloud:latest.

Коли ви завантажите образ Nextcloud, він запуститься.

Введіть ip_address:8080 у своєму веб-браузері (за умови, що ви відкрили порт у firewalld) і налаштуйте Nextcloud:

Nextcloud in container

Підказка

Щоб стежити за виведенням журналу останнього створеного контейнера, використовуйте `podman logs -lf`. `-l` вказує на використання останнього створеного контейнера, тоді як `-f` вказує на відстеження журналів у міру їх створення. Натисніть Ctrl+C, щоб зупинити виведення журналу.

Запуск контейнерів як служб systemd

Використання quadlet

Починаючи з версії 4.4 Podman постачається з Quadlet – генератором systemd. Його можна використовувати для генерації файлів модулів для безкорінних і кореневих системних служб.

Розмістіть файли Quadlet для кореневих служб у:

  • /etc/containers/systemd/
  • /usr/share/containers/systemd/

Розмістіть безкореневі файли в будь-якому з:

  • $XDG_CONFIG_HOME/containers/systemd/ або ~/.config/containers/systemd/
  • /etc/containers/systemd/users/$(UID)
  • /etc/containers/systemd/users/

Окрім окремих контейнерів, підтримуються файли pod, image, network, volume і kube. Давайте зосередимося на нашому прикладі Nextcloud. Створіть новий файл ~/.config/containers/systemd/nextcloud.cotainer із таким вмістом:

[Container]
Image=nextcloud
PublishPort=8080:80

Доступно багато інших варіантів.

Щоб запустити генератор і повідомити systemd про запуск нової служби:

systemctl --user daemon-reload

Щоб запустити службу, виконайте такі дії:

systemctl --user start nextcloud.service

Примітка

Якщо ви створили файл в одному з каталогів для кореневих служб, опустіть позначку `--user`.

Щоб автоматично запускати контейнер після запуску системи або входу користувача, ви можете додати ще один розділ до свого файлу nextcloud.container:

[Install]
WantedBy=default.target

Оскільки згенеровані службові файли вважаються тимчасовими, їх не можна ввімкнути за допомогою systemd. Щоб пом’якшити це, генератор вручну застосовує встановлення під час створення. Це фактично також активує ці файли служб.

Підтримуються інші типи файлів: pod, том, мережа, зображення та kube. Pods, наприклад, можна використовувати для групування контейнерів – згенерованого systemd служби та їхні залежності (створити pod перед контейнерами) автоматично керуються systemd.

Використання podman generate systemd

Podman додатково надає підкоманду generate systemd. Використовуйте цю підкоманду для створення службових файлів systemd.

Важливо

`generate systemd` не підтримується і не матиме подальших функцій. Рекомендовано використовувати Quadlet.

Давайте тепер зробимо це за допомогою Nextcloud. Запустіть:

podman ps

Ви отримаєте список запущених контейнерів:

04f7553f431a  docker.io/library/nextcloud:latest  apache2-foregroun...  5 minutes ago  Up 5 minutes  0.0.0.0:8080->80/tcp  compassionate_meninsky

Як видно вище, ім’я нашого контейнера – compassionate_meninsky.

Щоб створити контейнер systemd і ввімкнути його під час перезавантаження, виконайте наступне:

podman generate systemd --name compassionate_meninsky > /usr/lib/systemd/system/nextcloud.service
systemctl enable nextcloud

Замініть compassionate_meninsky на назву вашого контейнера.

Коли ваша система перезавантажиться, Nextcloud перезапуститься в Podman.

Containerfiles

Containerfile — це файл, який використовується Podman для створення зображень контейнерів. Containerfiles використовують той самий синтаксис, що й файли Docker, тож ви можете створювати зображення контейнерів за допомогою Podman так само, як і за допомогою Docker.

Веб-сервер із Containerfile

Ви створите сервер http на основі RockyLinux 9.

Створіть папку, присвячену нашому зображенню:

mkdir myrocky && cd myrocky

Створіть файл index.html, який працюватиме на нашому веб-сервері:

echo "Welcome to Rocky" > index.html

Створіть файл Containerfile з таким вмістом:

# Use the latest rockylinux image as a start
FROM rockylinux:9

# Make it uptodate
RUN dnf -y update
# Install and enable httpd
RUN dnf -y install httpd
RUN systemctl enable httpd
# Copy the local index.html file into our image
COPY index.html /var/www/html/

# Expose the port 80 to the outside
EXPOSE 80

# Start the services
CMD [ "/sbin/init" ]

Ви готові створити наш образ під назвою myrockywebserver:

$ podman build -t myrockywebserver .

STEP 1/7: FROM rockylinux:9
Resolved "rockylinux" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull docker.io/library/rockylinux:9...
Getting image source signatures
Copying blob 489e1be6ce56 skipped: already exists
Copying config b72d2d9150 done
Writing manifest to image destination
STEP 2/7: RUN dnf -y update
Rocky Linux 9 - BaseOS                          406 kB/s | 2.2 MB     00:05    
Rocky Linux 9 - AppStream                       9.9 MB/s | 7.4 MB     00:00    
Rocky Linux 9 - Extras                           35 kB/s |  14 kB     00:00    
Dependencies resolved.
================================================================================
 Package                   Arch      Version                 Repository    Size
================================================================================
Upgrading:
 basesystem                noarch    11-13.el9.0.1           baseos       6.4 k
 binutils                  x86_64    2.35.2-42.el9_3.1       baseos       4.5 M
...
Complete!
--> 2e8b93d30f31
STEP 3/7: RUN dnf -y install httpd
Last metadata expiration check: 0:00:34 ago on Wed Apr  3 07:29:56 2024.
Dependencies resolved.
================================================================================
 Package                Arch       Version                  Repository     Size
================================================================================
Installing:
 httpd                  x86_64     2.4.57-5.el9             appstream      46 k
...
Complete!
--> 71db5cabef1e
STEP 4/7: RUN systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service  /usr/lib/systemd/system/httpd.service.
--> 423d45a3cb2d
STEP 5/7: COPY index.html /var/www/html/
--> dfaf9236ebae
STEP 6/7: EXPOSE 80
--> 439bc5aee524
STEP 7/7: CMD [ "/sbin/init" ]
COMMIT myrockywebserver
--> 7fcf202d3c8d
Successfully tagged localhost/myrockywebserver:latest
7fcf202d3c8d059837cc4e7bc083a526966874f978cd4ab18690efb0f893d583

Ви можете запустити образ Podman і підтвердити, що він запущений:

$ podman run -d --name rockywebserver -p 8080:80 localhost/myrockywebserver
282c09eecf845c7d9390f6878f9340a802cc2e13d654da197d6c08111905f1bd

$ podman ps
CONTAINER ID  IMAGE                              COMMAND     CREATED         STATUS         PORTS                 NAMES
282c09eecf84  localhost/myrockywebserver:latest  /sbin/init  16 seconds ago  Up 16 seconds  0.0.0.0:8080->80/tcp  rockywebserver

Ви запустили образ Podman у режимі демона (-d) і назвали його rockywebserver (параметр --name).

Ви перенаправили порт 80 (захищений) на порт 8080 за допомогою параметра -p. Перевірте, чи прослуховує порт:

ss -tuna | grep "*:8080"
tcp   LISTEN    0      4096                *:8080             *:*

Переконайтеся, що файл index.html доступний:

$ curl http://localhost:8080
Welcome to Rocky

Вітаємо! Тепер ви можете зупинити та знищити своє запущене зображення, вказавши назву, яку ви вказали під час створення:

podman stop rockywebserver && podman rm rockywebserver

Підказка

Ви можете додати перемикач `--rm`, щоб автоматично видалити контейнер після його зупинки.

Якщо ви перезапустите процес збирання, podman використовуватиме кеш на кожному кроці збирання:

$ podman build -t myrockywebserver .

STEP 1/7: FROM rockylinux:9
STEP 2/7: RUN dnf -y update
--> Using cache 2e8b93d30f3104d77827a888fdf1d6350d203af18e16ae528b9ca612b850f844
--> 2e8b93d30f31
STEP 3/7: RUN dnf -y install httpd
--> Using cache 71db5cabef1e033c0d7416bc341848fbf4dfcfa25cd43758a8b264ac0cfcf461
--> 71db5cabef1e
STEP 4/7: RUN systemctl enable httpd
--> Using cache 423d45a3cb2d9f5ef0af474e4f16721f4c84c1b80aa486925a3ae2b563ba3968
--> 423d45a3cb2d
STEP 5/7: COPY index.html /var/www/html/
--> Using cache dfaf9236ebaecf835ecb9049c657723bd9ec37190679dd3532e7d75c0ca80331
--> dfaf9236ebae
STEP 6/7: EXPOSE 80
--> Using cache 439bc5aee524338a416ae5080afbbea258a3c5e5cd910b2485559b4a908f81a3
--> 439bc5aee524
STEP 7/7: CMD [ "/sbin/init" ]
--> Using cache 7fcf202d3c8d059837cc4e7bc083a526966874f978cd4ab18690efb0f893d583
COMMIT myrockywebserver
--> 7fcf202d3c8d
Successfully tagged localhost/myrockywebserver:latest
7fcf202d3c8d059837cc4e7bc083a526966874f978cd4ab18690efb0f893d583

Ви можете очистити цей кеш за допомогою підкоманди prune:

podman system prune -a -f
ОпціїОпис
-aВидаляє всі невикористовувані дані, а не лише зовнішні для Podman
-fНемає запиту на підтвердження
--volumesPrune volumes

Pods

Pods — це спосіб групувати контейнери разом. Контейнери в модулі мають спільні параметри, наприклад монтування, розподіл ресурсів або зіставлення портів.

У Podman ви керуєте контейнерами за допомогою підкоманди podman pod, подібної до багатьох команд Podman:

КомандаОпис
cloneСтворює копію існуючого модуля.
createСтворює новий пакет.
existsПеревіряє наявність пакета в локальному сховищі.
inspectВідображає інформацію, що описує контейнер.
killВбиває основний процес кожного контейнера в одному або кількох контейнерах.
logsВідображає журнали для модуля з одним або кількома контейнерами.
pauseПризупиняє один або кілька модулів.
pruneВидаляє всі зупинені стручки та їхні контейнери.
psРоздруковує інформацію про pods.
restartПерезапускає один або кілька модулів.
rmВидаляє одну або кілька зупинених коробок і контейнерів.
startЗапускає один або кілька контейнерів.
statsВідображає прямий потік статистики використання ресурсів для контейнерів в одному або кількох пакетах.
stopЗупиняє один або кілька контейнерів.
topВідображає запущені процеси контейнерів у модулі.
unpauseВідновлює паузу одного або кількох модулів.

Контейнери, згруповані в pod, можуть отримувати доступ один до одного за допомогою localhost. Це корисно, наприклад, під час налаштування Nextcloud із спеціальною базою даних, наприклад Postgres. Nextcloud може отримати доступ до бази даних, але база даних не обов’язково має бути доступна поза контейнерами.

Щоб створити пакет, що містить Nextcloud і виділену базу даних, виконайте наступне:

# Create the pod with a port mapping
podman pod create --name nextcloud -p 8080:80

# Add a Nextcloud container to the pod – the port mapping must not be specified again!
podman create --pod nextcloud --name nextcloud-app nextcloud

# Add a Postgres database. This container has a postgres specific environment variable set.
podman create --pod nextcloud --name nextcloud-db -e POSTGRES_HOST_AUTH_METHOD=trust postgres

Щоб запустити щойно створений модуль, виконайте:

podman pod start nextcloud

Тепер ви можете налаштувати Nextcloud за допомогою локальної бази даних:

Nextcloud setting up a database

Author: Neel Chauhan, Antoine Le Morvan

Contributors: Steven Spencer, Ganna Zhyrnova, Christian Steinert