- Podman daemon’sız olduğu için, sunucu açıldıktan sonra konteynerleri güvenilir biçimde ayağa kaldıracak bir yürütücüye ihtiyaç duyar; Quadlet bunu systemd servis dosyası yaklaşımıyla çözer
- Mevcut
podman generate systemdyönteminde konteyner oluşturma ile servis dosyası üretimini ayrı ayrı ele almak gerekiyordu; üretilen dosyayı her değiştirmede elle düzenleme yükü oluşuyordu - Quadlet,
~/.config/containers/systemdaltındaki.containerdosyasında[Container],[Service],[Install]ayarlarını birlikte tutarak Podman seçeneklerini ve systemd davranışını tek yerden yönetir - Rootless Podman’da açılışta otomatik başlatma için
WantedBy=default.targetve linger’ın etkinleştirilmesi gerekir;multi-user.targetkullanıcı modunda tanımlı değildir AutoUpdate=registry, systemd bağımlılıkları, dizinlere göre dosya gruplama vepodletdönüştürme aracı da kullanıldığında Quadlet, rootless·daemonless Podman işletimine iyi uyar
Quadlet neden gerekli?
- Quadlet, Podman konteynerlerini systemd servisi gibi çalıştırmayı sağlayan bir yöntemdir
- Konteynerleri arka planda çalıştırabilir
- Sunucu yeniden başlatıldıktan sonra konteynerleri otomatik başlatabilir
- Podman konteynerlerini systemd altında çalıştırma yaklaşımı yeni değildir
- Daha önce
podman generate systemdkomutu kullanılıyordu - Bu komut artık Quadlet’e geçilmesini öneren bir kullanımdan kaldırma uyarısı gösteriyor
- Daha önce
- Podman daemonless bir yapıya sahip olduğundan, daemon olmadan konteynerleri başlatacak bir yürütücüye ihtiyaç duyar
Mevcut podman generate systemd yönteminin zahmetleri
- Eski yöntemde önce
podman createile konteyner oluşturmak gerekiyordu- Örnek konteyner
docker.io/library/postgres:16imajını kullanır -p 5432:5432, volume mount,POSTGRES_PASSWORDortam değişkeni veio.containers.autoupdate=registrylabel’ını içerir
- Örnek konteyner
- Ardından
podman generate systemd test-db -fn --newçalıştırılarakcontainer-test-db.servicedosyası oluşturuluyordu - Oluşturulan servis dosyası
~/.config/systemd/useriçine yerleştirilip aşağıdaki komutla etkinleştiriliyor ve başlatılıyordusystemctl --user enable --now container-test-db
- Bu akış; konteyner oluşturma, servis dosyası üretme, gerekirse dosyayı taşıma ve servisi etkinleştirme adımlarını tekrar ettirir
- Konteyner oluşturma komutu uzadıkça, daha sonra yeniden çalıştırmak için ayrıca bir shell script yönetmek gerekiyordu
- Oluşturulan systemd servis dosyasını özelleştirmek için her seferinde yeniden elle düzenleme yapmak gerekiyordu
Quadlet dosya yapısı
- Quadlet yaklaşımında
~/.config/containers/systemddizini oluşturulur ve içine.containerdosyası konur - Örnek
test-db.containerdosyası şu öğeleri içerir[Container]Image=docker.io/library/postgres:16AutoUpdate=registryPublishPort=5432:5432Volume=%h/volumes/test-db:/var/lib/postgresql/data:ZEnvironment=POSTGRES_PASSWORD=CHANGE_ME
[Service]Restart=always
[Install]WantedBy=default.target
.containerdosyası normal bir systemd servis dosyasıdır, ancak özel bir[Container]bölümü içerir[Container]içindeki birçok seçenek,podman createile kullanılan komut satırı seçeneklerine karşılık gelirImage: kullanılacak imaj ve tagAutoUpdate=registry:--label "io.containers.autoupdate=registry"karşılığıdırPublishPort:-pkarşılığıdırVolume:-vkarşılığıdırEnvironment:-ekarşılığıdır
- Kullanıcı home dizini için
~yerine systemd belirteci olan%hkullanılmalıdır [Service]içindekiRestart=always, elle durdurulmadığı sürece konteynerin her zaman yeniden başlatılmasını sağlar[Install]içindekiWantedBy=default.target, konteynerin açılışta otomatik başlatılmasını sağlar
Rootless Podman’da gerekli systemd ayarları
- Rootless konteynerlerde
multi-user.targetdeğildefault.targetkullanılmalıdırmulti-user.target, systemd kullanıcı modunda tanımlı değildirsystemctl --user status multi-user.targetile kontrol edilebilir- Sistem modunda
systemctl status multi-user.targetile kontrol edilebilir
- Konteynerler systemd kullanıcı servisi olarak çalıştığından, kullanıcı oturum açmasa da konteynerlerin başlaması isteniyorsa linger etkinleştirilmelidir
loginctl enable-linger
- Sunucu yeniden başlatıldıktan sonra otomatik başlatma gerekiyorsa linger’ın etkinleştirilmesi şarttır
- systemd’nin yeni servis dosyasını keşfetmesi için aşağıdaki komut çalıştırılır
systemctl --user daemon-reload
- Konteyner başlatma ve durum kontrolü hem systemd hem de Podman tarafından yapılabilir
systemctl --user start test-dbsystemctl --user status test-dbpodman ps
- Varsayılan konteyner adı, servis dosyası adının başına
systemd-eklenmiş halidirtest-db.containeriçin varsayılan konteyner adısystemd-test-dbolur- Bu, çakışmaları önlemeye yönelik bir adlandırma kuralıdır
[Container]bölümündekiContainerNameseçeneğiyle doğrudan belirtilebilir
Quadlet’in operasyonel avantajları
- Quadlet, konteyner servis ayarlarını tek dosyada yönetmeyi sağlar
- Eski yöntemdeki gibi servis dosyasını üreten script ile üretilmiş servis dosyasını ayrı ayrı yönetmek gerekmez
- systemd’nin
[Unit]ve[Service]bölümlerinde kullanılabilen seçenekler kullanılabilir- Örneğin konteyner başlamadan önce çalıştırılacak komut
StartExecPreile belirtilebilir - Üretilmiş dosyayı sonradan elle düzeltme süreci azalır
- Örneğin konteyner başlamadan önce çalıştırılacak komut
- Shell script yazıp debug etmek yerine, konteynerleri yapılandırma dosyası merkezli işletebilirsiniz
- Konteynerler arası bağımlılıkları systemd yöntemiyle ifade etmek kolaydır
Konteynerler arası bağımlılıkları ifade etme
- Bir uygulama konteyneri veritabanı konteynerine bağımlıysa, ilişki systemd’nin
[Unit]bölümüyle belirtilebilir - OxiTraffic konteyneri,
test-dbkonteynerine bağımlı bir örnektir[Unit]içindeRequires=test-db.serviceayarlanarak uygulamanın yalnızca veritabanı başladığında başlaması sağlanır- İki konteynerin paralel başlamaması için
After=test-db.serviceayarlanır
- Referans verirken
.containerdosya adı değil servis adı kullanılırtest-db.container: dosya adıtest-db.service: servis adısystemd-test-db: varsayılan konteyner adı
- Uygulamanın veritabanıyla iletişim kurabilmesi için iki konteynerin de
[Container]bölümüneNetworkseçeneği eklenmelidir; ancak burada ağ yapılandırması ele alınmıyor
Birden fazla dosya ve gruplama
- Quadlet, her konteyner için ayrı bir
.containerdosyası kullanılacak şekilde yapılandırılabilir - Çok konteynerli bir uygulamada her şeyi tek bir Docker Compose dosyasına koymaya kıyasla, konteyner bazlı dosyalar bilişsel yükü azaltabilir
- Docker Compose dosyası yüzlerce satır ve onlarca konteyner içerdiğinde bakımı zorlaşabilir
- Mailcow’un Docker Compose dosyası, büyük Compose dosyalarına bir örnektir
- Docker Compose da dosyaları birden fazla parçaya bölmeyi destekler
- Quadlet,
~/.config/containers/systemdaltındaki dizinlere unit dosyaları koyabilir- Örnekte
oxitrafficdizini oluşturulup uygulama ve veritabanı dosyaları birlikte konabilir
- Örnekte
İmaj güncellemeleri
AutoUpdate=registryayarlanırsapodman auto-updateile imaj güncellemeleri kontrol edilebilir- Registry’de kullanılan tag ile uyumlu yeni bir imaj varsa Podman imajı pull eder ve konteyneri yeniden başlatır
- Docker’da bu amaç için Watchtower gibi araçlar gerekebilir; Podman ise bu özelliği yerleşik olarak sunar
latestgibi tag’ler riskli olabilir- OxiTraffic’te
latest, sonraki sürümdeki breaking change’leri içerebilir - PostgreSQL’de
latestkullanılırsa yeni major sürüme geçilebilir ve PostgreSQL major yükseltmelerinde her zaman elle migration gerekir
- OxiTraffic’te
- Üretim ortamında breaking change’e yol açmayacak tag’ler kullanılmalıdır
podman auto-updatebirkaç günde bir elle çalıştırılıp nelerin güncellendiğini görmek ve ardından konteynerlerin normal çalıştığını kontrol etmek de mümkündür
podman-compose ve migration araçları
podman-compose, Compose dosyalarını Podman ile çalıştıran bir Python script’idir- Uzun vadeli bir Docker Compose alternatifi olarak görülmesinin zor olmasının nedenleri şunlardır
- Compose spesifikasyonu ile Podman·systemd arasında bir çeviri katmanıdır ve systemd’nin tüm özelliklerini kullanmanızı sağlamaz
- Resmî Podman projesi Rust veya Go gibi derlenen dillerle yazılır
- Son commit 5 ay önce olduğu için aktif biçimde bakımı yapılmıyor
- Quadlet, Podman’ın rootless·daemonless tasarımıyla daha iyi örtüşür
- Compose dosyasından Quadlet’i denemek için podlet kullanılabilir
- Podman komutlarından veya Docker Compose dosyalarından Quadlet dosyaları oluşturabilen bir Rust aracıdır
Daha fazla okuma
- Quadlet’i daha derinlemesine anlamak için
podman-systemd.unitman page’i faydalıdır - Quadlet yalnızca konteynerleri değil pod, network ve volume’leri de yönetebilir
- systemd unit dosyası yazmaya aşina değilseniz
systemd.unitvesystemd.serviceman page’lerine bakabilirsiniz - Başka bir bakış açısı ve ikinci bir örnek için blog.while-true-do’daki benzer yazıya bakabilirsiniz
1 yorum
Hacker News yorumları
Quadlet, Podman’dan çıkan en iyi şeylerden biri sayılır; Podman’ı merak edenlere ya da konteyner tabanlı iş yüklerine geçmeyi düşünenlere şiddetle tavsiye ederim
Konteynerleri sıradan sistem servisleri gibi araya yerleştirip yönetebilirsiniz; birlikte çalıştırmak için ayrı bir orkestrasyon katmanı öğrenmeniz ya da konteyner dışı kaynaklara bağımlı olmanız gerekmez
Zaten yazdığınız systemd unit’lerini olduğu gibi yazarsınız; otomatik güncellemeler ya da hata durumunda servisi yeniden başlatma/bildirim gibi şeyler de bonus
Docker ile benzerini yapmaya çalıştığınız yaklaşım, dev bir
runkomutuyla Docker daemon’ını dolanırken çoğu zaman geride hayalet servisler ve konteynerler bırakıyordu; Quadlet çok daha temiz ve yapılandırma da/etc/systemd/,.config/systemd,/usr/local/lib/systemdgibi systemd unit konumlarında durduğu için yedeklemesi kolayAncak yerel geliştirmede docker-compose’un karşılığı değil; Podman ekibi de o alana pek ilgi duymuyor gibi
Kullanıcı konteynerleri, arka planda çalışan veritabanları gibi uzun süreli yerel test altyapısı için iyi; ama tipik derleme →
docker compose up→ test →docker compose downdöngüsü için fazla zahmetliPratik cevap ya
.kubeQuadlet (Kubernetes play) ya da Podman soketine karşıdocker composekullanmakAylardır boş zamanlarımda Quadlet yöneten bir GitOps aracı yapacak kadar hoşuma gitti; konteynerleştirilmiş sunucuları yönetmenin doğru yolu gibi hissettiriyor
[0]’ın podman-compose olmadığı nokta önemli. Yazıda da podman-compose’un pek iyi olmadığı ve geliştirme açısından eksik kaldığı belirtilmişti. Podman, compose spesifikasyonunun çoğunu uyguladığı için çoğu durumdadocker composekullanabilirsinizRH ilk Podman’ı öne çıkarmaya başladığında deneyenlerin, Podman 3’ün muğlaklığı ve podman-compose’un kötü deneyimi yüzünden uzaklaşmış olması çok olası
Çeşitli flag’leri değiştirmek, sürüm yükseltmek ve podlet’in kendisinin başka bir araca geçmeyi önermesi derken iş bitmeyen bir tavşan deliğine dönüştü
Sonunda benim systemd’m sadece
podman compose upçalıştırıyorCompose’un kendi işini yapmasına izin vermekle karşılaştırınca Quadlet’in avantajı ne, merak ediyorum
Bu arada Podman benim kullanıcım olarak çalışıyor ve hiç daemon yok
docker-composekullanmakpodman composekalıyorYakın zamanda Quadlet’i keşfettim ve tüm homelab’imi atomic OS ve rootless Quadlet üzerine kurdum; kesinlikle tavsiye ederim
systemd soket aktivasyonu da mümkün; örneğin systemd http/https soketleri oluşturup,
ssh.socketvepodman.socketın sırasıylasshd.service,podman.serviceı etkinleştirmesi gibi Traefik’i otomatik etkinleştirebilirsinizRootless kurulumda kaynak IP’yi korumanın fiilen tek yolu olduğu için adeta hayat kurtarıcı. Rootless Podman/Docker normalde kaynak IP korumaya büyük dezavantajlar olmadan kolayca izin vermez
https://github.com/savely-krasovsky/homelab
Quadlet, “üretime benzer bir ortamda birbirine bağımlı konteynerlerin hepsini çalıştırma” şeklindeki docker compose kullanımı için iyi bir alternatif
Ancak docker compose’un bir diğer kullanım alanı olan geliştirme tarafında daha iyi olmasını isterdim
docker compose ile veritabanı, Redis, OpenSearch, diğer bağımlılıklar, nginx proxy’si ve
.:/appyolunu volume olarak mount eden geliştirme konteynerini birlikte ayağa kaldırıp birlikte kaldırabiliyor,docker-compose.ymldosyasını depoya koyabiliyorsunuzQuadlet ise tüm dosyaları
~/.config/containers/systemdaltına koymanızı söylediği için artık projeye izole olmuyor; diğer geliştiricilerle check-in edip paylaşmak da pek rahat değil. Üstelik onların da Podman kullanması gerekiyorÇoğunluk hâlâ Docker kullanıyor, Codespaces gibi barındırılan geliştirme ortamlarında da Docker sağlanıyor
Bu yüzden check-in edilmiş YAML dosyasıyla docker compose kullanıyorum. Ben Podman kullandığım için tüm volume’lara elle
:Zeklemem gerekiyor, ama normal Docker bunu işleyemiyorGeliştirme için bir docker compose alternatifi olsa güzel olurdu ama Quadlet pek uygun görünmüyor
podman-compose --in-pod=1 systemd -a create-unitkullanırsanızpodman-compose@servisini oluşturabilir, ardındanpodman-compose systemd -a registerilecompose.ymldosyasını$nameile birlikte kaydedebilirsinizBöylece compose dosyası tabanlı pod’u
podman-compose@$name.serviceile yönetebilirsiniz; tamamen rootless olarak da çalışırsystemd-run, rastgele bir komuta dayalı geçici systemd servisi çalıştırmanızı sağlarGerekirse timer dâhil, systemd kapsam kurallarına uyan temiz bir geçici unit oluşturur
[1] https://www.freedesktop.org/software/systemd/man/systemd-run...
Kubernetes’e benzer bir formatta, konteyner build etme gibi birkaç kolaylık özelliği eklenmiş
kube play dosyasını proje köküne koyup
podman kube play project.yaml --buildçalıştırırsanız pod, volume vb. birlikte çalışırQuadlet dosyaları dağıtım aşamasında kullanışlıdır. Projeyi bir VPS’e koymak istiyorsanız, elinizdeki
project.yamlile birlikte Kube Quadlet[2] kullanabilirsiniz[1] https://docs.podman.io/en/latest/markdown/podman-kube-play.1...
[2] https://docs.podman.io/en/latest/markdown/podman-systemd.uni...
docker-compose.ymlkullanılıyor, o yüzden acıyı anlıyorumGenel olarak gayet iyi çalışıyor ama OSX’te o lanet ara VM yüzünden bazen garip davranabiliyor
Ara sıra Podman uyumluluğunu kontrol ediyorum, ama artık rootless felsefesinin çok farklı olduğunu ve tam uyumluluğun imkânsız olduğunu kabullendim
Yine de bu araç production için harika. Birkaç hobi projemi bare-metal node’da elle yazılmış systemd servisleriyle çalıştırıyorum; şu anda kullanıcı modunda containerd kullanıyorlar
Vakit bulursam taşımayı deneyebilirim
Bu yazının Podman-Compose için “aktif olarak bakımı yapılmıyor” deyip son commit’in 5 ay önce olduğunu belirtmesi, ardından hemen alternatif olarak son commit’i yine 5 ay önce olan Podlet’i önermesi ilginç
Podlet faydalı olabilir ama Docker Compose’un birçok özelliğini desteklemiyor ve her zaman temiz bir dönüşüm de yapmıyor
Özellikle
-f docker-compose.yml -f docker-compose.override.ymlgibi birden fazla YAML dosyasını üst üste bindirme özelliğini desteklemiyorcompose CLI soket üzerinden motoru kontrol ediyor gibi görünüyor; Podman ile Docker engine neredeyse aynı API’ye sahip
podman-compose beklendiği gibi çalışmadığı için bu yöntemi kullanıyorum
Docker-compose normalde docker istemci eklentisi olarak kuruluyor, ama ben Podman ile kullanmak için bağımsız bir uygulama olarak kullanıyorum
Ayrıca entegrasyon ayarlarında
DOCKER_HOSTortam değişkeni yerine dockercontextskullanmayı tercih ediyorumSadece Quadlet yeterince güçlü değilse Quadlet[3] ve normal Podman[4] da sınırlı Kubernetes manifest’lerini çalıştırmayı destekliyor
compose dosyasındaki
restartseçeneğini Podman’ın nasıl ele aldığını henüz çözemedim. Çünkü Podman’da bir denetleyici daemon yokÖte yandan
healthcheckseçeneğinin systemd timer’larına dayandığını biliyorumsystemd olmayan bir dağıtım olan Gentoo’da Podman kullanırken otomatik healthcheck çalışmadı, ama healthcheck’i elle çalıştırınca ayarların geri kalanı sonuna kadar ilerledi
[1] https://github.com/docker/compose
[2] https://docs.podman.io/en/latest/markdown/podman-system-serv...
[3] https://docs.podman.io/en/latest/markdown/podman-systemd.uni...
[4] https://docs.podman.io/en/latest/markdown/podman-kube-play.1...
Podlet yardımcı bir araç ve uzun vadede Quadlet ile çalışmak daha iyi
5 ay, bakım yapılmıyor demek değildir; bunun için yaklaşık 2 yıl gerekir
Yine de endişeyi artırır. Ancak 5 ay kesinlikle bakımın sürdüğüne dair kanıt değildir
Bakımı yapılmayan depoların da güncellenmesi için pek çok neden olabilir; bunu engelleyen tek şey GitHub’ın son dönemde pek iyi olmayan arşivleme özelliği
Birkaç yıl önce self-hosting kurulumumu sıfırlarken farklı bir şey denemek istediğim için openSUSE MicroOS seçtim ve sonunda Podman konteynerlerini systemd/Quadlet altında çalıştırmaya başladım; mevcut kurulumdan oldukça memnunum
Konteynerler Podman’ın yerleşik araçlarıyla otomatik güncelleniyor, log kontrolü ve izleme işlerini de her zamanki systemd araçlarıyla yapıyorum
Bir şeyi değiştirmem gerektiğinde yapılandırma dosyalarının yerini unutmuş olsam bile bulması kolay, okuyup değiştirmesi de kolay
Rootless ve daemonless olması da güzel
Arada birkaç şey denedim ama podman compose hantal hissettirdi; deprecated olmasına sevindim ve gidilecek yolun Quadlet olduğu açık
Bir öğrenme eğrisi olduğunu ve Docker’a göre daha az kaynak bulunduğunu hesaba katmak gerekiyor
Yerel geliştirmede birden fazla servis yığınını ayağa kaldırıp indirmek için hâlâ Docker ve docker compose tarafını seçerdim
Ayarları oturtmak biraz zaman aldı ama neredeyse hiç bakım gerektirmemesinden çok etkilendim. Şimdiye kadar hiç gerekmedi
Benzer bir şey yapmak isteyenler yapılandırmama bakabilir
https://github.com/jeppester/coreos-nextcloud
Tüm node’ları yavaş yavaş MicroOS’a taşıyorum ve şirkette de MicroOS’u ya da benzer bir şeyi öne çıkarıyoruz
Temel OS’in otomatik rollback’i ile bildirime dayalı konteyner yapılandırması ve otomatik güncellemeler birleşimi birbirine tam oturuyor gibi
Biçim,
podman generate systemdya da Kubernetes YAML’dan daha anlaşılır ve systemd entegrasyonu da harikaCan sıkıcı nokta, Podman upstream’in Debian/Ubuntu için depo sunmaması
Debian stable’da 4.3.1’e takılı kaldım ve birçok yeni özelliği kaçırdım; sonunda Docker compose’a dönmeye karar verdim
Önerilen geçici çözümler Podman’ı kendiniz derlemek ya da
debian/testingkullanmaktıBu yeni yaklaşımın insanların Docker’dan Podman’a geçmesine gerçekten yardımcı olmasını umuyorum
Docker-Compose, birçok kişinin geçişte tereddüt etmesinin nedeni; bende de öyleydi
Kabul etmek gerekirse Quadlet’ten önce Podman’ın düzgün bir yanıtı yoktu
Docker-Compose yüzünden Docker’dan ayrılmakta tereddüt ettiyseniz, Quadlet ile birlikte Podman çok daha denk bir alternatif
Sandığınız kadar Docker’ı özlemeyeceksiniz; ayrıca rootless container çalıştırarak güvenlik iyileştirmesi de elde edebilirsiniz
Her şeyi
~/.config/quadlet/systemdiçine koyma yaklaşımı olmazGeliştirme ve test için bu şart; şu anda Quadlet kesinlikle bir dağıtım çözümü
Quadlet’i gerçekten seviyorum; container’ları sıradan sistem servisleri gibi kullanmayı sağlıyor
Ancak rootless container kullanıcı deneyimi bu kavramsallaştırmaya pek uymuyor
Normalde sistem servisleri systemd’nin sistem oturumunda, sistem kullanıcısı olarak çalışır; rootless container servisleri ise sistem kullanıcısının kullanıcı systemd oturumunda bulunur
Rootless Quadlet’i sistem oturumu içinde çalıştırabilmek güzel olurdu
user-lingerı açıp kullanıcı systemd’si üzerinden rootless çalıştırmaktan pratikte bir farkı olup olmadığını merak ediyorumBen hep böyle yaptım
Ayrıca
DynamicUser=seçeneğiyle rootless Quadlet çalıştırabilmek de güzel olurduDynamicUser=sistem servislerinin yetkilerini kısıtlamak için harika bir yöntemdi, ama şu anda Podman ile pek iyi uyuşmuyorHacker News’in ön sayfasında Quadlet’i görmek ilginç. Yeterince ilgi görmediğini düşünüyorum
Projeden Ygal ve Valentin, inlets tünel istemcisini çalıştırma yöntemi hakkında daha önce konuk yazı göndermişti. Ngrok/Cloudflared benzeri, ama SaaS kısıtlamaları olmadan self-host edilen bir yaklaşım
https://inlets.dev/blog/2023/10/03/client-quadlet.html
[container]yerine[kube]kullanarak standart Kubernetes YAML’ını kullanabildiler; bu da onu epey taşınabilir hale getiriyorİlgilenenler için, yakın zamanda Quadlet dağıtımının ne kadar kolay olduğunu gösteren bir Ansible şablonu hazırladım
GH: https://github.com/Mati365/hetzner-podman-bunjs-deploy
site.example.orgyerineexample.site.orgkullanıyorhttps://en.wikipedia.org/wiki/Example.com