Container Teknolojilerine Giriş: Podman ile Çalışmak

27.07.2021

Caner Korkmaz

Çok kısa bir özet yapacak olursak; uygulamamızın kod, runtime ve kütüphane gibi tüm gereksinimleriyle birlikte paketlenmiş haline container imajı diyoruz.

1

Daha önceki yazılarımızda Container’ların ne olduğundan ve temel mimari özelliklerinden bahsetmiştik. Bu yazımızda komut satırı kullanarak container formatındaki uygulamaların nasıl çalıştırıldığını inceleyeceğiz. Eğer önceki yazılarımızı okumadıysanız, öncelikle onları okumanız faydalı olacaktır. 

 

Çok kısa bir özet yapacak olursak; uygulamamızın kod, runtime ve kütüphane gibi tüm gereksinimleriyle birlikte paketlenmiş haline container imajı diyoruz. Bu container imajını çalıştırdığımızda elde ettiğimiz prosesler bütününe de container diyoruz. Container imajlarını ise Red Hat Quay, Docker Hub gibi container registry dediğimiz sunuculardan indirebildiğimiz gibi, kendi ürettiğimiz imajları da gene benzer şekilde bu container registrylerde saklayıp diğer insanlarla paylaşabiliyoruz.

 

Container’lar ile çalışmak için öncelikle Linux bir makineye ihtiyacınız olacak. Bu makine containerlarımız için “host” yani ev sahibi olarak görev yapacak. Benim kullandığım ortam RHEL8.2 işletim sistemine sahip. Containerlar ile çalışabilmek için buraya podman ya da docker gibi bir “container engine” kurmanız gerekiyor. Buradaki örneklerde podman ile ilerleyeceğim ancak, siz docker kullanmak isterseniz komutlarda “podman” gördüğünüz yerleri  “docker” ile değiştirerek aynı komutları docker engine ile de çalıştırabilirsiniz.

 

Öncelikle podman’i kuralım. Red Hat/CentOS sistemlerde yum komutuyla kurulumu yapabilirsiniz. Debian tabanlı sistemlerde “apt-get install podman” komutunu kullanabilirsiniz.

#yum install podman

 

Artık podman komutunu kullanarak ilk container’ımızı çalıştırabiliriz. Yeni bir container çalıştırmak için “podman run” komutunu kullanacağız. Örnek olarak bir apache httpd container’ı çalıştıralım:

# podman run -d -p 1080:80 httpd

 

Yukarıdaki komuttaki “-d” parametresi, container’ın “detached” modda, yani arkaplanda çalışmasını sağlar. “-p” parametresi ise host makine ile container arasındaki port eşleşmesi için kullanılır. Bizim örneğimizde host’umuzun 1080 numaralı portuna gelen istekler container’ımızın 80 nolu portuna yönlenecektir.

 

Komut, ilgili httpd container imajını sırasıyla Red Hat ve Docker Hub registry’lerinde arayıp, bulduğu imajı host makinemize indirecektir. Aşağıdaki gibi bir çıktı üretecek ve akabinde container’ımız çalışmaya başlayacaktır:

Trying to pull registry.access.redhat.com/httpd...

  name unknown: Repo not found

Trying to pull registry.redhat.io/httpd...

  unable to retrieve auth token: invalid username/password: unauthorized: Please login to the Red Hat Registry using your Customer Portal credentials. Further instructions can be found here: https://access.redhat.com/RegistryAuthentication

Trying to pull docker.io/library/httpd...

Getting image source signatures

Copying blob 3678b2d55ccd done 

Copying blob aeb67982a725 done 

Copying blob 06954f8169fd done 

Copying blob 7284b4e0cc7b done 

Copying blob 69692152171a done 

Copying config 39c2d1c932 done 

Writing manifest to image destination

Storing signatures

3b38cfa9692aff9554835e4fc600c053378d2b59953bf561982f8a9f61e44e1f

 

Container’ımızın çalıştığını aşağıdaki gibi “podman ps” komutu ile kontrol edebiliriz. Komutun çıktısındaki “Container ID” kısmını kırmızı ile işaretledim. Bu ID’yi daha sonra containerımızı durdururken ve silerken de kullanacağız.

# podman ps

CONTAINER ID  IMAGE                           COMMAND           CREATED         STATUS             PORTS                 NAMES

3b38cfa9692a  docker.io/library/httpd:latest  httpd-foreground  15 minutes ago  Up 15 minutes ago  0.0.0.0:1080->80/tcp  vibrant_satoshi

 

Container’ımızın ayakta olduğunu gördük. Şimdi apache httpd web serverımızın ayakta olup olmadığını test edelim. Bunun için host makinemden aşağıdaki komutu çalıştırabilirim:

# curl localhost:1080

<html><body><h1>It works!</h1></body></html>

 

Böylece apache servisinin de ayakta olduğunu görmüş olduk. Artık testimizin bittiğini varsayarsak container’ımızı durdurabiliriz. Bunun için daha önce değindiğimiz Container ID bilgisini kullanacağız:

# podman stop 3b38cfa9692a

3b38cfa9692aff9554835e4fc600c053378d2b59953bf561982f8a9f61e44e1f

 

Şimdi podman ps komutunu tekrar kullanarak çalışan container’larımız listeleyelim:

# podman ps

CONTAINER ID  IMAGE   COMMAND CREATED  STATUS  PORTS  NAMES

 

Çalışır durumda hiçbir contianer olmadığını görüyoruz. Şimdi aynı komutu bir de “-a” parametresi ile kullanıp, çalışır durumda olsun olmasın host üzerindeki tüm container’larımızı listeleyelim.

# podman ps -a

CONTAINER ID  IMAGE                                            COMMAND               CREATED         STATUS                    PORTS                 NAMES

3b38cfa9692a docker.io/library/httpd:latest                    httpd-foreground      40 minutes ago  Exited (0) 2 minutes ago  0.0.0.0:1080->80/tcp  vibrant_satoshi

 

Bu defa httpd containerımızın “Exited” statude olduğunu görebiliyoruz. Artık container’ımızı silebiliriz. 

# podman rm 3b38cfa9692a

3b38cfa9692aff9554835e4fc600c053378d2b59953bf561982f8a9f61e44e1f

 

Eğer container’ımızı durdurmadan direkt silmeye kalksaydık podman bize bir uyarı mesajı gösterip işlemi gerçekleştirmeyecekti. 

Şimdi bir de hostumuza inen container imajını inceleyelim:

# podman images

REPOSITORY                                 TAG     IMAGE ID      CREATED       SIZE

docker.io/library/httpd                    latest  39c2d1c93266  5 days ago    142 MB

 

Testimiz bittikten sonra artık bu imaja ihtiyacımız kalmadığını düşünüyorsak host’umuzda yer kaplamaması için imajı da makinemizden silebiliriz:

# podman rmi docker.io/library/httpd

Untagged: docker.io/library/httpd:latest

Deleted: 39c2d1c9326678290fb11469ffde9785efa212f6cdfbea6d68a3d01ac11b41ae

 

Bu yazımızda daha önce teorik altyapısına değindiğimiz container teknolojilerinin giriş seviyesinde bir uygulamasını göstermeye çalıştık. Container teknolojileri, Kubernetes ve Red Hat OpenShift Container Platformu hakkında daha fazla bilgi için bizimle iletişime geçebilirsiniz.