Ana içeriğe geç

Podman Compose: Docker Compose’a Köksüz Bir Alternatif

Podman Compose, Docker Compose dosyalarını okuyan ve Podman’ın köksüz, daemon’suz mimarisini kullanarak güvenlik odaklı geliştirme ortamları için çoklu konteynerli uygulamalar çalıştıran Python tabanlı bir araçtır.
· 12 dk. oku

Yapay Zeka ile Keşfedin

Diyelim ki aylarca sorunsuz çalışan bir docker-compose.yml dosyanız var. Ama artık Docker yerine Podman kullanmanız gerekiyor ve dosyayı düzenlemeniz mi yoksa baştan mı başlamanız gerektiğinden emin değilsiniz. Yerel geliştirme ortamınız bu Compose dosyasına bağlı ve tüm kurulumu yeniden inşa etmeye vaktiniz pek yok.

Güzel haber şu ki Podman Compose, mevcut Compose dosyalarını Docker yerine Podman ile çalıştırmanıza izin verir. Compose tanımlarınızı Podman komutlarına çeviren, Python tabanlı bir uyumluluk katmanıdır; böylece alışkın olduğunuz çoklu konteyner iş akışını kullanmaya devam edebilirsiniz.

Bu yazıda, Podman Compose’un ne olduğunu, nasıl kurulduğunu ve onunla ilk çoklu konteynerli uygulamanızı nasıl çalıştıracağınızı göstereceğim. Bu yazıdaki bazı kavramlara yeniyseniz, temelleri kavramak için Containerization and Virtualization Concepts kursumuza kaydolun.

Podman Compose Nedir?

Podman Compose, docker-compose.yml dosyalarınızı okuyan ve bunları Podman komutlarına çeviren Python tabanlı bir araçtır.

Yine standart bir Docker Compose dosyası yazarsınız; servisler, ağlar ve volumelar ile. Podman Compose bu dosyayı ayrıştırır ve konteynerlerinizi başlatmak için eşdeğer podman komutlarını çalıştırır. Yani Compose sözdizimini manuel olarak Podman CLI komutlarına dönüştürmek zorunda kalmazsınız; bu çeviri işini sizin için yapar.

Şunu belirtmek önemli: Podman Compose, Docker Compose için birebir bir ikame değil.

Bu bir uyumluluk katmanıdır. Bazı Docker Compose özellikleri kutudan çıkar çalışır, bazıları ayarlama ister, birkaçı ise hiç çalışmaz. Araç uyumluluğa odaklanır, ancak Docker Compose’un tüm davranışlarını bire bir kopyalamaz.

Bunu başka bir açıdan düşünelim: Docker Compose, doğrudan Docker daemon’ı ile konuşur. Podman Compose ise Podman CLI’ı ile konuşur; CLI da daemonsuz bir şekilde konteynerleri yönetir. Sonuç benzer görünse de, alttaki mekanikler farklıdır.

Bu da mevcut Compose dosyalarınızın büyük bölümünü yeniden kullanabileceğiniz, ancak farklılıkların nerede ortaya çıktığını anlamanız gerektiği anlamına gelir.

Neden Podman Compose Kullanılır?

Podman Compose, Docker kurmadan çoklu konteynerli uygulamalar çalıştırmanıza olanak tanır.

Docker ile karşılaştırıldığında, varsayılan olarak köksüz konteynerler elde edersiniz. Podman, kök yetkileri gerektirmeden konteyner çalıştırır. Basit bir ifadeyle, bir konteyner tehlikeye girerse risk daha azdır. Docker, üstünde köksüz konteynerler çalıştırsanız bile daemon’ın kök yetkileriyle çalışmasını gerektirir.

Bu, Podman Compose’u güvenliğe odaklı ortamlar için daha uygun kılar. Sıkı önlemlerle kilitlenmiş Linux sunucularında çalışıyorsanız ya da kök düzeyinde bir daemon çalıştırmanın izinli olmadığı ortamlarda bulunuyorsanız, Podman Compose ihtiyaç duyduğunuz çoklu konteyner iş akışını sağlar.

