Podman Quadlet vs. Docker Compose w usługach Linuksa

Wybierz odpowiedni przepływ pracy dla kontenerów.

Page content

Docker Compose i Podman Quadlet rozwiązują częściowo nakładające się problemy, ale pochodzą z różnych ośrodków projektowych. Wybór między nimi zależy od tego, czy myślisz w kategoriach stosów aplikacji, czy usług Linuxa.

Różnica ta ma znaczenie dla każdego, kto uruchamia kontenery na hoście Linuxa poza jednodniowymi eksperymentami. Compose opisuje usługi, sieci i woluminy w pliku YAML i uruchamia je poleceniem docker compose up. Quadlet opisuje kontenery w plikach jednostek w stylu systemd i pozwala menadżerowi usług systemu przejąć kontrolę nad cyklem życia.

docker compose configuration

Oba podejścia sprawdzają się w przypadku samodzielnie hostowanych usług, narzędzi wewnętrznych i małych serwerów. Prawidłowy wybór zależy od modelu operacyjnego, znajomości zespołu oraz preferencji między przyjaznym dla deweloperów formatem stosu a natywnym dla systemd modelem usług. To porównanie obejmuje praktyczne różnice: formaty plików, własność cyklu życia, kontenery bez uprawnień root, logowanie, aktualizacje, sieciowanie, bezpieczeństwo oraz ścieżki migracji. Jest to część artykułu Narzędzia deweloperskie: Kompletny przewodnik po nowoczesnych przepływach pracy.

Krótka rekomendacja

Używaj Docker Compose, gdy:

  • Chcesz najszybszego przepływu pracy z wieloma kontenerami.
  • Już korzystasz z Docker Engine.
  • Udostępniasz sterty (stacki) innym deweloperom.
  • Potrzebujesz znajomego pliku compose.yaml do lokalnego rozwoju.
  • Wdrażasz małe usługi z Dockerem na jednym hoście.
  • Korzystasz z istniejących przykładów Compose z projektów.

Używaj Podman Quadlet, gdy:

  • Chcesz natywne dla systemd usługi kontenerowe.
  • Wolisz kontenery bez uprawnień root (rootless).
  • Nie chcesz centralnego demona Docker.
  • Uruchamiasz długotrwałe usługi na hoście Linux.
  • Chcesz korzystać z systemctl, journalctl, timerów, zależności i automatycznego uruchamiania.
  • Budujesz samodzielnie hostowany lub domowy serwer (homelab) oparty na systemd.
  • Chcesz, aby kontenery pasowały do normalnego modelu usług Linuxa.

Praktyczna zasada:

Docker Compose jest lepszy dla stosów aplikacji.
Podman Quadlet jest lepszy dla usług Linuxa.

To nie jest prawo. To użyteczne domyślne ustawienie.

Tabela porównawcza

Obszar Docker Compose Podman Quadlet
Podstawowy model Aplikacja wielo-kontenerowa Usługa kontenerowa zarządzana przez systemd
Format pliku YAML Pliki jednostek podobne do systemd
Runtime Docker Engine Podman
Demon Korzysta z demona Docker Model Podman bez demona
Menadżer usług Compose zarządza cyklem życia stosu systemd zarządza cyklem życia
Najlepsze zastosowanie Sterty deweloperskie, pakiety aplikacji, proste wdrożenia Długotrwałe usługi Linux
Wsparcie rootless Możliwe, ale nie domyślne podejście Dobre dopasowanie
Logi docker compose logs journalctl i podman logs
Uruchamianie przy starcie Zwykle przez opakowanie systemd lub politykę restartu Natywna jednostka systemd
Aktualizacje docker compose pull && docker compose up -d Automatyczna aktualizacja Podman lub przepływy systemd
Przenośność Bardzo wysoka w środowiskach Docker Najlepsza na Linuxie z systemd
Krzywa uczenia Łatwiejsza dla większości deweloperów Łatwiejsza dla użytkowników systemd
Przykłady ekosystemu Ogromne Mniejsze, ale rosnące

