Поиск по сайту:

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