Geliştirme ve test için de kullanışlıdır. Yerel ortamları hızlıca ayağa kaldırabilir, konteyner yapılandırmalarını test edebilir ve Compose dosyalarınızı Docker kurmadan doğrulayabilirsiniz. Tam orkestrasyona ihtiyacınız olmadığı hafif kurulumlar için idealdir.

Ancak Podman Compose her durum için ideal değildir.

Ölçekte üretim işyükleri çalıştırıyorsanız, bunun yerine Kubernetes veya Docker Swarm isteyeceksiniz. Podman Compose’un macOS ve Windows’ta Linux’a kıyasla desteği daha zayıftır; çapraz platform geliştirme deneyiminiz o kadar akıcı olmaz. Ayrıca ekibiniz Docker ekosistemine özel eklentiler ve araçlar ile zaten yatırım yapmışsa, Podman Compose’a geçmek bu iş akışının bazı parçalarını yeniden inşa etmek anlamına gelir.

Özetle, köksüz konteynerlere, güvenlik öncelikli ortamlara veya Docker’sız bir geliştirme kurulumuna ihtiyaç duyduğunuzda Podman Compose’u kullanın.

Podman Compose’un Kurulumu

Podman Compose, Podman’ın yerel olarak çalıştığı Linux’ta en iyi çalışır.

macOS ve Windows’a da kurabilirsiniz, ancak önce Podman’ı bir sanal makine içinde çalıştırmanız gerekir. Bu, karışıklık katar ve Linux deneyimi kadar akıcı değildir. macOS veya Windows’ta ekstra kurulum adımları ve olası ağ tuhaflıkları bekleyin.

Linux’ta kurulum

Podman Compose’u kurmanın en kolay yolu pip üzerindendir.

pip install podman-compose

Linux’ta Podman Compose kurulumu

Linux’ta Podman Compose kurulumu

Bu işlem, PyPI’den en güncel sürümü kurar. Python sürüm yönetimiyle uğraşmanıza gerek yok — Python 3 kuruluysa hazırsınız.

Bazı Linux dağıtımları Podman Compose’u kendi depolarında da sağlar. Fedora, RHEL ve CentOS’ta şunu kullanabilirsiniz:

sudo dnf install podman-compose

Ubuntu ve Debian tabanlı sistemlerde şu komutu çalıştırın:

sudo apt install podman-compose

Paket yöneticisi sürümleri genellikle PyPI’nin gerisinde kalır; bu nedenle en yeni özellikleri hemen alamayabilirsiniz.

macOS ve Windows’ta kurulum

macOS ve Windows’ta önce Podman Desktop’ı kurmanız veya bir Linux VM oluşturmak için podman machine kullanmanız gerekir. Bu çalışır duruma geldikten sonra, Podman Compose’u bu ortam içinde pip ile kurun.

Yani ilk adım makineye bağlanmaktır:

podman machine ssh

Podman VM’e SSH ile bağlanma

Podman VM’e SSH ile bağlanma

VM Fedora tabanlı olduğu için, Podman Compose’u kurmak için şu komutu çalıştırabilirsiniz:

sudo dnf install podman-compose

Podman Compose kurulumu

Podman Compose kurulumu

Bu iki aşamalı süreç, Podman Compose’u doğrudan ana işletim sisteminizde değil, Podman’ın oluşturduğu Linux VM içinde çalıştırdığınız anlamına gelir.

Kurulumu doğrulama

Podman Compose’un doğru kurulduğunu kontrol etmek için bu komutu çalıştırın:

podman-compose --version

Podman Compose kurulumunu doğrulama

Podman Compose kurulumunu doğrulama

Terminalde sürüm numarasını görmelisiniz. "command not found" hatası alırsanız, Python bin dizininizin PATH’inizde olduğundan emin olun.

Podman Compose’u kullanmaya başlamak için gerekenler bu kadar.

Podman Compose ile Bir Compose Dosyasını Çalıştırma

Podman Compose’u kurdunuz — şimdi gerçek bir uygulamayı nasıl çalıştıracağınızı göstereyim.