Żaden z nich nie jest Kubernetes. Większość małych usług nie potrzebuje klastra. Potrzebują nudnego, zrozumiałego sposobu na uruchamianie, zatrzymywanie, aktualizowanie, logowanie i odzyskiwanie.

W czym Docker Compose jest dobry

Docker Compose to narzędzie do definiowania i uruchamiania aplikacji wielo-kontenerowych. Typowy plik Compose opisuje usługi, obrazy, konteksty budowania, porty, woluminy, sieci, zmienne środowiskowe, testy zdrowotne, zależności i profile.

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

Uruchomienie:

docker compose up -d

Sprawdzenie statusu:

docker compose ps

Czytanie logów:

docker compose logs -f

Zatrzymanie:

docker compose down

Compose jest bezpośredni i produktywny. Jest szczególnie dobry, gdy jednostką myślenia jest „ta aplikacja ma kilka kontenerów". Dla kompleksowego odniesienia do poleceń i wzorców Compose, zobacz Cheat Sheet Docker Compose. Dla poleceń Docker poza Compose — obrazy, woluminy, sieci i czyszczenie — zobacz Cheat Sheet Docker.

W czym Podman Quadlet jest dobry

Podman Quadlet to sposób definiowania kontenerów Podman przy użyciu plików w stylu systemd. Zamiast ręcznie pisać pełną wygenerowaną usługę systemd, piszesz plik deklaratywny:

[Unit]
Description=Przykładowy kontener webowy
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

Zapisz go jako /etc/containers/systemd/example.container, a następnie przeładuj systemd:

sudo systemctl daemon-reload

Uruchomienie:

sudo systemctl enable --now example.service

Sprawdzenie:

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

Główną zaletą Quadlet jest to, że kontener staje się normalną usługą Linuxa.

Różnica filozoficzna

Docker Compose myśli w stertach (stackach)

Compose pyta: Jakie usługi składają się na tę aplikację?

Projekt Compose zwykle znajduje się obok kodu aplikacji:

myapp/
  compose.yaml
  .env
  app/
  db/

Uruchamiasz projekt jako całość:

docker compose up -d

Aktualizujesz projekt jako całość:

docker compose pull
docker compose up -d

To jest proste, widoczne i przenośne.

Podman Quadlet myśli w usługach

Quadlet pyta: Jakie kontenery powinien ten host Linux uruchamiać jako usługi?

Pliki Quadlet znajdują się w ścieżkach kontenerów związanych z systemd:

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

Zarządzasz wygenerowanymi usługami za pomocą systemd:

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

To czuje się bardziej natywnie na serwerze Linux. Dla ogólnych wzorców usług systemd, zobacz Uruchomienie dowolnego pliku wykonywalnego jako usługa w Linuxie.

Ważna różnica: Kto posiada cykl życia?

W przypadku Docker Compose, Compose posiada cykl życia aplikacji. W przypadku Quadlet, systemd posiada cykl życia usługi.

Wpływa to na zachowanie przy starcie, zachowanie przy wyłączeniu, politykę restartu, kolejność zależności, logi, widoczność zdrowia, usługi użytkownika, aktualizacje, integrację z timerami i integrację z innymi usługami hosta.

Jeśli już używasz systemd do zarządzania wszystkim innym na hoście, Quadlet pasuje idealnie. Jeśli myślisz głównie w kategoriach stosów aplikacji, Compose jest zwykle wygodniejszy.

Docker Compose pod systemd vs Quadlet

Możesz uruchamiać Docker Compose jako usługę systemd. To często dobry wzorzec. Przykładowa jednostka systemd:

[Unit]
Description=MyApp Docker Compose stack
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

To działa dobrze. Ale to wciąż opakowanie wokół Compose. systemd uruchamia polecenie Compose, podczas gdy Docker i Compose obsługują kontenery za kulisami.

W przypadku Quadlet, generowanie jednostek jest zaprojektowane bezpośrednio dla Podman i systemd. Piszesz pliki jednostek zorientowane na kontenery, a systemd zarządza wygenerowanymi usługami.

