Перейти к основному содержимому

Знакомство с Подманом

· 7 мин. чтения

1. Введение

В этом уроке мы рассмотрим Podman (сокращение от «Pod Manager»), его функции и использование.

2. Подман

Podman — это инструмент управления контейнерами с открытым исходным кодом для разработки, управления и запуска контейнеров OCI . Давайте рассмотрим некоторые преимущества Podman по сравнению с другими инструментами управления контейнерами:

  • Образы, созданные Podman, совместимы с другими инструментами управления контейнерами . Образы, созданные Podman, соответствуют стандарту OCI, поэтому их можно передавать в другие реестры контейнеров, такие как Docker Hub.
  • Его можно запустить как обычный пользователь, не требуя привилегий root. При работе от имени пользователя без полномочий root Podman создает пространство имен пользователя, внутри которого получает права root. Это позволяет ему монтировать файловые системы и устанавливать необходимые контейнеры.
  • Предоставляет возможность управлять подами. В отличие от других инструментов среды выполнения контейнеров, Podman позволяет пользователю управлять модулями (группой из одного или нескольких контейнеров, которые работают вместе). Пользователи могут выполнять такие операции, как создание, перечисление, проверка модулей.

Однако у Podman есть определенные ограничения:

  • Он работает только в системах на базе Linux. В настоящее время Podman работает только в операционных системах на базе Linux и не имеет оболочки для Windows и macOS.
  • Альтернативы Docker Compose нет. Podman не поддерживает локальное управление несколькими контейнерами, как это делает Docker Compose. Реализация Docker Compose с использованием бэкэнда Podman разрабатывается в рамках проекта podman-compose , но работа над ним все еще продолжается.

3. Сравнение с Докером

Теперь, когда мы поняли, что такое Podman, каковы его преимущества и ограничения, давайте сравним его с Docker, одним из наиболее широко используемых инструментов управления контейнерами.

3.1. Интерфейс командной строки (CLI)

Podman предлагает тот же набор команд, что и клиент Docker. Другими словами, между командами этих двух утилит существует однозначное соответствие.

Однако такие команды, как podman ps и podman images , не будут отображать контейнеры или образы, созданные с помощью Docker. Это связано с тем, что локальный репозиторий Podman — это /var/lib/containers , а не /var/lib/docker , поддерживаемый Docker.

3.2. Модель контейнера

Docker использует архитектуру клиент-сервер для контейнеров, тогда как Podman использует традиционную модель fork-exec, общую для процессов Linux. Контейнеры, созданные с помощью Podman, являются дочерним процессом родительского процесса Podman. По этой причине, когда команда version запускается как для Docker, так и для Podman, Docker перечисляет версии как клиента, так и сервера, тогда как Podman перечисляет только свою версию.

Пример вывода для версии докера :

Client:
Version: 17.12.0-ce
API version: 1.35
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 27 20:11:19 2017
OS/Arch: linux/amd64

Server:
Engine:
Version: 17.12.0-ce
API version: 1.35 (minimum version 1.12)
Go version: go1.9.2
Git commit: c97c6d6
Built: Wed Dec 27 20:09:53 2017
OS/Arch: linux/amd64
Experimental: false

Пример вывода для версии podman :

Version:       0.3.2-dev
Go Version: go1.9.4
Git Commit: "4f4a78abb40fa0e8407e8a55d5a67a2650d8fd96"
Built: Mon Mar 5 11:10:35 2018
OS/Arch: linux/amd64

Поскольку сам Podman работает как процесс, ему не требуются какие-либо процессы демона в фоновом режиме. В отличие от Podman, для Docker требуется процесс-демон Docker для координации запросов API между клиентом и сервером .

3.3. Безрутовый режим

Как упоминалось ранее, Podman не требует root-доступа для запуска своих команд. Docker, с другой стороны, зависит от процесса демона, требует привилегий root или требует, чтобы пользователь был частью группы docker, чтобы иметь возможность запускать команды Docker без привилегий root .

$ sudo usermod -aG docker $USER

4. Установка и использование

Начнем с установки Podman . Команда podman info отображает информацию о системе Podman и помогает проверить состояние установки.

$ podman info

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