Mevcut bir Docker Compose dosyasını kullanma

Podman Compose, standart docker-compose.yml dosyalarını okur. Hiçbir şeyi yeniden adlandırmanıza veya biçimi değiştirmenize gerek yok.

İşte bir Compose dosyasında tanımlı basit bir FastAPI uygulaması:

services:
  web:
    image: python:3.14-slim
    container_name: fastapi-app
    working_dir: /src
    volumes:
      - ./src:/src
    ports:
      - "8000:8000"
    command: bash -c "pip install fastapi uvicorn && uvicorn main:app --host 0.0.0.0 --port 8000"

Uygulama kodu da src/main.py içinde:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello from FastAPI"}

@app.get("/health")
def health_check():
    return {"status": "healthy"}

Docker Compose’un çoğu özelliği Podman Compose ile kutudan çıkar çalışır. Buna şunlar dahildir:

  • Görüntü çekme ve konteyner oluşturma
  • Port eşleme
  • Volume bağlamaları (adlandırılmış volumelar ve bind mount’lar)
  • Çevre değişkenleri
  • Servisler arası temel ağ iletişimi

Ancak bazı özellikler ayarlama ister. Compose dosyanız Docker’a özgü eklentiler, özel ağ sürücüleri veya ileri düzey build argümanları kullanıyorsa, bu bölümleri muhtemelen değiştirmeniz gerekir.

Podman Compose ağ yönetimini de farklı ele alır — servisler, Docker Compose’ta olduğu gibi birbirlerini otomatik olarak servis adıyla çözümlemez.

Temel Podman Compose komutları

Servislerinizi artık şu komutla başlatabilirsiniz:

podman-compose up

Bu komut görüntüleri çeker, konteynerleri oluşturur ve Compose dosyanızda tanımlanan her şeyi başlatır. Günlüklerin terminalinize akmasını istemiyorsanız -d ile ayrık modda çalıştırın.

Podman çıktısı

Podman çıktısı

Artık uygulamayı makinenizde (veya benim kullandığım gibi uzak bir Ubuntu sunucusunda) 8000 numaralı porttan açabilirsiniz. Şunu göreceksiniz:

Podman üzerinden çalışan FastAPI uygulaması

Podman üzerinden çalışan FastAPI uygulaması

Çalışan servisleri durdurmak için şunu çalıştırın:

podman-compose down

Bu işlem konteynerleri durdurur ve kaldırır. Volumelar, onları da kaldırmak için --volumes eklemediğiniz sürece kalıcıdır.

Servis günlüklerinizi görmek için şu komutu çalıştırın:

podman-compose logs

Gerçek zamanlı günlük takibi için -f ekleyin veya yalnızca belirli bir konteynerin günlüklerini görmek için bir servis adı belirtin.

Konteynerler, ağlar ve volumelar dahil her şeyi temizlemek için şunu çalıştırın:

podman-compose down --volumes

Komutlar Docker Compose sözdizimini yansıtır; bu nedenle docker-compose ile zaten aşinaysanız kendinizi yabancı hissetmezsiniz.

Podman Compose vs. Docker Compose ve Diğerleri

Podman Compose ve Docker Compose aynı amaca yönelir, ancak alt yapıda farklı çalışır. Nasıl olduğunu açıklayayım.

Köksüz çalışma

Docker Compose, kök olarak çalışan Docker daemon’ı gerektirir. Köksüz konteynerleri yapsanız bile, daemon’ın kendisi yetkili çalışmak zorundadır. Podman Compose ise varsayılan olarak tamamen kök erişimi olmadan çalışır. Konteynerleriniz bir sistem servisi olarak değil, kullanıcınız olarak başlar; bu da süldurma yüzeyini azaltır ve Podman Compose’u çok kullanıcılı ortamlarda daha güvenli kılar.

Ağ davranışı

Docker Compose, servisleriniz için varsayılan bir bridge ağı oluşturur. Konteynerler birbirlerine otomatik olarak servis adıyla erişir.

