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

Вступ

Примітка

Цей документ представляє розширений вміст із [батьківського документа](../../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

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

Як згадувалося, ви можете запускати контейнери Podman як служби systemd. Давайте тепер зробимо це за допомогою 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.

DockerFiles

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

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

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

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

mkdir myrocky && cd myrocky

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

echo "Welcome to Rocky" > index.html

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

# 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 у режимі демона (-p) і назвали його 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

Якщо ви перезапустите процес збирання, 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 Немає запиту на підтвердження
--volumes Prune volumes

Author: Neel Chauhan, Antoine Le Morvan

Contributors: Steven Spencer, Ganna Zhyrnova