Różnica jest subtelna, ale ważna:

Docker Compose pod systemd:
  systemd zarządza poleceniem Compose.

Podman Quadlet:
  systemd zarządza wygenerowanymi usługami kontenerowymi.

Dla szczegółowego przewodnika przez ten wzorzec, zobacz Uruchomienie Docker Compose jako usługi Linux z systemd.

Porównanie formatów plików

Docker Compose YAML

Compose używa YAML. Jest zwarty, popularny i łatwy do udostępniania. Jest również wrażliwy na wcięcia i może stać się chaotyczny, gdy sterta stanie się duża.

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:

Pliki jednostek Quadlet

Quadlet używa plików podobnych do systemd. Są bardziej rozwlekłe, gdy masz wiele usług, ale czytelne, jeśli już znasz systemd.

[Unit]
Description=Przykładowy kontener aplikacji
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

I plik woluminu:

[Volume]
VolumeName=app-data

Zapisane jako app.container i app-data.volume w odpowiednim katalogu kontenerów systemd.

Mapowanie koncepcji Docker Compose do Quadlet

Koncepcja Compose Odpowiednik Quadlet
services Pliki .container lub .pod plus .container
volumes Pliki .volume lub montowania bind
networks Pliki .network
ports PublishPort=
environment Environment= lub EnvironmentFile=
restart [Service] Restart=
depends_on systemd After=, Wants=, Requires=
healthcheck Opcje healthcheck Podman
profiles Włączanie systemd i osobne jednostki
docker compose logs journalctl -u service i podman logs
docker compose up -d systemctl start service
docker compose down systemctl stop service
katalog projektu Katalog jednostek kontenerów systemd

Migracja jest koncepcyjnie prosta, ale nie mechaniczna. Compose opisuje stertę. Quadlet opisuje usługi.

Kontenery bez uprawnień root (Rootless)

Kontenery bez uprawnień root to jeden z najsilniejszych powódów, aby zajrzeć do Podman i Quadlet.

W przypadku Docker, wielu użytkowników dodaje siebie do grupy docker. To jest wygodne, ale dostęp do demona Docker jest efektywnie silnym dostępem do hosta. Na osobistym stanowisku roboczym może to być akceptowalne. Na serwerach współdzielonych wymaga to większej ostrożności.

Podman został zaprojektowany z myślą o użytkowaniu bez uprawnień root jako pierwszej klasy przepływie pracy. Rootless Quadlet znajduje się w katalogu konfiguracyjnym użytkownika:

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

Następnie zarządzaj nim za pomocą systemd użytkownika:

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

Aby umożliwić usłudze użytkownika działanie po wylogowaniu:

sudo loginctl enable-linger "$USER"

To jest czysty model dla usług własnych użytkownika.

Porównanie rootless

Obszar Docker Compose Podman Quadlet
Domyślna konfiguracja Demon Docker z uprawnieniami root Przyjazny dla rootless Podman
Model usługi użytkownika Możliwy, ale mniej natywny Natywny z systemctl --user
Ryzyko dostępu do demona Gniazdo Docker jest potężne Brak centralnego demona root domyślnie
Wiązanie niskich portów Proste jako rootful Docker Wymaga dodatkowej konfiguracji przy rootless
Integracja z hostem Bardzo powszechna Bardziej natywna dla Linux
Dopasowanie do serwera współdzielonego Wymaga ostrożności Dobre dopasowanie

Rootless nie jest magią. Ma kompromisy wokół sieciowania, zachowań przywilejowych i niskich portów. Ale dla długotrwałych usług własnych użytkownika, Quadlet jest bardzo eleganckim modelem.

Zachowanie przy starcie i uruchamianiu

Docker Compose

Sam Compose nie tworzy usługi startowej. Zwykle polegamy na politykach restartu Docker, opakowaniu systemd wokół docker compose up -d, skrypcie wdrożeniowym lub narzędziu wyższego poziomu.

Przykładowa polityka restartu Compose:

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