Podman Compose bunun yerine pod tabanlı ağ yönetimi kullanır. Compose dosyanızdaki tüm konteynerler tek bir Podman pod’u içinde gruplanır ve aynı ağ ad alanını paylaşır. Bu, konteynerlerin servis adları yerine localhost üzerinden iletişim kurduğu anlamına gelir; bu da Docker kullanıcılarını şaşırtabilir.

Uygulamanızın db:5432 adresindeki bir veritabanına erişmesini bekliyorsanız, Podman Compose ile çalıştırırken bunu localhost:5432 olarak değiştirmeniz gerekir.

Pod tabanlı gruplama

Docker Compose bireysel konteynerleri yönetir. Podman Compose ise konteynerlerin ağı paylaştığı ve depolamayı paylaşabileceği Kubernetes esinli bir gruplama olan pod oluşturur. Bu pod modeli, Podman Compose’u Kubernetes kalıplarıyla hizalar ve ihtiyaç duyarsanız işyüklerini daha sonra orkestrasyona taşımayı kolaylaştırır.

systemd entegrasyonu

Podman, konteynerleri sistem servisleri olarak yönetmek için systemd ile entegre olur. Çalışan konteynerlerden systemd birim dosyaları üretebilir ve bunları diğer Linux servisleri gibi yönetebilirsiniz. Docker, konteyner seviyesinde yerel systemd entegrasyonu sunmaz.

Diğer seçenekler

Podman Compose ihtiyaçlarınıza uymuyorsa şu alternatifleriniz var:

  • Yerel Podman + systemd ile hiç Compose dosyası kullanmadan konteynerleri servis olarak yönetebilirsiniz
  • Kubernetes, ölçekte üretim işyükleri çalıştırıyorsanız tam orkestrasyon sağlar; ancak Compose tarzı araçlara göre çok daha ağırdır

Podman Compose, basit konteyner komutları ile tam orkestrasyon arasında bir yerde konumlanır. Docker’ın daemon gereksinimi olmadan çoklu konteyner iş akışları sunar.

Podman Compose’da Ağ ve Volumelar (Farklı Olanlar)

Docker’dan Podman Compose’a geçenler genellikle iki şeyden yakınır: ağ ve volumelar. Bu bölümde farklılıkları ele alacağım.

Servisten servise iletişim

Docker Compose’ta diğer servislere servis adlarıyla bağlanırsınız. Bir web servisi ve db adlı bir veritabanı servisi varsa, uygulamanız db:5432 adresine bağlanır.

Podman Compose tüm servisleri tek bir pod içine koyar. Aynı poddaki konteynerler ağ ad alanını paylaşır; bu da hepsinin localhost kullandığı anlamına gelir. Veritabanı bağlantı dizgeniz db:5432 yerine localhost:5432 olarak değişir.

Bu durum sıkça gafil avlar. Uygulamanız başlar, db:5432 adresine bağlanmaya çalışır ve bu ana makine adı çözülemediğinden başarısız olur. Bağlantı dizgelerinizi veya çevre değişkenlerinizi localhost kullanacak şekilde güncellemeniz gerekir.

Varsayılan ağlar

Docker Compose, servisleriniz için bir bridge ağı oluşturur. Her konteyner bu ağda kendi IP adresini alır ve Docker’ın DNS çözücüsü servis adı sorgularlarını yönetir.

Podman Compose varsayılan olarak ayrı ağlar oluşturmaz. Pod modeli, ağı daha alt seviyede paylaşmak anlamına gelir. Compose dosyanızda özel ağlar tanımlarsanız Podman Compose bunları oluşturmaya çalışır; ancak davranış Docker ile bire bir eşleşmez.

Volume ve bind mount davranışı

Volumelar ve bind mount’lar Docker Compose ile Podman Compose arasında büyük ölçüde aynı çalışır. Bunları Compose dosyanızda tanımlarsınız, Podman da oluşturur.

Ancak izinlerle ilgili bir ayrıntı var.

