Podman Quadlet и Docker Compose для Linux-сервисов

Выберите правильный контейнерный рабочий процесс.

Содержимое страницы

Docker Compose и Podman Quadlet решают пересекающиеся задачи, но исходят из разных принципов проектирования, и выбор между ними зависит от того, думаете ли вы в терминах стеков приложений или системных сервисов Linux.

Это различие важно для всех, кто запускает контейнеры на хосте Linux выходя за рамки одноразовых экспериментов на пару часов. Compose описывает сервисы, сети и томы в файле YAML и запускает их командой docker compose up. Quadlet описывает контейнеры в файлах юнитов в стиле systemd и позволяет системному менеджеру служб контролировать жизненный цикл.

docker compose configuration

Оба подхода подходят для самохостинга, внутренних инструментов и небольших серверов. Правильный выбор зависит от вашей модели эксплуатации, опыта команды и предпочтений: удобного для разработчиков формата стека или нативной модели сервиса systemd. Это сравнение охватывает практические различия: форматы файлов, управление жизненным циклом, rootless-контейнеры, ведение логов, обновления, сетевое взаимодействие, безопасность и пути миграции. Эта статья является частью руководства Инструменты разработчика: Полное руководство по современным рабочим процессам разработки.

Краткая рекомендация

Используйте Docker Compose, когда:

  • Вам нужен самый быстрый рабочий процесс для мультиконтейнерных приложений.
  • Вы уже используете Docker Engine.
  • Вы делитесь стеками с другими разработчиками.
  • Вам нужен знакомый файл compose.yaml для локальной разработки.
  • Вы разворачиваете небольшие сервисы с использованием Docker на одном хосте.
  • Вы используете существующие примеры Compose из проектов.

Используйте Podman Quadlet, когда:

  • Вам нужны нативные контейнерные сервисы systemd.
  • Вы предпочитаете rootless-контейнеры.
  • Вы не хотите использовать центральный демон Docker.
  • Вы запускаете долгоживущие сервисы на хосте Linux.
  • Вам нужны systemctl, journalctl, таймеры, зависимости и автозапуск.
  • Вы собираете самохостинговый или домашний сервер (homelab) на базе systemd.
  • Вы хотите, чтобы контейнеры вписывались в стандартную модель сервисов Linux.

Практическое правило:

Docker Compose лучше подходит для стеков приложений.
Podman Quadlet лучше подходит для сервисов Linux.

Это не закон. Это полезное значение по умолчанию.

Таблица сравнения

Область Docker Compose Podman Quadlet
Основная модель Мультиконтейнерное приложение Контейнерный сервис, управляемый systemd
Формат файла YAML Файлы юнитов, похожие на systemd
Runtime Docker Engine Podman
Демон Использует демон Docker Модель Podman без демона
Менеджер сервисов Compose управляет жизненным циклом стека systemd управляет жизненным циклом
Лучшее применение Стек разработки, пакеты приложений, простые разворачивания Долгоживущие сервисы Linux
Поддержка rootless Возможна, но не является моделью по умолчанию Отлично подходит
Логи docker compose logs journalctl и podman logs
Запуск при загрузке Обычно через обертку systemd или политику перезапуска Нативный юнит systemd
Обновления docker compose pull && docker compose up -d Автообновление Podman или рабочие процессы systemd
Портативность Очень высокая среди сред Docker Лучшая на Linux с systemd
Кривая обучения Проще для большинства разработчиков Проще для пользователей systemd
Примеры экосистемы Огромное количество Меньше, но растет

Ни один из них не является Kubernetes. Большинству небольших сервисов не нужен кластер. Им нужен скучный, понятный способ запуска, остановки, обновления, ведения логов и восстановления.

В чем сила Docker Compose

Docker Compose — это инструмент для определения и запуска мультиконтейнерных приложений. Типичный файл Compose описывает сервисы, образы, контексты сборки, порты, тома, сети, переменные окружения, проверки состояния (health checks), зависимости и профили.

