İçerik
Yeni başlayanlar için bu podman eğitiminde, podman’a başlamak ve tüm Podman işlevlerini keşfetmek için size adım adım rehberlik edeceğim.
Konteynerler hakkında konuştuğumuzda, aklımıza gelen varsayılan araç Docker’dır. Ancak Docker’ın ortaya çıkışından sonra konteyner alanında, özellikle de konteyner güvenliği konusunda pek çok gelişme oldu. Güvenlik endişelerini gideren projelerden biri de Podman’dır.
Podman Nedir?
Podman, container’ları yönetmek için Docker gibi benzer özellikler sunan OCI uyumlu bir konteyner yönetim aracıdır.
Podman’ın en iyi özelliklerinden biri rootless container çalıştırabilmesidir. Rootless container, container’ları root ayrıcalıkları olmadan çalıştırma ve yönetme kavramıdır. Güvenlik açısından bakıldığında, rootless container’lar, container bir saldırgan tarafından ele geçirilse bile root erişimine izin vermeyerek ek bir güvenlik katmanı ekler. Rootless container’ın faydaları hakkında buradan bilgi edinebilirsiniz.
Not: Docker ayrıca bazı sınırlamalarla birlikte rootless modu da destekler. Bu konu hakkında buradan bilgi edinebilirsiniz.
Podman ayrıca daemonless’tır (docker’ın aksine), yani bir daemon’a sahip değildir ve doğrudan runc ile etkileşime girer (OCI spesifikasyonuna dayalı konteynerleri çalıştırır). Yazının sonuna doğru Docker ve Podman arasındaki farkı ekledim.
Ayrıca, Linux’ta iki kullanıcı olduğunu varsayalım. user-a ve user-b. user-a tarafından podman kullanılarak oluşturulan container’lar user-b tarafından değiştirilemez ve bunun tersi de geçerlidir.
Podman’ın bir başka ilginç ve gelişmiş özelliği de Pod’larda konteyner çalıştırmaktır. Kubernetes podlarına benzer şekilde, Podman’ı kullanarak yerel olarak çoklu konteyner podları oluşturabilirsiniz. Podman podunu bir Kubernetes manifest’i olarak dışa aktarabilir ve podman podunu deploy etmek için bir Kubernetes pod manifest’i kullanabilirsiniz.
Podman Kurulumu
Resmi sayfasından podman kurulum dokümanlarına ulaşabilir, Windows, MAC ve Linux türleri için tüm kurulum komutlarını bulabilirsiniz.
Not: Podman container’ları dağıtmak için Windows ve Mac üzerinde bir sanal makineye ihtiyaç duyacaktır.
Ben test için Ubuntu 23.10 kullanacağım. Debian 12 ve ubuntu 23.10 veya sonrası için aşağıdaki adımları kullanabilirsiniz.
Ubuntu veya Debian İçin Podman Kurulumu
sudo apt-get install runc -y
sudo apt-get -y install podman
Centos veya RHEL İçin Podman Kurulumu
sudo yum -y install podman
MacOS İçin Podman Kurulumu
MAC için podman’i kurun ve ardından podman machine komutunu kullanarak QEMU tabanlı sanal makineyi ayağa kaldırın.
brew install podman
podman machine init
podman machine start
Kurulum Doğrulama
Kurulumdan sonra, aşağıdaki komutu kullanarak kurulumu doğrulayın.
podman version
Podman Container Registry Konfigürasyonu
Podman varsayılan olarak iki container registry ile yapılandırılmıştır.
Varsayılan Podman container registry yapılandırmasını aşağıdaki dosyada bulabilirsiniz.
/etc/containers/registries.conf
Bu yapılandırmaya private container registry adreslerinizi ekleyebilirsiniz. Örneğin, google container registry, AWS ECR vb.
Registry üzerinde diğer private container imajlarını kullanmak istiyorsanız, podman komutunu kullanarak registry’e giriş yapabilirsiniz. Örneğin, docker hub’a giriş yapmak için,
podman login docker.io
Giriş yaptıktan sonra, podman komutunu kullanarak container imajlarını docker hub’ından çekebileceksiniz
Belirli bir kullanıcı için farklı bir registry yapılandırmasına sahip olmak isterseniz, kullanıcı dizininde kapsayıcı kayıt defteri bilgileriyle ayrı registries.conf oluşturabilirsiniz.
$HOME/.config/containers/registries.conf
Podman Container Depolaması
Her sistem kullanıcısının kendi container depolaması vardır. Yani, farklı kullanıcı oturumlarından image çekmeye çalışırsanız, image’ı local yerine remote registry’den çeker.
Örneğin;
- Root kullanıcıları için container’lar /var/lib/containers/storage dizininde saklanır.
- Diğer kullanıcılar için container’lar $HOME/.local/share/containers/storage/ dizininde saklanır.
Podman ile Container’ları Yönetme
Container’ları docker ile çalıştığınız şekilde yönetebilirsiniz. Ancak docker komutu yerine docker’a benzer flag’lere sahip bir komut olarak podman’ı kullanacağız. Ayrıca podman komutunu sudo yetkileri olmayan herhangi bir kullanıcı ile çalıştırabilirsiniz.
İlk olarak, bir imaj çekmeyi deneyelim. Varsayılan olarak podman imajları önce quay.io’da sonra da docker.io’da arar. Eğer quay.io’da bir imaj yoksa podman docker.io’da arama yapar ve imajı çeker. Bu nedenle, container registry endpoint’inin ne olduğunu tam image adını belirtmek daha iyi olacaktır.
Örneğin,
podman pull docker.io/nginx
podman pull quay.io/quay/busybox
Şimdi dockerhub registry üzerinden bir Nginx conrainer’ı çalıştıralım. Aşağıdaki komut Nginx container’ını 8080 host port eşlemesi ile çalıştırır.
podman run --name docker-nginx -p 8080:80 docker.io/nginx
Gördüğünüz gibi, yukarıdaki podman komutu docker komutu ve flag’leri ile aynı.
Rootless modda (Normal kullanıcı modu) 1024’ün altındaki portları kullanamazsınız. Çünkü normal kullanıcı container namespace’i bu portları map’lemek için ayrıcalıklara sahip değildir. Podman kullanarak 1024’ten küçük ana bilgisayar bağlantı noktalarını map’lemek istiyorsanız, podman’ı aşağıda gösterildiği gibi root kullanıcısı olarak veya sudo ayrıcalıklarıyla çalıştırmalısınız.
sudo podman run --name docker-nginx -p 80:80 docker.io/nginx
Aşağıdaki komutu kullanarak map’lenen bağlantı noktalarını kontrol edebilirsiniz. -l parametresi en son container için ayrıntıları döndürür.
podman port -l
inspect komutunu kullanarak container’ı inceleyebilirsiniz.
podman inspect -l
Container’ları durdurmak, kaldırmak ve silmek için kullanılan diğer komutlar docker komutlarıyla aynı şekilde çalışır.
Birkaç örneği aşağıda bulabilirsiniz;
podman images
podman ps
podman ps -a
podman stop <container-name>
podman rm <container-name>
Mevcut tüm podman komutları hakkında bilgi edinmek için help komutunu kullanabilirsiniz.
podman --help
Podman ile Container Image Oluşturma
Özel bir HTML dosyası ile Nginx’in container imajını oluşturmayı deneyelim. Dockerfile ve HTML dosyasını bir GitHub reposunda tutuyorum.
Repoyu klonlayalım ve repo nginx-image dizinine cd ile girelim.
https://github.com/sezersanlikan/podman.git
cd podman/nginx-image
nginx-image klasörünün içinde bir Dockerfile ve index.html dosyası göreceksiniz.
Podman kullanarak container imajını oluşturalım. Kullanacağımız komut docker komutu ile benzer.
podman build -t sezerin/nginx .
Şimdi, imajı container registry’e gönderelim. İmajı göndermek için container registry’e giriş yaptığınızdan emin olun. Burada dockerhub kullanıyorum.
podman push sezerin/nginx
Podman ile Pod Oluşturma
Bu bölümde Podman ile nasıl pod oluşturulacağını öğreneceğiz. Podman’in gelişmiş özelliklerinden biri Kubernetes podlarına benzer podlar oluşturabilmesidir. Pod, bir veya daha fazla konteynere sahip olabileceğiniz bir birimdir.
İşte yapabilecekleriniz;
- Boş bir pod oluşturma: Boş bir pod oluşturulduğunda, Podman, namespace’i sürdürmek ve pod içindeki diğer container’larla iletişime izin vermek için bir altyapı konteyneri olan k8s.gcr.io/pause’yi atar.
- Pod içerisine bir container ekleyebilir veya çıkartabilirsiniz.
- Bir pod içinde full application stack oluşturabilirsiniz.
- Pod içerisindeki container’ları durdurup, başlatabilirsiniz.
Mevcut tüm podman pod komutlarını öğrenmek için help komutunu çalıştırmanız yeterlidir.
podman pod --help
Boş Bir Pod Oluşturma
Boş bir pod oluşturalım. Eğer –name flag’ini belirtmezseniz, podman rastgele bir isimle bir pod oluşturacaktır.
podman pod create --name demo-pod
Oluşturulan pod’u listeleyelim.
podman pod ls
Aşağıdaki komut pod içindeki tüm konteynerleri listeler. Boş podlar için, bir k8s.gcr.io/pause container’ı eklenmiş olacaktır.
podman ps -a --pod
Podman Poduna Container Ekleme
Boş pod’a bir Nginx container ekleyelim. Aşağıdaki komutu çalıştırdıktan sonra container’ları listelerseniz, demo-pod’a Nginx container’ının eklendiğini göreceksiniz
podman run -dt --pod demo-pod nginx
Podman Podunun İçerisindeki Container’ı Başlatma / Durdurma / Silme
Podman ile, pod içindeki konteynerleri başlatmak, durdurmak ve silme için container id’leri ile kullandığınız aynı komutları kullanabilirsiniz.
Öncelikle podman komutunu kullanarak poddaki container’ları listeleyin ve aşağıdaki komutları container ID’leri ile birlikte kullanın.
podman start <continer-id>
podman stop <continer-id>
podman rm <continer-id>
Pod ile Beraber Container Oluşturma
Tek bir komutla bir pod oluşturabilir ve içine container ekleyebiliriz. Şimdi 8080 için host port eşlemesi ile bir Nginx container’ı içeren bir pod oluşturalım.
podman run -dt --pod new:frontend -p 8080:80 nginx
Sanal makinenin IP’sindeki 8080 numaralı bağlantı noktasına eriştiğinizde, Nginx ana sayfasını görebilmeniz gerekir.
Podu Başlatma / Durdurma / Silme
Container id’sini/adını kullanarak pod içindeki container’ları tek tek seçip durdurabilir veya aşağıdaki komutu kullanarak tüm container’ları bir kerede durdurabilirsiniz.
podman pod stop <podname>
podman pod start <podname>
Bir pod’u kaldırmak için önce pod’daki tüm container’ları durdurun ve ardından aşağıdaki komutu çalıştırın,
podman pod rm <podname>
Ya da -f flag’ini kullanarak container’ları durdurmadan pod’u zorla silebilirsiniz.
podman pod rm -f <pod-name>
Multi Container Application Stack
Tek bir podman podunda çok container’lı bir Application Stack’ine sahip olabilirsiniz. Bu, uygulamaların yerel olarak geliştirilmesine ve test edilmesine yardımcı olur.
Örneğin, bir uygulamanız ve veritabanınız varsa, aynı podda bir uygulama ve DB container’ına sahip olabilirsiniz. Stack’i istediğiniz zaman yok edebilir ve geri getirebilirsiniz. Docker-compose’a benzer bir şey.
Hem uygulama hem de DB container’ları localhost kullanarak birbirleriyle konuşabilir.
Podman Pod Tanımlarından Kubernetes YAML Oluşturma
Podman’ın bir başka ilginç özelliği de podman podlarından Kubernetes pod YAML’ları oluşturabilmenizdir. Bu çalışan bir özelliktir ancak hala geliştirilme aşamasındadır.
İlk olarak, bir Nginx konteyneri ile webserver adlı bir pod ayağa kaldıralım.
podman run -dt --pod new:webserver -p 8080:80 nginx
Şimdi podman pod’u için Kubernetes YAML’ı oluşturmak amacıyla, aşağıda gösterdiğim gibi pod adıyla birlikte generate kube flag’ini kullanacağız.
podman generate kube webserver
Oluşturulan YAML’yi yeniden yönlendirme ile bir dosyaya yazdırabilirsiniz.
podman generate kube webserver >> webserver.yaml
YAML ile Podman Podu Oluşturma
Bir pod YAML dosyanız varsa, play kube flag’ini kullanarak bunu bir Podman pod’u olarak içe aktarabilir ve çalıştırabilirsiniz.
Örneğin, pod’u çalıştırmak için son bölümde oluşturulan webserver.yaml dosyasını kullanacağız. Öncelikle mevcut webserver podunu kaldırmamız gerekiyor.
podman pod rm -f webserver
Pod’u webserver.yaml kullanarak içe aktaralım
podman play kube webserver.yaml
Şimdi, bir Kubernetes YAML’ını içe aktarmayı deneyelim. Aşağıdaki Kubernetes manifest kodlarını nginx.yaml dosya adıyla kaydedin.
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: webserver
image: docker.io/nginx:latest
ports:
- containerPort: 80
Bunu bir podman pod olarak içe aktaralım.
podman play kube nginx.yaml
Şimdi, pod’ları listelerseniz, çalışan bir Nginx pod’u görebilirsiniz.
Podman Desktop
Podman Desktop, podman container’larını yönetmek için bir GUI aracıdır. Windows, MAC ve Linux Sistemleri için kullanılabilir.
Bu adresten indirip kurabilirsiniz.
Docker VS Podman
Podman’ın docker’dan ne kadar farklı olduğunu merak ediyorsanız, aşağıdaki tablo bazı temel farklılıklar konusunda size yardımcı olacaktır.
Podman | Docker |
---|---|
Podman Daemonless ‘dir. | Docker’ın bir daemon’u (containerd ) vardır. Docker CLI, konteynerleri yönetmek için daemon ile etkileşime girer. |
Podman, Linux çekirdeği ile doğrudan runc aracılığıyla etkileşime girer. | Docker daemon, çalışan container’ların tüm alt süreçlerinin sahibidir. |
Podman, podları birden fazla container ile dağıtabilir. Aynı pod manifest’i Kubernetes’te de kullanılabilir. Ayrıca, bir Kubernetes pod manifest’ini bir Podman pod’u olarak dağıtabilirsiniz. | Docker’da pod kavramı yoktur. |
Herhangi bir ek yapılandırma olmadan rootless container çalıştırabilir. Container’ları root veya ayrıcalıklı olmayan kullanıcılarla çalıştırabilirsiniz. | Docker rootless modu ek yapılandırmalar gerektirir. |
Ek olarak daha önce yayınladığım Docker Cheat Sheet‘e göz atabilirsiniz.