Как использовать docker-compose с Podman в Linux
Podman — бесплатная альтернатива Docker с открытым исходным кодом, созданная Red Hat. Хотя Docker, вероятно, получил более широкое распространение, вплоть до того, что стал синонимом «контейнеров», с технической точки зрения Podman превосходит его: он с самого начала разрабатывался без демонов, он способен работать без необходимость в root-правах и лучше интегрируется в среду Linux. Одной из вещей, которая потенциально помешала многим перейти с Docker на Podman, было отсутствие полноценного эквивалента Podman для docker-compose. Создав уровень совместимости между Podman и Docker, теперь можно использовать docker-compose, как если бы это был собственный инструмент Podman.
В этом руководстве мы увидим, как установить docker-compose в наиболее используемых дистрибутивах Linux и как использовать его с Podman вместо Docker.
В этом уроке вы узнаете:
- Как установить podman, podman-docker и docker-compose в наиболее используемых дистрибутивах Linux
- Как настроить Podman для работы с docker-compose
- Как использовать docker-compose с Podman
Установка пакетов
Первое, что нам нужно сделать, чтобы использовать docker-compose с Podman, — это установить пакет podman-docker. Этот пакет обеспечивает уровень совместимости между Docker и Podman, эмулируя интерфейс командной строки Docker, но выполняя команды Podman «под капотом».
Чтобы выполнить установку в Fedora и других дистрибутивах семейства Red Hat, мы можем запустить:
$ sudo dnf install podman podman-docker
Вместо этого, чтобы установить пакет в Debian и дистрибутивах на его основе, мы можем запустить:
$ sudo apt install podman podman-docker
Установка docker-compose
Теперь нам нужно установить docker-compose. В настоящее время существуют две версии docker-compose: первая, «v1», является исходной и теперь устаревшей версией, написанной на Python и получающей только исправления безопасности. Второй, «v2», написан на Go, активно разрабатывается и упакован как плагин Docker в официальных репозиториях Docker.
Установка docker-compose v1
Большинство дистрибутивов Linux включают пакет «docker-compose», который предоставляет версию инструмента для Python. Чтобы установить его в Fedora, мы запускаем:
$ sudo dnf install docker-compose
На RHEL и клонах пакет docker-compose недоступен из коробки, а также его нельзя установить (по крайней мере, на момент написания статьи) из репозитория EPEL. В этих дистрибутивах нам необходимо установить docker-compose v1 как пакет Python с помощью pip, менеджера пакетов Python.
Поскольку мы не хотим запускать pip от имени пользователя root, мы устанавливаем пакет в его собственную выделенную виртуальную среду как стандартный непривилегированный пользователь, а затем создаем символическую ссылку на исполняемый файл (в качестве альтернативы мы можем используйте такой инструмент, как 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
Чтобы установить docker-compose v1 в дистрибутивах Debian и на его основе, мы можем запустить:
$ sudo apt install docker-compose
Установка docker-compose v2
Как мы уже говорили, официально поддерживаемая и активно развиваемая версия docker-compose — v2. Универсальный способ установки для перекрестного распространения — загрузка предварительно скомпилированного двоичного файла для нашей системной архитектуры прямо из репозитория проекта на GitHub. В примере ниже мы загружаем версию Linux x86_64 последней версии (2.27 на момент написания статьи):
$ 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
$ sudo mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
Альтернативный способ установки docker-compose v2 — из официального репозитория Docker. Сначала мы добавляем репозиторий в наш дистрибутив, следуя официальному руководству, затем устанавливаем пакет «docker-compose-plugin»:
$ sudo dnf install docker-compose-plugin
При выполнении приведенной выше команды мы устанавливаем docker-compose как плагин Docker, а не как отдельный двоичный файл: чтобы использовать его как таковой, достаточно создать символическую ссылку в каталоге в нашей PATH:
$ sudo ln -s /usr/libexec/docker/cli-plugins/docker-compose /usr/local/bin/docker-compose
Включение и запуск сокета Podman
Одним из основных различий между Podman и Docker является их дизайн. Docker использует архитектуру клиент-сервер: демон Docker работает в фоновом режиме, обычно с привилегиями root (хотя последние версии Docker поддерживают запуск версии демона без root-доступа на пользовательском уровне), а Podman использует так называемый «fork-exec». ” (каждый контейнер запускается как дочерний процесс Podman). Поскольку docker-compose предназначен для работы с Docker, он ожидает, что демон docker будет запущен. По этой причине Podman предоставляет системный модуль «podman.socket». Чтобы использовать docker-compose с Podman, необходимо запустить и включить его:
$ sudo systemctl enable --now podman.socket
Если мы хотим использовать docker-compose с экземпляром Podman без root, нам нужно включить и запустить экземпляр сокета пользовательского уровня:
$ systemctl --user enable --now podman.socket
В последнем случае нам также необходимо определить и экспортировать переменную среды DOCKER_HOST
. Традиционный способ сделать это — добавить следующую строку в ~/.bash_profile
или ~/.profile
, в зависимости от используемой оболочки:
export DOCKER_HOST=unix:///run/user/1000/docker.sock
Чтобы изменения немедленно вступили в силу в нашем текущем экземпляре оболочки, не дожидаясь следующего входа в систему, мы можем напрямую получить файл:
$ source ~/.bash_profile
Системный сокет и сервис
Помимо модуля сокета, который мы активировали на предыдущем шаге (/usr/lib/systemd/system/podman.socket
), пакет Podman поставляется с модулем «service» 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 не требуется демон, Podman может «имитировать» интерфейс Docker.
Почему мы включаем и запускаем модуль сокета, а не службу напрямую? При этом мы воспользуемся особенностью Systemd: службами, активируемыми сокетами. Сокет прослушивает соединения и запускает службу по запросу, используя ресурсы наиболее эффективным способом.
Использование docker-compose
Когда все готово, мы можем использовать docker-compose, как если бы мы запускали Docker под капотом. Ниже приведен базовый пример файла компоновки. Он порождает контейнер для сервера MariaDB и один для phpMyAdmin:
version: '3.7'
services:
mariadb:
image: docker.io/mariadb
volumes:
- db:/var/lib/mysql
environment:
TZ: "Europe/Rome"
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_USER: testuser
MYSQL_PASSWORD: testpassword
MYSQL_DATABASE: testdb
phpmyadmin:
image: docker.io/phpmyadmin
environment:
PMA_HOST: mariadb
ports:
- "80:80"
depends_on:
- mariadb
volumes:
db:
Чтобы создать контейнеры, тома и выделенную сеть для стека, мы запускаем:
$ sudo docker-compose up
Выводы
В этом уроке мы узнали, как настроить Podman для работы с docker-compose. Docker-compose был разработан для работы с Docker, который, в отличие от Podman, использует архитектуру клиент-сервер. Включив сокет Podman и установив пакет podman-docker, мы по сути создаем уровень совместимости, который позволяет нам прозрачно использовать docker-compose с Podman.