services:
  web:
    image: nginx:stable
    ports:
      - "8080:80"
    restart: unless-stopped
    volumes:
      - ./html:/usr/share/nginx/html:ro

  redis:
    image: redis:7
    restart: unless-stopped

Запуск:

docker compose up -d

Проверка статуса:

docker compose ps

Чтение логов:

docker compose logs -f

Остановка:

docker compose down

Compose прямолинеен и продуктивен. Он особенно хорош, когда единицей мысли является “это приложение состоит из нескольких контейнеров”. Для подробной справки по командам и паттернам Compose см. Шпаргалку по Docker Compose. Для команд Docker за пределами Compose — образы, тома, сети и очистка — см. Шпаргалку по Docker.

В чем сила Podman Quadlet

Podman Quadlet — это способ определения контейнеров Podman с использованием файлов в стиле systemd. Вместо того чтобы вручную писать полностью сгенерированный сервис systemd, вы пишете декларативный файл:

[Unit]
Description=Пример веб-контейнера
After=network-online.target
Wants=network-online.target

[Container]
Image=docker.io/library/nginx:stable
PublishPort=8080:80
Volume=/opt/example/html:/usr/share/nginx/html:ro

[Service]
Restart=always

[Install]
WantedBy=multi-user.target

Сохраните его как /etc/containers/systemd/example.container, затем обновите systemd:

sudo systemctl daemon-reload

Запустите:

sudo systemctl enable --now example.service

Проверьте:

systemctl status example.service
journalctl -u example.service -f

Главное преимущество Quadlet: контейнер становится обычным сервисом Linux.

Философское различие

Docker Compose думает стеками

Compose задает вопрос: Из каких сервисов состоит это приложение?

Проект Compose обычно живет рядом с кодом приложения:

myapp/
  compose.yaml
  .env
  app/
  db/

Вы запускаете проект как единое целое:

docker compose up -d

Вы обновляете проект как единое целое:

docker compose pull
docker compose up -d

Это просто, наглядно и портативно.

Podman Quadlet думает сервисами

Quadlet задает вопрос: Какие контейнеры этот хост Linux должен запускать как сервисы?

Файлы Quadlet живут в путях контейнеров, связанных с systemd:

/etc/containers/systemd/
~/.config/containers/systemd/

Вы управляете сгенерированными сервисами с помощью systemd:

systemctl status myapp.service
systemctl restart myapp.service
journalctl -u myapp.service -f

Это ощущается более нативно на сервере Linux. Для общих паттернов сервисов systemd см. Запуск любого исполняемого файла как сервиса в Linux.

Важное различие: Кто владеет жизненным циклом?

С Docker Compose Compose владеет жизненным циклом приложения. С Quadlet жизненным циклом владеет systemd.

Это влияет на поведение при загрузке, поведение при выключении, политику перезапуска, порядок зависимостей, логи, видимость состояния здоровья, пользовательские сервисы, обновления, интеграцию с таймерами и интеграцию с другими сервисами хоста.

Если вы уже используете systemd для управления всем остальным на хосте, Quadlet вписывается идеально. Если вы думаете преимущественно в терминах стеков приложений, Compose обычно удобнее.

Docker Compose под systemd против Quadlet

Вы можете запускать Docker Compose как сервис systemd. Это часто хороший паттерн. Пример юнита systemd:

[Unit]
Description=Стек MyApp Docker Compose
Requires=docker.service
After=docker.service network-online.target
Wants=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/docker compose up -d --remove-orphans
ExecReload=/usr/bin/docker compose up -d --remove-orphans
ExecStop=/usr/bin/docker compose down
TimeoutStartSec=0
TimeoutStopSec=120

[Install]
WantedBy=multi-user.target

Это хорошо работает. Но это все еще обертка вокруг Compose. systemd запускает команду Compose, в то время как Docker и Compose обрабатывают контейнеры за кулисами.

С Quadlet генерация юнитов предназначена для прямой работы Podman и systemd. Вы пишете контейнеро-ориентированные файлы юнитов, и systemd управляет сгенерированными сервисами.