Opakowanie systemd daje ci usługę na poziomie hosta. To jest dobre, ale to wciąż dodatkowe opakowanie. Zobacz Uruchomienie Docker Compose jako usługi Linux z systemd dla pełnego wzorca.

Podman Quadlet

Quadlet jest już zorientowany na systemd. Włącz przy starcie:

sudo systemctl enable myapp.service

Dla rootless:

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

Zachowanie przy starcie nie jest dodatkiem. To jest model.

Zachowanie przy restartowaniu

Compose często używa restart: unless-stopped w YAML. Quadlet często używa zachowania restartu systemd:

[Service]
Restart=always

Lub:

[Service]
Restart=on-failure

To przenosi logikę restartu do menadżera usług. Preferencja: używaj polityk restartu Compose/Docker dla stert Compose, używaj polityk restartu systemd dla Quadlet i nie nakładaj zbyt wielu nadzorców. Trzymaj jednego wyraźnego właściciela zachowania restartu.

Porównanie logowania

Logi Docker Compose

docker compose logs -f
docker compose logs -f app

To jest doskonałe dla deweloperów.

Logi Quadlet

Usługi Quadlet używają logów systemd:

journalctl -u app.service -f

Dla jednostek rootless:

journalctl --user -u app.service -f

Możesz nadal używać logów Podman:

podman logs -f container-name

Dla operacji serwerowych, integracja z journalctl jest dużą zaletą. Twoje kontenery pasują do tego samego przepływu logów co inne usługi Linux.

Aktualizacje

Aktualizowanie Docker Compose

Powszechny przepływ aktualizacji:

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

Łatwe do opakowania w skrypt:

#!/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

Aktualizowanie Podman Quadlet

Uproszczony przepływ ręczny:

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

Lub dla rootless:

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

Podman może wspierać przepływy automatycznej aktualizacji, gdy kontenery są skonfigurowane z odpowiednimi metadanymi i polityką obrazów. Zaletą Quadlet nie jest to, że aktualizacje są zawsze prostsze. Zaletą jest to, że aktualizacje są natywne dla menadżera usług.

Filozofia automatycznych aktualizacji

Automatyczne aktualizacje są wygodne. Są również ryzykiem. Dla usług homelab o niskim ryzyku, automatyczne aktualizacje kontenerów mogą być w porządku. Dla baz danych, aplikacji stanu lub usług biznesowych, preferowanym przepływem jest:

  1. Backup.
  2. Pull.
  3. Ponowne utworzenie lub restart.
  4. Sprawdzenie zdrowia.
  5. Czyszczenie później.

Compose sprawia, że jest to jawne. Quadlet i Podman mogą sprawić, że jest to natywne dla systemd. Żadne z narzędzi nie usuwa potrzeby planu cofania.

Woluminy i dane trwał

Woluminy Compose

Compose obsługuje nazwane woluminy:

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

volumes:
  db-data:

I montowania bind:

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

Woluminy Quadlet

Quadlet może używać montowań bind:

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

Lub plik .volume:

[Volume]
VolumeName=app-data

Następnie odwołaj się do niego:

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

Compose jest bardziej zwarty dla magazynu na poziomie stosu. Quadlet jest bardziej zgodny z niezależnie zarządzanymi jednostkami usług.

Sekrety i pliki środowiskowe

Compose

Compose często używa env_file lub environment w YAML. Dla małej prywatnej usługi, .env jest powszechne. Dla poważnych systemów, traktuj .env jako poufne i trzymaj je poza Git.

Quadlet

Quadlet może używać:

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

Ogranicz uprawnienia:

chmod 600 /opt/app/app.env

Żaden Compose ani Quadlet nie jest sam w sobie kompletnym systemem zarządzania sekretami. Nie myl “nie w wierszu poleceń” z “bezpieczne”.

Sieciowanie

Sieciowanie Compose

Compose tworzy domyślną sieć projektu i nadaje usługom nazwy DNS na podstawie nazw usług:

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

  db:
    image: postgres:16

Aplikacja może zwykle osiągnąć bazę danych pod adresem db. Sieciowanie aplikacji wielo-kontenerowej czuje się naturalnie. To jest jedna z najsilniejszych cech Compose.

