Yandex
Обновяване на предпочитанията за бисквитки

Как да използвате 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
За потребителите на Дебиан и базираните на него дистрибуции (Убунту) инсталацията се извършва с командата:
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

В базираните на Дебиан дистрибуции процесът на инсталиране на 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 използва модел клиент-сървър: демонът работи във фонов режим и изисква root достъп (въпреки че в последните версии на 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 socket, ние не само осигуряваме съвместимост с docker-compose, но и оптимизираме използването на системните ресурси, което позволява на Podman да работи възможно най-ефективно.

Заключение

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