Различие тонкое, но важное:

Docker Compose под systemd:
  systemd управляет командой Compose.

Podman Quadlet:
  systemd управляет сгенерированными контейнерными сервисами.

Для подробного обзора этого паттерна см. Запуск Docker Compose как сервиса Linux с systemd.

Сравнение форматов файлов

YAML Docker Compose

Compose использует YAML. Он компактен, популярен и легко делится. Однако он чувствителен к отступам и может стать запутанным, когда стек становится большим.

services:
  app:
    image: ghcr.io/example/app:1.0.0
    restart: unless-stopped
    ports:
      - "8080:8080"
    environment:
      APP_ENV: production
    volumes:
      - app-data:/data

volumes:
  app-data:

Файлы юнитов Quadlet

Quadlet использует файлы, похожие на systemd. Они более многословны, когда у вас много сервисов, но читаемы, если вы уже понимаете systemd.

[Unit]
Description=Пример контейнера приложения
After=network-online.target
Wants=network-online.target

[Container]
Image=ghcr.io/example/app:1.0.0
PublishPort=8080:8080
Environment=APP_ENV=production
Volume=app-data.volume:/data

[Service]
Restart=always

[Install]
WantedBy=multi-user.target

И файл тома:

[Volume]
VolumeName=app-data

Сохранены как app.container и app-data.volume в соответствующей директории контейнеров systemd.

Сопоставление концепций Docker Compose с Quadlet

Концепция Compose Эквивалент Quadlet
services Файлы .container или .pod плюс .container
volumes Файлы .volume или bind-маунты
networks Файлы .network
ports PublishPort=
environment Environment= или EnvironmentFile=
restart [Service] Restart=
depends_on systemd After=, Wants=, Requires=
healthcheck Опции healthcheck Podman
profiles Включение systemd и отдельные юниты
docker compose logs journalctl -u service и podman logs
docker compose up -d systemctl start service
docker compose down systemctl stop service
директория проекта Директория юнитов контейнеров systemd

Миграция концептуально проста, но не механистична. Compose описывает стек. Quadlet описывает сервисы.

Rootless-контейнеры

Rootless-контейнеры — одна из сильнейших причин посмотреть на Podman и Quadlet.

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

Podman был спроектирован с учетом rootless-использования как первоклассного рабочего процесса. Rootless-Quadlet живет в директории конфигурации пользователя:

~/.config/containers/systemd/whoami.container

Затем управляйте им с помощью пользовательского systemd:

systemctl --user daemon-reload
systemctl --user enable --now whoami.service
systemctl --user status whoami.service
journalctl --user -u whoami.service -f

Чтобы разрешить пользовательскому сервису продолжать работу после выхода:

sudo loginctl enable-linger "$USER"

Это чистая модель для сервисов, принадлежащих пользователю.

Сравнение rootless

Область Docker Compose Podman Quadlet
Стандартная настройка по умолчанию Rootful-демон Docker Rootless-дружелюбный Podman
Модель пользовательского сервиса Возможна, но менее нативна Нативна с systemctl --user
Риск доступа к демону Сокет Docker мощный Нет центрального root-демона по умолчанию
Привязка низких портов Проста как в rootful Docker Требует дополнительной настройки при rootless
Интеграция с хостом Очень распространена Более нативна для Linux
Подход для общих серверов Требует осторожности Отлично подходит

Rootless — это не магия. У него есть компромиссы в области сетевого взаимодействия, привилегированного поведения и низких портов. Но для долгоживущих сервисов, принадлежащих пользователю, Quadlet — очень элегантная модель.

Поведение запуска и загрузки

Docker Compose

Сам по себе Compose не создает сервис загрузки. Обычно вы полагаетесь на политики перезапуска Docker, обертку systemd вокруг docker compose up -d, скрипт развертывания или инструмент более высокого уровня.

Пример политики перезапуска Compose:

services:
  app:
    image: example/app:stable
    restart: unless-stopped