Sieciowanie Quadlet

Quadlet może definiować sieci oddzielnie za pomocą plików .network lub używać opcji sieci Podman:

[Network]
NetworkName=appnet

Plik kontenera:

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

To jest bardziej jawne i podobne do systemd. Dla jednego lub dwóch kontenerów, to jest w porządku. Dla dużego stosu aplikacji, Compose jest często łatwiejszy do odczytu.

Podsy (Pods)

Podman ma natywną koncepcję podsy. To ma znaczenie, jeśli podoba Ci się model mentalny Kubernetes, gdzie wiele kontenerów dzieli przestrzeń nazw sieciowych i granicę cyklu życia. Quadlet obsługuje pliki .pod:

[Pod]
PodName=myapp
PublishPort=8080:8080

Kontener może dołączyć do tej podsy:

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

Compose nie ma tego samego modelu podsy. Ma usługi w sieciach. Dla większości prostych aplikacji webowych, sieci Compose są wystarczające. Dla użytkowników Podman, którzy lubią grupowanie w stylu podsy, Quadlet jest lepszym dopasowaniem.

Przepływy budowania

Compose jest zwykle lepszy, gdy budujesz obrazy jako część lokalnego przepływu pracy aplikacji:

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

Następnie:

docker compose up --build

To jest niezwykle wygodne dla rozwoju. Quadlet jest zwykle lepszy, gdy uruchamiasz już zbudowane obrazy jako usługi. Buduj obrazy z Podman osobno:

podman build -t localhost/myapp:latest .

Następnie odwołaj się do obrazu:

[Container]
Image=localhost/myapp:latest

Jeśli Twój przepływ pracy to “edytuj kod, przebuduj, restartuj stertę”, Compose wygrywa. Jeśli Twój przepływ pracy to “wdróż znany obraz jako usługę Linux”, Quadlet wygrywa.

Przenośność

Pliki Compose są szeroko udostępniane. Wiele projektów open-source dostarcza compose.yaml lub docker-compose.yml. Jeśli projekt mówi “uruchom to z Docker Compose”, zwykle możesz szybko zacząć z docker compose up -d. To jest główną praktyczną zaletą.

Quadlet jest przenośny między systemami mającymi Podman, systemd i zgodne wsparcie Quadlet. To jest węższy cel, ale bardzo dobry dla nowoczesnych serwerów Linux. Quadlet nie jest najlepszym formatem do udostępniania aplikacji każdemu możliwemu deweloperowi. To dobry format do opisywania, jak konkretny host Linux powinien uruchamiać usługa w kontenerze.

Doświadczenie dewelopera

Docker Compose zwykle wygrywa w doświadczeniu dewelopera. Więcej przykładów, więcej tutoriali, więcej szablonów projektów, łatwiejsze lokalne budowanie, łatwy jednoplutowy stert, znajome docker compose up i silne dopasowanie do zależności deweloperskich. Deweloper może to szybko odczytać:

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

Quadlet może robić podobne rzeczy, ale jest bardziej zorientowany na operacje. Dla lokalnego rozwoju, rzadko zacząłbym z Quadlet, chyba że sama aplikacja dotyczy konkretnie Podman lub systemd.

Doświadczenie operacyjne

Quadlet często wygrywa w doświadczeniu operacyjnym na hoście Linux. Powody:

  • Natywne systemctl
  • Natywne journalctl
  • Usługi użytkownika rootless
  • Zależności systemd
  • Timery systemd
  • Zachowanie restartu systemd
  • Brak centralnego demona Docker
  • Lepsze dopasowanie do zarządzania usługami hosta

Administrator serwera może rozumować:

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

To jest normalny przepływ pracy usługi Linux.

Model bezpieczeństwa

Uwagi dotyczące bezpieczeństwa Docker Compose