host:
MemFree: 546578432
MemTotal: 1040318464
SwapFree: 4216320000
SwapTotal: 4216320000
arch: amd64
cpus: 2
hostname: base-xenial
kernel: 4.4.0-116-generic
os: linux
uptime: 1m 2.64s
insecure registries:
registries: []
registries:
registries:
- docker.io
- registry.fedoraproject.org
- registry.access.redhat.com
store:
ContainerStore:
number: 0
GraphDriverName: overlay
GraphOptions: null
GraphRoot: /var/lib/containers/storage
GraphStatus:
Backing Filesystem: extfs
Native Overlay Diff: "true"
Supports d_type: "true"
ImageStore:
number: 0
RunRoot: /var/run/containers/storage

Давайте рассмотрим некоторые из основных команд Podman.

4.1. Создание изображения

Сначала мы рассмотрим создание образа с помощью Podman. Начнем с создания Dockerfile со следующим содержимым:

FROM centos:latest
RUN yum -y install httpd
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
EXPOSE 80

Теперь давайте создадим образ с помощью команды сборки :

$ podman build .

Здесь мы сначала извлекаем базовый образ CentOS, устанавливаем Apache поверх него, а затем запускаем его как процесс переднего плана с открытым портом 80. Мы можем получить доступ к серверу Apache, запустив этот образ и сопоставив открытый порт с портом хоста.

Команда сборки рекурсивно передает все папки, доступные в каталоге контекста. Текущий рабочий каталог по умолчанию становится контекстом сборки, если каталог не указан. Следовательно, желательно не иметь файлов и папок, которые не требуются для создания образа, в каталоге контекста.

4.2. Список доступных изображений

Команда podman images выводит список всех доступных образов. Он также поддерживает различные параметры фильтрации изображений.

$ podman images

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

REPOSITORY                 TAG      IMAGE ID         CREATED         SIZE
docker.io/library/centos latest 0f3e07c0138f 2 months ago 227MB
<none> <none 49030e844ce7 27 seconds ago 277MB

4.3. Запуск изображений

Команда запуска создает контейнер данного образа, а затем запускает его. Давайте запустим образ CentOS, который мы создали ранее.

$ podman run  -p 80:80 -dit centos

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

Приведенная выше команда запуска указывает, что открытый порт 80 контейнера должен сопоставляться с портом 80 хоста, а флаг dit указывает на запуск контейнера в автономном и интерактивном режиме . Идентификатор созданного контейнера будет выводом.

4.4. Удаление изображений

Команда rmi удаляет изображения, присутствующие в локальном репозитории. Несколько изображений можно удалить, указав их идентификаторы через пробел во входных данных. Указание флага -a удаляет все изображения

$ podman rmi 785188cd988c

4.5. Список контейнеров

Все доступные контейнеры, включая незапущенные, можно просмотреть с помощью команды ps -a . Подобно команде изображений , ее также можно использовать с различными параметрами .

$ podman ps -a

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

CONTAINER ID   IMAGE    COMMAND     CREATED AT                      STATUS              PORTS                                    NAMES
eed30719cd37 centos /bin/bash 2019-12-09 02:57:37 +0000 UTC Up 14 minutes ago 0.0.0.0:80->80/udp, 0.0.0.0:80->80/tcp reverent_liskov

4.6. Удаление контейнеров

Команда rm удаляет контейнеры. Эта команда не удаляет контейнеры в запущенном или приостановленном состоянии. Их нужно сначала остановить, а затем удалить.

$ podman stop eed30719cd37

$ podman rm eed30719cd37

4.7. Создание модулей

Команда pod create создает pod. Команда create поддерживает различные параметры .

$ podman pod create

Команда pod create создает pod с инфра - контейнером, который по умолчанию связан с ним, если явно не установлен флаг infra как false.

$ podman pod create --infra = false

Инфра-контейнер позволяет Podman подключать различные контейнеры в модуле.

4.8. Список модулей

Команда pod list отображает все доступные pod’ы.

$ podman pod list

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

POD ID         NAME             STATUS      CREATED       # OF CONTAINERS   INFRA ID
7e0a68528aed gallant_raman Running 5 seconds ago 1 c6d06673c667

Все доступные команды Podman и их использование можно найти в официальной документации .

5. Вывод

В этом уроке мы рассмотрели основы Podman и его функции, его сравнение с Docker и несколько доступных команд.

Как обычно, пример кода, использованный в этой статье, доступен на GitHub .