Обертка systemd дает вам сервис на уровне хоста. Это хорошо, но это все еще дополнительная обертка. См. Запуск Docker Compose как сервиса Linux с systemd для полного паттерна.

Podman Quadlet

Quadlet уже ориентирован на systemd. Включение при загрузке:

sudo systemctl enable myapp.service

Для rootless:

systemctl --user enable myapp.service
sudo loginctl enable-linger "$USER"

Поведение при загрузке — это не надстройка. Это сама модель.

Поведение перезапуска

Compose обычно использует restart: unless-stopped в YAML. Quadlet обычно использует поведение перезапуска systemd:

[Service]
Restart=always

Или:

[Service]
Restart=on-failure

Это переносит логику перезапуска в менеджер сервисов. Предпочтение: используйте политики перезапуска Compose/Docker для стеков Compose, используйте политики перезапуска systemd для Quadlet и не наслаивайте слишком много супервизоров. Сохраняйте одного четкого владельца поведения перезапуска.

Сравнение ведения логов

Логи Docker Compose

docker compose logs -f
docker compose logs -f app

Это отлично подходит для разработчиков.

Логи Quadlet

Сервисы Quadlet используют логи systemd:

journalctl -u app.service -f

Для rootless-юнитов:

journalctl --user -u app.service -f

Вы все еще можете использовать логи Podman:

podman logs -f container-name

Для серверных операций интеграция с journalctl является большим преимуществом. Ваши контейнеры вписываются в тот же рабочий процесс логов, что и другие сервисы Linux.

Обновления

Обновление Docker Compose

Общий поток обновлений:

cd /opt/myapp
docker compose pull
docker compose up -d --remove-orphans
docker image prune -f

Легко обернуть в скрипт:

#!/usr/bin/env bash
set -euo pipefail

cd /opt/myapp

docker compose config --quiet
docker compose pull
docker compose up -d --remove-orphans
docker image prune -f
docker compose ps

Обновление Podman Quadlet

Упрощенный ручной поток:

sudo podman pull ghcr.io/example/app:1.0.1
sudo systemctl restart app.service

Или для rootless:

podman pull ghcr.io/example/app:1.0.1
systemctl --user restart app.service

Podman может поддерживать рабочие процессы автообновления, когда контейнеры настроены с правильными метками и политикой образов. Преимущество Quadlet не в том, что обновления всегда проще. Преимущество в том, что обновления нативны для менеджера сервисов.

Философия автообновлений

Автообновления удобны. Они также несут риски. Для низко-рисковых сервисов домашней лаборатории автоматические обновления контейнеров могут быть приемлемы. Для баз данных, приложений с сохранением состояния или бизнес-сервисов предпочтительный поток:

  1. Резервное копирование.
  2. Pull образа.
  3. Пересоздание или перезапуск.
  4. Проверка состояния.
  5. Очистка позже.

Compose делает это явным. Quadlet и Podman могут сделать это нативным для systemd. Ни один инструмент не устраняет необходимость в плане отката.

Томы и постоянные данные

Томы Compose

Compose поддерживает именованные тома:

services:
  db:
    image: postgres:16
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:

И bind-маунты:

services:
  app:
    image: example/app
    volumes:
      - ./config:/config:ro
      - ./data:/data

Томы Quadlet

Quadlet может использовать bind-маунты:

[Container]
Volume=/opt/app/config:/config:ro
Volume=/opt/app/data:/data

Или файл .volume:

[Volume]
VolumeName=app-data

Затем ссылаться на него:

[Container]
Volume=app-data.volume:/data

Compose более компактен для хранилища уровня стека. Quadlet более согласован с независимо управляемыми юнитами сервисов.

Секреты и файлы окружения

Compose

Compose часто использует env_file или environment в YAML. Для небольшого частного сервиса .env является распространенным. Для серьезных систем относитесь к .env как к чувствительным данным и не сохраняйте их в Git.

Quadlet

Quadlet может использовать:

[Container]
Environment=APP_ENV=production
EnvironmentFile=/opt/app/app.env