Podman varsayılan olarak köksüz çalıştığı için dosya sahipliği ve izinleri farklı davranabilir. Docker’da sorunsuz çalışan bir bind mount, Podman’da izin hataları verebilir; çünkü konteyner kullanıcısı, ana makinenizdeki kullanıcınızın UID’iyle eşleşmez.

Volume konumlarının da farklı olduğunu göreceksiniz. Docker volumelarını /var/lib/docker/volumes/ altında tutarken, Podman köksüz konteynerler için bunları ~/.local/share/containers/storage/volumes/ altında saklar.

Ne olup bittiğini bildiğinizde düzeltmeler kolaydır. Ağ için bağlantı dizgelerini ayarlayın ve volume sorunlarında dosya izinlerini kontrol edin.

Yaygın Kısıtlar ve Tuzaklar

Podman Compose, temel çoklu konteyner kurulumları için iyi çalışır; ancak bağlanmadan önce bilmeniz gereken kısıtları vardır.

Desteklenmeyen Compose özellikleri

Her Docker Compose özelliği Podman Compose’a bire bir çevrilmez. Karmaşık argümanlı build bağlamları sık sık başarısız olur veya farklı davranır. Docker Compose eklentileri ve uzantıları hiç çalışmaz. GPU aktarımı, ileri düzey sağlık kontrolleri ve bazı ağ modları gibi özellikler ya çalışmaz ya da geçici çözümler ister.

Compose dosyanız docker-compose.yml 3.x sürümlerinin özelliklerini yoğun kullanıyorsa, biraz deneme-yanılma bekleyin.

Docker’dan farklı ağ beklentileri

Servisler, servis adlarıyla değil localhost ile iletişim kurar. Bu da bağlantı dizgelerinde servis adlarını sabitleyen uygulamaları bozar.

Özel bridge ağları Docker ile aynı davranmaz. Pod modelinden dolayı DNS çözümlenmesi farklıdır.

Podman’ın ağ modeline uyacak şekilde yapılandırmaları ve çevre değişkenlerini güncellemeye biraz zaman ayırmayı bekleyin; ancak bu bir kerelik bir iştir.

macOS/Windows’ta platform kısıtları

Podman Compose, Linux’ta en iyi çalışır. macOS ve Windows’ta her şeyi bir Linux VM içinde çalıştırırsınız; bu da ek katmanlar demektir. Ana makine ile VM arası dosya eşitleme daha yavaş olabilir. Ana makine ile konteynerler arası ağ için ekstra yapılandırma gerekir.

Ekibiniz geliştirme için macOS veya Windows kullanıyorsa, Docker Compose genellikle daha akıcı bir seçenektir.

Araç olgunluğu ve ekosistem açıkları

Podman Compose, Docker Compose’dan daha yenidir. Topluluk daha küçüktür; bu nedenle spesifik sorunlara yanıt bulmak daha fazla araştırma gerektirir. Üçüncü taraf araçlar ve entegrasyonlar önce Docker, sonra (varsa) Podman için inşa edilir. IDE desteği ve GUI araç Docker ekosisteminin gerisindedir.

Podman Compose sorunları için bu kadar çok Stack Overflow yanıtı veya GitHub konusu bulamazsınız.

Bu kısıtlar Podman Compose’u kullanılamaz kılmaz; ancak geçmeden önce düşünmeniz gereken noktalarıdır. Docker Compose kullanıcıları bu sürtünmelere hiç maruz kalmaz.

Podman Compose Kullanımı için En İyi Uygulamalar

