Как использовать 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