Ограничьте разрешения:

chmod 600 /opt/app/app.env

Ни Compose, ни Quadlet сами по себе не являются полноценной системой управления секретами. Не путайте “не в командной строке” с “безопасно”.

Сетевое взаимодействие

Сетевое взаимодействие Compose

Compose создает сеть проекта по умолчанию и дает сервисам DNS-имена на основе имен сервисов:

services:
  app:
    image: example/app
    depends_on:
      - db

  db:
    image: postgres:16

Приложение обычно может достичь базы данных по адресу db. Сетевое взаимодействие мультиконтейнерных приложений ощущается естественно. Это одна из сильнейших сторон Compose.

Сетевое взаимодействие Quadlet

Quadlet может определять сети отдельно с помощью файлов .network или использовать опции сети Podman:

[Network]
NetworkName=appnet

Файл контейнера:

[Container]
Image=example/app:stable
Network=appnet.network

Это более явно и похоже на systemd. Для одного или двух контейнеров это нормально. Для большого стека приложений Compose часто легче читать.

Поды (Pods)

У Podman есть нативная концепция подов. Это важно, если вам нравится ментальная модель Kubernetes, где несколько контейнеров разделяют сетевое пространство имен и границу жизненного цикла. Quadlet поддерживает файлы .pod:

[Pod]
PodName=myapp
PublishPort=8080:8080

Контейнер может присоединиться к этому поду:

[Container]
Image=ghcr.io/example/app:stable
Pod=myapp.pod

У Compose нет такой же модели подов. У него есть сервисы в сетях. Для большинства простых веб-приложений сетей Compose достаточно. Для пользователей Podman, которым нравится группировка в стиле подов, Quadlet — лучший выбор.

Рабочие процессы сборки

Compose обычно лучше, когда вы собираете образы как часть локального рабочего процесса приложения:

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"

Затем:

docker compose up --build

Это чрезвычайно удобно для разработки. Quadlet обычно лучше, когда вы запускаете уже собранные образы как сервисы. Собирайте образы с помощью Podman отдельно:

podman build -t localhost/myapp:latest .

Затем сослайтесь на образ:

[Container]
Image=localhost/myapp:latest

Если ваш рабочий процесс — “редактировать код, пересобрать, перезапустить стек”, Compose выигрывает. Если ваш рабочий процесс — “развернуть известный образ как сервис Linux”, Quadlet выигрывает.

Портативность

Файлы Compose широко распространены. Многие проекты с открытым исходным кодом предоставляют compose.yaml или docker-compose.yml. Если проект говорит “запустите это с Docker Compose”, вы обычно можете быстро начать с docker compose up -d. Это большое практическое преимущество.

Quadlet портативен между системами, имеющими Podman, systemd и совместимую поддержку Quadlet. Это более узкая цель, но очень хорошая для современных серверов Linux. Quadlet — не лучший формат для обмена приложением с каждым возможным разработчиком. Это хороший формат для описания того, как конкретный хост Linux должен запускать контейнерный сервис.

Опыт разработчика

Docker Compose обычно выигрывает в опыте разработчика. Больше примеров, больше руководств, больше шаблонов проектов, более простые локальные сборки, простой стек из одного файла, знакомая команда docker compose up и сильная совместимость с зависимостями разработки. Разработчик может быстро прочитать это:

services:
  db:
    image: postgres:16
  redis:
    image: redis:7
  app:
    build: .

Quadlet может делать похожие вещи, но он более ориентирован на эксплуатацию. Для локальной разработки я бы редко начинал с Quadlet, если только само приложение не связано специально с Podman или systemd.

Опыт эксплуатации

Quadlet часто выигрывает в опыте эксплуатации на хосте Linux. Причины:

  • Нативный systemctl
  • Нативный journalctl
  • Rootless-сервисы пользователя
  • Зависимости systemd
  • Таймеры systemd
  • Поведение перезапуска systemd
  • Отсутствие центрального демона Docker
  • Лучшая совместимость с управлением сервисами хоста