En yaygın Podman Compose sorunlarından nasıl kaçınacağınız burada.

  • Basit Compose dosyalarıyla başlayın. En karmaşık Docker kurulumunuzu ilk taşımayın. Tek servisli bir uygulamayla başlayın, çalıştığını doğrulayın, sonra kademeli olarak ekleyin. Bu sayede sorunları ortaya çıktıkça izole edebilirsiniz.

  • Köksüz ağ iletişimini erken test edin. Birden çok servisli bir uygulamayı ayağa kaldırın ve konteynerlerin localhost üzerinden iletişim kurabildiğini doğrulayın. Bağlantı dizgelerinizi servis adlarından localhost üzerine taşıyın. Ağ beklediğiniz gibi çalışmazsa hemen anlarsınız.

  • Volumelar ve portlarda açık olun. Varsayılanlara güvenmeyin. Bind mount’lar için tam yollar belirtin. Port eşlemelerini tanımlayın. Ana makine dizinlerini bağlıyorsanız dosya izinlerini açıkça ayarlayın. Podman’ın köksüz modeli, Docker’da çalışan varsayımların burada başarısız olabileceği anlamına gelir.

  • Podman Compose’u ağırlıklı olarak geliştirme ve hafif üretim için kullanın. Yerel geliştirme ortamları ve küçük kurulumlarda işini iyi yapar. Ölçekte üretim için Kubernetes veya başka bir orkestrasyon platformu isteyeceksiniz. Podman Compose, yüksek erişilebilirlikli kümeler veya karmaşık servis mesh’leri için tasarlanmamıştır.

Sonuç

Podman Compose, Docker yerine Podman ile çoklu konteynerli uygulamalar çalıştırmanın pratik bir yolunu sunar. Mevcut Compose dosyalarınızı okur ve bunları Podman komutlarına çevirir; böylece tamamen yeni bir iş akışı öğrenmeniz gerekmez. Ancak Docker Compose’un mükemmel bir kopyası değildir. Ağ yönetimi farklı çalışır, bazı özellikler desteklenmez ve Podman’ın pod tabanlı modeline uyacak şekilde bağlantı dizgeleri ile yapılandırmaları ayarlamanız gerekir.

Son olarak, mimari yaklaşımları ve uyumlulukları hakkında daha fazla bilgi edinmek için Docker ve Podman arası farkları okumanızı öneririm.

Dario Radečić

Yazar

Dario Radečić

Hırvatistan merkezli Kıdemli Veri Bilimci. 700’ün üzerinde yayımlanmış makaleyle 10 M+ görüntüleme elde eden, önde gelen bir teknoloji yazarı. TPOT ile Makine Öğrenimi Otomasyonu kitabının yazarı.

Docker Compose SSS

Podman Compose nedir?

Podman Compose, Docker Compose dosyalarını okuyan ve bunları Podman komutlarına çeviren Python tabanlı bir araçtır. Bir daemon veya kök yetkileri gerektirmeden, Docker yerine Podman kullanarak çoklu konteynerli uygulamalar çalıştırmanıza olanak tanır ve aynı Compose iş akışını sunar.

Docker Compose dosyalarını Podman Compose ile kullanabilir miyim?

Evet, Podman Compose standart docker-compose.yml dosyalarını okur. Docker’ın temel özelliklerinin çoğu kutudan çıkar çalışır; ancak Podman’ın pod tabanlı ağ modelinden dolayı bağlantı dizgelerini servis adlarından localhost’a çevirmek gerekir.

Podman Compose ile Docker Compose arasındaki temel fark nedir?

Podman Compose varsayılan olarak köksüz çalışır ve bir daemon gerektirmez; Docker Compose ise kök olarak çalışan Docker daemon’ına ihtiyaç duyar. Podman Compose, konteynerlerin localhost paylaştığı pod tabanlı bir ağ kullanırken, Docker Compose her servise ayrı bir ana makine adı sağlar.

Podman Compose kullanırken servislerim neden bağlantı kuramıyor?

Podman Compose, tüm servisleri aynı ağ ad alanını paylaşan tek bir pod içine koyar; bu yüzden konteynerler servis adları yerine localhost üzerinden iletişim kurar. Uygulama yapılandırmalarınızda db:5432 gibi dizgeleri localhost:5432 olarak değiştirmeniz gerekir.

Podman Compose macOS ve Windows’ta çalışır mı?

Evet, ancak önce Podman Desktop veya podman machine ile Podman’ı bir Linux VM içinde çalıştırmanız gerekir. Bu durum Linux’a göre daha karmaşıktır ve daha yavaş dosya eşitleme ile bazı ağ tuhaflıklarına yol açabilir.

Konular

İlgili