Docker Compose zwykle komunikuje się z demonem Docker. W normalnej instalacji Docker na Linux, dostęp do gniazda Docker jest potężny. Użytkownik, który może kontrolować Docker, często może montować ścieżki hosta, uruchamiać kontenery przywilejowe lub w inny sposób uzyskać szeroki kontrolę nad hostem. Dla opcji instalacji, w tym rootless Docker na Ubuntu, zobacz Instalacja Docker na Ubuntu.

Praktyczne porady:

  • Nie udostępniaj przypadkowo /var/run/docker.sock.
  • Traktuj grupę docker jako przywilejowaną.
  • Unikaj kontenerów przywilejowych.
  • Unikaj montowań hosta, chyba że są potrzebne.
  • Trzymaj sekrety poza Git.
  • Używaj jawnych tagów obrazów dla ważnych usług.
  • Przeglądaj opublikowane porty.

Uwagi dotyczące bezpieczeństwa Quadlet

Podman Quadlet dobrze komponuje się z kontenerami rootless i usługami systemd użytkownika. To może zmniejszyć ryzyko, szczególnie na współdzielonych hostach lub osobistych serwerach, gdzie usługi nie powinny wymagać demona root.

Praktyczne porady:

  • Wolij usługi rootless, gdy pasują.
  • Używaj jednostek użytkownika dla usług własnych użytkownika.
  • Używaj jednostek systemowych tylko wtedy, gdy są potrzebne uprawnienia na poziomie hosta.
  • Unikaj niepotrzebnych kontenerów przywilejowych.
  • Trzymaj pliki środowiskowe zamknięte.
  • Przemyśl ostrożnie montowania bind.

Rootless nie oznacza braku ryzyka. Oznacza to, że domyślny promień wybuchu może być mniejszy.

Wydajność

Dla większości usług webowych, narzędzi wewnętrznych i samodzielnie hostowanych aplikacji, wydajność nie jest czynnikiem decydującym. Główne różnice są operacyjne, a nie surowa szybkość. Wybieraj na podstawie modelu cyklu życia, modelu bezpieczeństwa, integracji z hostem, znajomości zespołu, procesu aktualizacji, potrzeb sieciowych i przepływu debugowania.

Jeśli wybierasz między Compose a Quadlet tylko ze względu na wydajność, prawdopodobnie optymalizujesz złą warstwę.

Tryby awarii

Tryby awarii Docker Compose

Powszechne problemy:

  • Demon Docker nie działa
  • Brakujące wtyczki Compose
  • Nieprawidłowy katalog projektu
  • .env nie załadowany zgodnie z oczekiwaniami
  • Stara binarna docker-compose użyta przypadkiem
  • Kontenery nie odtworzone po zmianach konfiguracji
  • Pozostawione kontenery sieroty po zmianie nazwy usługi
  • Woluminy usunięte z down -v
  • Logi Docker wypełniające dysk
  • Błędy uprawnień gniazda Docker

Najlepsze naprawy:

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

Tryby awarii Podman Quadlet

Powszechne problemy:

  • Plik jednostki w złym katalogu
  • Zapomniano systemctl daemon-reload
  • Używanie jednostek systemowych, gdy zamierzono jednostki użytkownika
  • Zapomniano loginctl enable-linger dla usług rootless
  • Pobranie obrazu trwa dłużej niż limit czasu startu systemd
  • cgroup v2 niedostępne
  • Etykiety SELinux lub uprawnienia woluminu
  • Nazwa usługi różni się od oczekiwań pliku
  • Jednostka sieci lub woluminu nie włączona lub odwołana poprawnie

Najlepsze naprawy:

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

Dla rootless:

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

Przykład migracji: Compose do Quadlet

Zacznij od tej usługi Compose:

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

Uruchom z Compose:

docker compose up -d

Przybliżony odpowiednik Quadlet:

[Unit]
Description=Whoami demo container
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

Zapisz jako /etc/containers/systemd/whoami.container, następnie:

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

Przykład jest prosty, ponieważ to jeden kontener. Większa sterta Compose z bazami danych, sieciami, woluminami i krokami budowania wymaga bardziej ostrożnego tłumaczenia.

Checklista migracji

Przed przeniesieniem z Compose do Quadlet, zapytaj:

