Container Teknolojilerine Giriş: Container’lar ile çalışmak

27.07.2021

Caner 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

1

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.