Системный администратор может рассуждать так:

systemctl status app.service
journalctl -u app.service -f
systemctl restart app.service

Это обычный рабочий процесс сервисов Linux.

Модель безопасности

Примечания по безопасности Docker Compose

Docker Compose обычно общается с демоном Docker. При обычной установке Docker на Linux доступ к сокету Docker является мощным. Пользователь, который может управлять Docker, часто может смонтировать пути хоста, запустить привилегированные контейнеры или иным образом получить широкий контроль над хостом. Для вариантов установки, включая rootless Docker на Ubuntu, см. Установка Docker на Ubuntu.

Практические советы:

  • Не небрежно экспортируйте /var/run/docker.sock.
  • Относитесь к группе docker как к привилегированной.
  • Избегайте привилегированных контейнеров.
  • Избегайте маунтов хоста, если они не нужны.
  • Храните секреты вне Git.
  • Используйте явные теги образов для важных сервисов.
  • Проверяйте опубликованные порты.

Примечания по безопасности Quadlet

Podman Quadlet хорошо сочетается с rootless-контейнерами и пользовательскими сервисами systemd. Это может снизить риски, особенно на общих хостах или персональных серверах, где сервисам не требуется root-демон.

Практические советы:

  • Предпочитайте rootless-сервисы, когда они подходят.
  • Используйте пользовательские юниты для сервисов, принадлежащих пользователю.
  • Используйте системные юниты только тогда, когда нужны привилегии уровня хоста.
  • Избегайте ненужных привилегированных контейнеров.
  • Запирайте файлы окружения.
  • Вдумчиво подходите к bind-маунтам.

Rootless не означает отсутствие рисков. Это означает, что радиус поражения по умолчанию может быть меньше.

Производительность

Для большинства веб-сервисов, внутренних инструментов и самохостинговых приложений производительность не является решающим фактором. Основные различия операционные, а не сырая скорость. Выбирайте на основе модели жизненного цикла, модели безопасности, интеграции с хостом, опыта команды, процесса обновлений, сетевых потребностей и рабочего процесса отладки.

Если вы выбираете между Compose и Quadlet только из-за производительности, вы, вероятно, оптимизируете неправильный слой.

Режимы сбоя

Режимы сбоя Docker Compose

Распространенные проблемы:

  • Демон Docker не запущен
  • Плагин Compose отсутствует
  • Неправильная директория проекта
  • .env не загружен как ожидалось
  • Случайное использование старого бинарного файла docker-compose
  • Контейнеры не пересозданы после изменений конфигурации
  • Оставшиеся орфанные контейнеры после переименования сервиса
  • Томы удалены с down -v
  • Логи Docker заполняют диск
  • Ошибки разрешений сокета Docker

Лучшие исправления:

docker compose config
docker compose ps
docker compose logs -f
docker compose up -d --remove-orphans

Режимы сбоя Podman Quadlet

Распространенные проблемы:

  • Файл юнита в неправильной директории
  • Забыли systemctl daemon-reload
  • Использование системных юнитов, когда предполагались пользовательские
  • Забыли loginctl enable-linger для rootless-сервисов
  • Pull образа занимает больше времени, чем таймаут запуска systemd
  • cgroup v2 недоступен
  • Метки SELinux или разрешения томов
  • Имя сервиса отличается от ожиданий файла
  • Юнит сети или тома не включен или не указан правильно

Лучшие исправления:

systemctl status app.service
journalctl -u app.service -f
systemctl daemon-reload
podman ps -a
podman logs container-name

Для rootless:

systemctl --user status app.service
journalctl --user -u app.service -f

Пример миграции: Compose в Quadlet

Начнем с этого сервиса Compose:

services:
  whoami:
    image: traefik/whoami:v1.10
    restart: unless-stopped
    ports:
      - "8080:80"
    environment:
      WHOAMI_NAME: compose-demo

Запуск с Compose:

docker compose up -d

Примерный эквивалент Quadlet:

[Unit]
Description=Демо-контейнер Whoami
After=network-online.target
Wants=network-online.target

[Container]
Image=docker.io/traefik/whoami:v1.10
PublishPort=8080:80
Environment=WHOAMI_NAME=quadlet-demo

[Service]
Restart=always

[Install]
WantedBy=multi-user.target

Сохраните как /etc/containers/systemd/whoami.container, затем:

sudo systemctl daemon-reload
sudo systemctl enable --now whoami.service
sudo systemctl status whoami.service

Пример прост, потому что это один контейнер. Большой стек Compose с базами данных, сетями, томами и шагами сборки требует более тщательного перевода.

Чек-лист миграции

Прежде чем переходить с Compose на Quadlet, спросите себя:

[ ] Является ли этот стек действительно набором долгоживущих сервисов хоста?
[ ] Образы уже собраны и опубликованы?
[ ] Нужны ли rootless-сервисы?
[ ] Нужны ли зависимости и таймеры systemd?
[ ] Томы и bind-маунты четко поняты?
[ ] Порты задокументированы?
[ ] Секреты обрабатываются вне Git?
[ ] Есть ли процесс резервного копирования и восстановления?
[ ] Могу ли я мониторить логи через journalctl?
[ ] Есть ли путь отката?

Если большинство ответов — да, Quadlet может быть хорошим выбором. Если стек в основном для локальной разработки, Compose, вероятно, все еще лучше.

Когда оставаться с Docker Compose

Оставайтесь с Compose, когда:

  • Проект уже поставляется с хорошим файлом Compose.
  • Вам нужен самый простой путь онбординга.
  • Разработчики запускают тот же стек локально.
  • Вы собираете образы во время разработки.
  • Вам нужен один YAML-файл для сервисов, томов и сетей.
  • Вы хотите максимальной совместимости с руководствами и сообществом.
  • Ваша текущая обертка systemd работает хорошо.

Нет приза за миграцию работающего стека Compose в Quadlet просто потому, что Quadlet теоретически чище. Если Compose скучен и надежен для вашего случая использования, держитесь за него.

Когда переходить на Podman Quadlet

Переходите на Quadlet, когда:

  • Стек — это действительно сервис хоста.
  • Вам нужно управление rootless-сервисами.
  • Вы предпочитаете Podman вместо Docker.
  • Вы хотите, чтобы systemd владел жизненным циклом.
  • Вам нужны логи journalctl.
  • Вам нужны зависимости сервисов.
  • Вам нужны пользовательские сервисы, выживающие после выхода.
  • Вы хотите меньшей экспозиции демона Docker.
  • Вы строите хост для самохостинга вокруг systemd.

Quadlet — это не “Compose, но лучше”. Это другой центр проектирования.

Рекомендуемые паттерны

Паттерн 1: Локальная разработка

Используйте Docker Compose. Быстро, знакомо, портативно, легко пересобирать, удобно для команд.

Паттерн 2: Самохостинг на одном узле

Используйте любой. Выберите Compose, если проект уже предоставляет файл Compose. Выберите Quadlet, если вам нужно нативное управление сервисами systemd. Compose дает лучший пакет приложения; Quadlet дает лучший сервис Linux.

Паттерн 3: Rootless-сервис пользователя

Используйте Podman Quadlet. Rootless-рабочий процесс, управление сервисами на уровне пользователя, отсутствие центрального демона Docker.

~/.config/containers/systemd/app.container
systemctl --user enable --now app.service
loginctl enable-linger

Паттерн 4: Сервер, похожий на продакшн

Используйте Docker Compose с дисциплинированной оберткой systemd, или используйте Quadlet, если ваша команда комфортно чувствует себя с Podman. Не выбирайте на основе моды. Выбирайте на основе того, кто будет эксплуатировать его в 2 часа ночи.

Паттерн 5: Многоузловая платформа

Не используйте ни один из них как финальный слой оркестрации. Рассмотрите Kubernetes, Nomad, Swarm или управляемую платформу. Compose и Quadlet — отличные инструменты для одного хоста. Они не являются планировщиками кластеров.

