Podman Quadlet vs. Docker Compose w usługach Linuksa
Wybierz odpowiedni przepływ pracy dla kontenerów.
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.

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.yamldo 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:
- Backup.
- Pull.
- Ponowne utworzenie lub restart.
- Sprawdzenie zdrowia.
- 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ę
dockerjako 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
.envnie załadowany zgodnie z oczekiwaniami- Stara binarna
docker-composeuż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-lingerdla 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
- Podman Quadlet Documentation — oficjalne odniesienie Podman Quadlet
- Docker Compose Documentation — oficjalne odniesienie Docker Compose
- Run Docker Compose as a Linux Service with systemd — szczegółowy przewodnik Compose-jako-systemd na tej stronie
- Docker Compose Cheatsheet — odniesienie do poleceń i wzorców Compose
- Docker Cheatsheet — odniesienie do poleceń Docker
- Install Docker on Ubuntu — przewodnik instalacji Docker z alternatywami rootless
- Run any Executable as a Service in Linux — ogólne wzorce usług systemd
- Developer Tools: The Complete Guide to Modern Development Workflows — domowa sterta