Container Teknolojilerine Giriş: Podman ile Çalışmak
27.07.2021Caner 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.
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.