Container Teknolojilerine Giriş: Container’lar ile çalışmak
27.07.2021Caner Korkmaz
Bu yazımızda podman ile çalışmaya devam ederek, bir container imajını çalıştırdığımızda aslında neler olduğunu anlamaya çalışacağız
Bir önceki yazımızda podman kullanarak container’lar ile nasıl çalışacağımız hakkında bir giriş yapmıştık. Bu yazımızda podman ile çalışmaya devam ederek, bir container imajını çalıştırdığımızda aslında neler olduğunu anlamaya çalışacağız.
Gene öncelikle kısa bir özet yaparsak, ev sahibi ya da host diye tabir ettiğimiz bir Linux sistem üzerinde container çalıştırabilmek için öncelikle docker ya da podman gibi bir container engine’e ihtiyacınız var. Sonrasında çalıştırmak istediğiniz uygulamanın container imajını Docker Hub ya da Quay.io gibi bir registry’den sisteminize indirerek uygulamanızı container şeklinde çalıştırabilirsiniz. Bu kısım hakkında daha detaylı bilgi için önceki yazımızı inceleyebilirsiniz.
Bu yazımızda örnek olarak busybox container imajını kullanacağız. Busybox imajı, günlük hayatta kullandığımız birçok GNU aracının mini versiyonlarını içermesi ve yalnızca birkaç MB boyutunda olmasıyla container dünyasında popüler bir imajdır. İlk olarak podman komutumuzun en basit haliyle busybox imajımızı çalıştırmaya çalışalım:
[hostmachine]# podman run busybox Trying to pull registry.access.redhat.com/busybox... name unknown: Repo not found Trying to pull registry.redhat.io/busybox... 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/busybox... Getting image source signatures Copying blob b71f96345d44 done Copying config 69593048aa done Writing manifest to image destination Storing signatures |
Podman, busybox imajını docker hub registry’sinde bularak host makinemize indirdi ve çalıştırdı. Şimdi çalışan container’larımızı listeleyelim:
[hostmachine]# podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
Sistemde çalışır durumda hiçbir container olmadığını görüyoruz. Halbuki bir busybox container’ı olmasını bekliyorduk. Sistemde çalışan çalışmayan tüm containerları listelersek, busybox container’ının “Exited” durumda olduğunu görüyoruz.
[hostmachine]# podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6049ca1bd6cc docker.io/library/busybox:latest sh 9 minutes ago Exited (0) 1 minutes ago nostalgic_stonebraker |
Bunun sebebi busybox imajının çalıştığında “sh” programını çalıştıracak şekilde oluşturulmuş olmasıdır. Bunu “podman ps” çıktısındaki COMMAND sütununa ya da aşağıdaki resimde görüldüğü gibi imaj katmanlarındaki CMD parametresine bakarak anlayabiliriz. Bizim örneğimizde Busybox container’ı “sh” programını çalıştırdı, ancak “sh” programı bağlanabileceği bir terminal bulamadığı için kendini sonlandırdı ve biz de container’ı “Exited” durumda görmüş olduk.
Şimdi aynı busybox imajımızı tekrar çalıştıralım ancak bu defa “sh” komutunun bağlanabileceği bir terminal de sağlayalım. Bunun için podman komutuna “-t” (--tty: Allocate a pseudo-TTY for container) ve “-i” (--interactive: Keep STDIN open even if not attached) opsiyonlarını da ekliyoruz:
[hostmachine]# podman run -ti busybox / # / # |
Evet, bu defa busybox container’ımız çalıştı ve “sh” komutu da bağlanabileceği bir terminal bulabildiği için şu anda container’ımızın içerisinde “sh” kabuğundayız. Burada hostname komutunu çalıştırarak container’ımızın hostname’ini öğrenebiliriz. Gördüğümüz hostname aynı zamanda container’ın ID’sidir.
/ # hostname 20e4d26a2893 |
Şu anda host makinemize farklı bir terminalden ssh bağlantısı yapıp çalışan container’ları listelersek busybox container’ımızın listelendiğini görebiliriz.
[hostmachine-TERMINAL2]# podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 20e4d26a2893 docker.io/library/busybox:latest sh 19 seconds ago Up 18 seconds ago goofy_greider |
Şimdi ilk terminalimize (busybox “sh” kabuğuna bağlı olduğumuz terminal) geri dönelim ve Ctrl+D yaparak “sh” programını sonlandıralım. Busybox container’ımız “sh” programını çalıştıracak şekilde oluşturulduğundan, sh programı sonlandığında container’ımız da sonlanmış olacak ve “Exited” durumuna geçecektir. Dolayısıyla biz de kendimizi tekrardan host makinemizin kabuğunda bulacağız.
/ # / # / # / #<CTRL+D> [hostmachine]# |
Dolayısıyla burada dikkat etmemiz gereken bir başka nokta da şu: Containerlar belirli bir uygulamayı çalıştırmak üzere tasarlanmışlardır ve o uygulama çalıştığı müddetçe container da çalışmaya devam eder. O uygulama sonlandığında container da sonlanmış olur. Bunu örnek üzerinden inceleyecek olursak, busybox imajımızı bu defa, imajın default çalıştırdığı program olan “sh” yerine bizim istediğimiz bir uygulama/program ile çalıştıralım. Bunu yapmak için daha önceki komutumuzun sonuna çalıştırılmasını istediğimiz komut ve opsiyonlarını eklememiz yeterli. Mesela aşağıdaki örnekte busybox imajını kullanarak “echo hello world” komutunu çalıştırmak istiyorum:
[hostmachine]# podman run -ti busybox echo hello world hello world [hostmachine]# |
Busybox container’ı ayağa kaldırıldı, “echo hello world” komutunu çalıştırdı. Bu komutun sonlanmasıyla birlikte container da işlevini tamamlamış olarak kendini sonlandırdı ve “Exited” durumuna geçti. Bu iş sadece birkaç milisaniye sürdüğü için container’ı çalışır durumda göremiyoruz. Dolayısıyla “podman ps” çıktısında busybox container’ı listelenmiyor:
[hostmachine]# podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [hostmachine]# |
Aynı busybox imajımızı aşağıdaki komut ile çalıştırırsak, sleep komutu 10 saniye süreceği için, container’ımız da 10 sn boyunca çalışır durumda olacak ve sonrasında sonlanacaktır. Burada container’ın arka arkaya birkaç komut çalıştırmasını istediğimiz için onları container’a “sh -c …” parametresi şeklinde sağladık:
[hostmachine]# podman run -ti busybox sh -c "echo hello world; sleep 10; echo goodbye!" hello world goodbye! [hostmachine]# |
Genelde uygulama container’larımız arka planda uygulamaya has bir servis/daemon çalıştırdıkları için bu containerlar, daemon ayakta olduğu sürece çalışmaya devam ederler. Mesela daha önceki blok yazımızda olduğu gibi bir httpd container’ı çalıştırdığımızda arka planda bir httpd prosesi çalışmaya başlar ve aksi bir durum olmadığı müddetçe de çalışmaya devam eder. Bu sebeple bu tür containerları bir kez çalıştırdığımızda süresiz bir şekilde çalışmaya devam ederler.
[hostmachine]# podman run -d -p 1080:80 httpd d41d7e99474abf7df7a38d86d574d0f2e0c5071ae36d31d45942ffbb6710215e [hostmachine]# [hostmachine]# podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d41d7e99474a docker.io/library/httpd:latest httpd-foreground 4 seconds ago Up 3 seconds ago 0.0.0.0:1080->80/tcp hungry_albattani [hostmachine]# |
Bu yazımızda bir container imajını çalıştırmanın aslında container imajında belirlenen bir uygulamanın çalıştırılması anlamına geldiğini ve bu uygulama çalışmaya devam ettiği sürece container’ın da çalışmaya devam ettiğini göstermeye çalıştık. Umarım faydalı olmuştur. Container teknolojileri, Kubernetes ve Red Hat OpenShift Container Platformu hakkında daha fazla bilgi için bizimle iletişime geçebilirsiniz.