Yandex
Обновить настройки cookies

Как использовать docker-compose с Podman в Linux

Podman - это бесплатная и открытая альтернатива Docker, разработанная компанией Red Hat. Хотя Docker широко известен и стал синонимом контейнеризации, в Podman реализован ряд технических преимуществ, которые делают его достойным конкурентом. В отличие от Docker, который требует наличия демона для управления контейнерами, Podman изначально был спроектирован как бездемонное решение. Он не нуждается в постоянном фоновом процессе для работы, что делает его более безопасным и гибким в Linux-среде. Кроме того, Podman поддерживает запуск контейнеров без необходимости в root-доступе, что значительно повышает уровень безопасности системы.

Еще одним важным аспектом Podman является его глубокая интеграция с операционными системами на базе Linux. Но одна из причин, по которой многие пользователи не спешат переходить с Docker на Podman - отсутствие полного аналога для docker-compose - инструмента, который используется для управления многоконтейнерными приложениями.

Для решения этой проблемы разработчики Podman продумали уровень совместимости, который позволяет использовать docker-compose как нативный инструмент Podman. Теперь пользователи могут выполнять команды docker-compose с Podman так же, как будто это Docker.

Установка пакетов

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

В дистрибутивах Fedora и других системах, основанных на Red Hat, установка пакета осуществляется с помощью следующей команды:
dnf install podman podman-docker
Для пользователей Debian и дистрибутивов на его основе (Ubuntu), установка выполняется командой:
apt install podman podman-docker

Выбор и настройка версии

Существуют две основные версии docker-compose:
  • Первая v1 -  оригинальная, написанная на Python, которая в настоящее время считается устаревшей. 
  • Вторая v2 - написана на Go, активно развивается и представлена как плагин Docker в официальных репозиториях.

Установка docker-compose v1

Большинство современных дистрибутивов Linux предоставляют возможность установки docker-compose через стандартные репозитории, которые включают версию на Python. Например, чтобы установить docker-compose в Fedora, нужно выполнить следующую команду:
dnf install docker-compose
Если вы используете RHEL или его клоны (CentOS) - docker-compose по умолчанию недоступен в репозиториях. Также его невозможно установить из репозитория EPEL. В этой ситуации необходимо использовать pip, менеджер пакетов Python.

Поскольку использование pip от имени пользователя root не рекомендуется, особенно в продуктивных средах, мы можем установить docker-compose v1 в изолированную виртуальную среду, действуя от имени стандартного пользователя. После этого создаем символическую ссылку на исполняемый файл, чтобы его можно было запускать из командной строки. В качестве альтернативы можно использовать pipx.

Пример ниже предполагает, что каталог `~/.local/bin` уже существует и добавлен в PATH:
python3 -m venv virtualenv
virtualenv/bin/pip install docker-compose
ln -s "${PWD}/virtualenv/bin/docker-compose" ~/.local/bin/docker-compose

В дистрибутивах на основе Debian процесс установки docker-compose v1 гораздо проще и не требует создания виртуальной среды. Вы можете установить его с помощью следующей команды:
apt install docker-compose

Установка docker-compose v2

Вторая версия - docker-compose v2 - является официально поддерживаемой. Для ее установки доступно несколько вариантов.

Установка через загрузку предварительно скомпилированного двоичного файла

В примере мы загружаем последнюю версию (2.27) для архитектуры Linux x86_64:
curl -LO https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-linux-x86_64
После загрузки файла его необходимо сделать исполняемым, а затем переместить в каталог, который находится в PATH. Если вы хотите установить его только для текущего пользователя - файл можно переместить в `~/.local/bin`. Для установки на всю систему его можно отправить в `/usr/local/bin`:

chmod +x docker-compose-linux-x86_64
mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose

Установка через официальные репозитории Docker

Еще один способ установки docker-compose v2 - использование официальных репозиториев Docker. Для этого сначала нужно добавить репозиторий Docker в вашу систему, после чего установить пакет docker-compose-plugin:
dnf install docker-compose-plugin
Этот способ предполагает использование docker-compose как плагина контейнеризации Docker, а не отдельного двоичного файла. Для использования его в качестве отдельного приложения можно создать символическую ссылку в каталоге, который находится в PATH:
ln -s /usr/libexec/docker/cli-plugins/docker-compose /usr/local/bin/docker-compose

Включение и запуск Podman сокета

Одно из ключевых отличий Podman от Docker - архитектурный подход.

Docker использует клиент-серверную модель: демон работает в фоновом режиме и требует прав суперпользователя (хотя в последних версиях Docker есть возможность работы с контейнерами на уровне пользователя без root-доступа).

Podman использует подход "fork-exec", где каждый контейнер запускается как отдельный дочерний процесс Podman.

Поскольку docker-compose изначально был создан для работы с Docker, он ожидает, что демон Docker будет запущен. Чтобы преодолеть это ограничение Podman предоставляет системный модуль, называемый "podman.socket". Для его запуска в системах с поддержкой systemd достаточно выполнить следующую команду:
systemctl enable --now podman.socket
Если вы планируете использовать Podman без root-доступа - потребуется включить и запустить экземпляр сокета на уровне пользователя:
systemctl --user enable --now podman.socket
После этого нужно настроить переменную окружения DOCKER_HOST, чтобы указать docker-compose на использование сокета Podman вместо стандартного Docker сокета. Добавьте следующую строку в файл конфигурации оболочки, например, ~/.bash_profile или ~/.profile:
export DOCKER_HOST=unix:///run/user/1000/docker.sock

Чтобы изменения вступили в силу немедленно - примените настройки в текущем сеансе оболочки:
source ~/.bash_profile

Системный сокет и сервис Podman - что это?

Кроме активированного ранее сокета /usr/lib/systemd/system/podman.socket, пакет Podman включает в себя и модуль службы systemd (/usr/lib/systemd/system/podman.service). Какую роль играет эта служба и почему мы активируем сокет, а не саму службу напрямую?

Чтобы понять, что именно выполняет systemd при запуске Podman, давайте заглянем внутрь модуля. Нас интересует параметр ExecStart в разделе Service:
ExecStart=/usr/bin/podman $LOGGING system serviceСтрока показывает, что при запуске службы systemd выполняет команду "podman system service", она создает службу, которая отвечает на API-запросы, связанные с Podman. Таким образом, Podman, хоть и не требует демона, может эмулировать интерфейс Docker, отвечая на запросы через API.

Но почему же мы предпочитаем использовать модуль сокета вместо непосредственного запуска службы? Все дело в особенностях работы systemd при активации служб через сокеты. Сокет настроен так, чтобы прослушивать входящие соединения и запускать соответствующую службу только по мере необходимости. Это позволяет экономно использовать ресурсы системы: служба не работает постоянно в фоновом режиме, а запускается только в момент обращения.

Таким образом, активируя модуль сокета Podman, мы не только обеспечиваем совместимость с docker-compose, но и оптимизируем использование системных ресурсов, позволяя Podman работать максимально эффективно.

Заключение

Изначально docker-compose был разработан для взаимодействия с Docker, который использует клиент-серверную архитектуру, отличную от модели Podman. Но при активации сокета Podman и установке пакета podman-docker мы создаем слой совместимости, который позволяет использовать docker-compose с Podman так же легко и прозрачно, как и с Docker, что значительно расширяет возможности управления контейнерами в системе.
26 Aug 2024, 19:59:55