Практическое дерево решений

Это в основном для локальной разработки?
  да:
    используйте Docker Compose
  нет:
    продолжайте

Проект уже предоставляет поддерживаемый compose.yaml?
  да:
    используйте Docker Compose, если у вас нет веской причины для миграции
  нет:
    продолжайте

Вы хотите rootless долгоживущие сервисы, управляемые systemd?
  да:
    используйте Podman Quadlet
  нет:
    продолжайте

Вы хотите самое простое определение мультиконтейнерного приложения?
  да:
    используйте Docker Compose
  нет:
    продолжайте

Вы хотите, чтобы контейнеры вели себя как обычные сервисы Linux?
  да:
    используйте Podman Quadlet
  нет:
    используйте Docker Compose

Команды бок о бок

Задача Docker Compose Podman Quadlet
Запуск docker compose up -d systemctl start app.service
Остановка docker compose down systemctl stop app.service
Перезапуск docker compose restart systemctl restart app.service
Применение изменений docker compose up -d systemctl daemon-reload && systemctl restart app.service
Логи docker compose logs -f journalctl -u app.service -f
Статус docker compose ps systemctl status app.service
Включение при загрузке Обертка systemd или политика перезапуска systemctl enable app.service
Pull обновления docker compose pull podman pull image
Rootless-сервис возможен естественно с systemctl --user

Распространенные недопонимания

“Quadlet заменяет Docker Compose”

Не совсем. Quadlet заменяет некоторые случаи использования Compose, особенно долгоживущие сервисы Linux. Он не заменяет Compose как самый простой формат стека приложений для разработчиков.

“Docker Compose не готов к продакшну”

Слишком широко. Compose может быть совершенно разумным для небольших продакшн-систем, если вы понимаете резервное копирование, обновления, ведение логов, поведение перезапуска и безопасность хоста. Проблема не в Compose. Проблема в том, чтобы притворяться, что одноузловое разворачивание Compose имеет те же свойства, что и оркестратор кластера.

“Podman — это просто Docker без демона”

Слишком просто. У Podman есть команды, совместимые с Docker, но его центр проектирования другой: работа без демона, rootless-рабочие процессы, поды и интеграция с Linux.

“Rootless означает безопасность”

Нет. Rootless снижает некоторые риски. Он не делает небезопасные образы, экспонированные секреты, небезопасные bind-маунты или уязвимые приложения безопасными.

“systemd слишком тяжел для контейнеров”

systemd уже является менеджером сервисов на большинстве основных серверов Linux. Использование его для управления долгоживущими контейнерами — не странно. Это часто скучная и правильная вещь для выполнения.

Итоговая рекомендация

Используйте Docker Compose, когда стек приложения — это главное. Используйте Podman Quadlet, когда сервис Linux — это главное.

Это различие полезнее, чем споры о том, какой инструмент лучше. Для рабочих процессов разработчиков Compose трудно победить. Он популярен, читаем, портативен и поддерживается бесчисленными проектами. Для долгоживущих сервисов Linux Quadlet тихо великолепен. Он делает контейнеры похожими на нативные сервисы systemd, естественно работает с rootless Podman и вписывается в эксплуатационную модель серьезного хоста Linux.

Предпочтительное разделение:

Локальная разработка: Docker Compose
Портативные примеры приложений: Docker Compose
Небольшие самохостинговые стеки: Docker Compose или Quadlet
Rootless-сервисы пользователя: Podman Quadlet
Долгоживущие сервисы хоста: Podman Quadlet
Многоузловая оркестрация: ни один; используйте реального оркестратора

Не мигрируйте только чтобы быть современными. Мигрируйте, когда модель жизненного цикла лучше. Compose — отличный инструмент для стеков. Quadlet — отличный инструмент для сервисов. Умный выбор — использовать каждый там, где его ментальная модель совпадает с задачей.

Ссылки

Подписаться

Получайте новые материалы про системы, инфраструктуру и AI engineering.