[ ] Czy ta sterta to naprawdę zestaw długotrwałych usług hosta?
[ ] Czy obrazy są już zbudowane i opublikowane?
[ ] Czy potrzebujesz usług rootless?
[ ] Czy chcesz zależności systemd i timerów?
[ ] Czy woluminy i montowania bind są jasno zrozumiałe?
[ ] Czy porty są udokumentowane?
[ ] Czy sekrety są obsługiwane poza Git?
[ ] Czy istnieje proces backupu i przywracania?
[ ] Czy mogę monitorować logi przez journalctl?
[ ] Czy mam ścieżkę cofania?

Jeśli większość odpowiedzi to tak, Quadlet może być dobrym dopasowaniem. Jeśli sterta jest głównie do lokalnego rozwoju, Compose jest prawdopodobnie nadal lepszy.

Kiedy pozostać z Docker Compose

Pozostaw Compose, gdy:

  • Projekt już dostarcza dobry plik Compose.
  • Potrzebujesz najłatwiejszej ścieżki onboardingu.
  • Deweloperowie uruchamiają tę samą stertę lokalnie.
  • Budujesz obrazy podczas rozwoju.
  • Chcesz jeden plik YAML dla usług, woluminów i sieci.
  • Chcesz maksymalną kompatybilność z tutorialami i społecznością.
  • Twoje obecne opakowanie systemd działa dobrze.

Nie ma nagrody za migrację działającej sterty Compose do Quadlet tylko dlatego, że Quadlet jest teoretycznie czystszy. Jeśli Compose jest nudny i niezawodny dla Twojego przypadku użycia, trzymaj się go.

Kiedy przejść do Podman Quadlet

Przejdź do Quadlet, gdy:

  • Sterta to naprawdę usługa hosta.
  • Chcesz zarządzania usługami rootless.
  • Wolisz Podman przed Docker.
  • Chcesz, aby systemd posiadało cykl życia.
  • Chcesz logi journalctl.
  • Chcesz zależności usług.
  • Chcesz usługi użytkownika, które przetrwają wylogowanie.
  • Chcesz mniej ekspozycji demona Docker.
  • Budujesz host samodzielny hostowany wokół systemd.

Quadlet to nie jest “Compose, ale lepszy”. To jest inny ośrodek projektowy.

Zalecane wzorce

Wzorzec 1: Lokalny rozwój

Używaj Docker Compose. Szybki, znajomy, przenośny, łatwy do ponownego budowania, łatwy dla zespołów.

Wzorzec 2: Samodzielne hostowanie na jednym hoście

Używaj dowolnego. Wybierz Compose, jeśli projekt już dostarcza plik Compose. Wybierz Quadlet, jeśli chcesz natywne dla systemd zarządzanie usługami. Compose daje lepszy pakiet aplikacji; Quadlet daje lepszą usługę Linux.

Wzorzec 3: Usługa użytkownika rootless

Używaj Podman Quadlet. Przepływ pracy rootless, zarządzanie usługami na poziomie użytkownika, brak centralnego demona Docker.

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

Wzorzec 4: Serwer produkcyjny na jednym hoście

Używaj Docker Compose z dyscyplinowanym opakowaniem systemd, lub użyj Quadlet, jeśli Twój zespół jest komfortowy z Podman. Nie wybieraj na podstawie mody. Wybieraj na podstawie tego, kto będzie to operować o 2 rano.

Wzorzec 5: Platforma wielo-węzłowa

Nie używaj żadnego jako ostatejnej warstwy orkiestracji. Rozważ Kubernetes, Nomad, Swarm lub zarządzaną platformę. Compose i Quadlet to doskonałe narzędzia na jednym hoście. Nie są to harmonogramy klastra.

Praktyczny drzewo decyzyjne

Czy to głównie do lokalnego rozwoju?
  tak:
    użyj Docker Compose
  nie:
    kontynuuj

Czy projekt już dostarcza utrzymywany compose.yaml?
  tak:
    użyj Docker Compose, chyba że masz silny powód do migracji
  nie:
    kontynuuj

Czy chcesz długotrwałe usługi rootless zarządzane przez systemd?
  tak:
    użyj Podman Quadlet
  nie:
    kontynuuj

Czy chcesz najłatwiejszą definicję aplikacji wielo-kontenerowej?
  tak:
    użyj Docker Compose
  nie:
    kontynuuj

Czy chcesz, aby kontenery zachowywały się jak normalne usługi Linux?
  tak:
    użyj Podman Quadlet
  nie:
    użyj Docker Compose

Polecenia obok siebie

Zadanie Docker Compose Podman Quadlet
Start docker compose up -d systemctl start app.service
Stop docker compose down systemctl stop app.service
Restart docker compose restart systemctl restart app.service
Zastosuj zmiany docker compose up -d systemctl daemon-reload && systemctl restart app.service
Logi docker compose logs -f journalctl -u app.service -f
Status docker compose ps systemctl status app.service
Włącz przy starcie Opakowanie systemd lub polityka restartu systemctl enable app.service
Pull aktualizacji docker compose pull podman pull image
Usługa rootless możliwa naturalna z systemctl --user

Powszechne nieporozumienia

“Quadlet zastępuje Docker Compose”

Nie do końca. Quadlet zastępuje niektóre przypadki użycia Compose, szczególnie długotrwałe usługi Linux. Nie zastępuje Compose jako najłatwiejszego formatu stosu aplikacji dla deweloperów.

“Docker Compose nie jest gotowy do produkcji”

Za szerokie. Compose może być całkowicie rozsądny dla małych systemów produkcyjnych, jeśli rozumiesz backupy, aktualizacje, logowanie, zachowanie restartu i bezpieczeństwo hosta. Problemem nie jest Compose. Problemem jest udawanie, że wdrożenie Compose na jednym hoście ma te same właściwości co orkiestrator klastra.

“Podman to tylko Docker bez demona”

Za proste. Podman ma polecenia kompatybilne z Docker, ale jego ośrodek projektowy jest inny: działanie bez demona, przepływy rootless, podsy i integracja z Linux.

“Rootless oznacza bezpieczne”

Nie. Rootless redukuje niektóre ryzyka. Nie sprawia, że złe obrazy, wystawione sekrety, niebezpieczne montowania bind lub podatne aplikacje stają się bezpieczne.

“systemd jest zbyt ciężki dla kontenerów”

systemd to już menadżer usług na większości głównych serwerów Linux. Używanie go do zarządzania długotrwałymi kontenerami nie jest dziwne. To często nudna i poprawna rzecz do zrobienia.

Ostateczna rekomendacja

Używaj Docker Compose, gdy sterta aplikacji jest główną rzeczą. Używaj Podman Quadlet, gdy usługa Linux jest główną rzeczą.

Ta różnica jest bardziej użyteczna niż argumentowanie, które narzędzie jest lepsze. Dla przepływów deweloperskich, Compose jest trudny do pobicia. Jest popularny, czytelny, przenośny i wspierany przez niezliczone projekty. Dla długotrwałych usług Linux, Quadlet jest cicho doskonały. Sprawia, że kontenery czują się jak natywne usługi systemd, działa naturalnie z rootless Podman i pasuje do modelu operacyjnego poważnego hosta Linux.

Preferowany podział:

Lokalny rozwój: Docker Compose
Przenośne przykłady aplikacji: Docker Compose
Małe samodzielne sterty: Docker Compose lub Quadlet
Usługi użytkownika rootless: Podman Quadlet
Długotrwałe usługi hosta: Podman Quadlet
Orkiestracja wielo-węzłowa: żaden; użyj prawdziwego orkiestratora

Nie migruj tylko po to, by być nowoczesnym. Migruj, gdy model cyklu życia jest lepszy. Compose to świetne narzędzie do stert. Quadlet to świetne narzędzie do usług. Mądry wybór to używanie każdego tam, gdzie jego model mentalny pasuje do zadania.

Referencje

Subskrybuj

Otrzymuj nowe wpisy o systemach, infrastrukturze i inżynierii AI.