Linux Containers
Container teknolojisi artık CI/CD sürecinin bir parçası. Yakından bildiğimiz örnekleri LXC ve Docker.
Container Nedir?
Nedir sorusuna internet üzerinde çokça ve güzel cevaplar var. En beğendiğim kısa ve öz cevap:
Neden Container?
Basit olarak isolation.
What are containers and why do you need them?
Google systems guru explains why containers are the future of computing.
Peki Nasıl?
Bu hikayede cevap bulmaya çalışacağım soru.
Bir uygulamanın işletim sistemi seviyesinde izole bir şekilde çalışması nasıl sağlanıyor?
Nedir sorusunda verilen cevaba dönecek olursak “resource-isolated processes” ifadesi olaya nasıl yaklaşmamız gerektiğini belirtiyor. Ben de bakış açımızı o yöne çevirerek adım adım ilerlemek istiyorum.
Application kavramı bildiğimiz gibi Linux işletim sisteminde ve diğerlerinde de olduğu gibi OS üzerinde çalışan bir process’e karşılık gelmektedir.
Bu aşamada process seviyesinde düşünmeye başlayalım. Bir process’i işletim sistemi seviyesinde nasıl izole edebiliriz?
OS üzerinde çalışan process’ler tüm kaynakları ortak kullanılır. Biraz bu kaynaklardan bahsedelim.
- Kernel
- File System
- Network
- PID Tree
- I/O Devices
- Physical Resources(CPU, RAM)
Yukarıda belirtilen her bir kaynağın belli bir kısmını sadece bir process’e tahsis edebilirsek o process için “resource-isolated” diyebiliriz. Şimdi container kavramına bakış açımızın biraz daha değiştiğini düşünüyorum.
Özetlemek gerekirse container kavramı işletim sistemi sanallaştırmasından çok process izolasyonu anlamına gelmektedir.
Şimdi biraz somut adımlarla ilerleyelim.
Yukarıda bahsettiğim paylaşımlı kaynaklardan dosya sistemini ele alalım.
Dosya sisteminin bir kısmını nasıl bir process’e tahsis edebiliriz? Bir başka deyişle bir process’in gördüğü dosya sistemini nasıl değiştiririz?
Eğer bunu başarabilirsek process’i dosya sisteminden izole etmiş oluruz ve sadece kendi gördüğü dosyalara erişim yetkisi olur. Bu da OS üzerindeki ve varsa başka izole edilmiş process’lerin dosya sistemine müdahale edememesi anlamına gelir.
Docker container içerisine girip dosyaları listelediğimizde yeni bir işletim sistemi ve dosya sistemi üzerinde olduğumuzu görürüz.
Son olarak daha iyi anlaşılabilmesi için chroot komutundan yardım alıp bir demo ile burada bırakalım.
Change Root anlamına gelen bu komut, isminden de anlaşılacağı üzere bir process’in çalıştığı veya gördüğü dosya sisteminin root “/” dizinini değiştirir.
Bildiğiniz gibi Linux’te herşey bir dosyadır, dolayısıyla process’ler de bir dosyadır. Linux dosya sistemindeki hiyerarşide tüm dosyalar root dizininin altında bulunur ve her dosya yolu root dizinini takip eder. Chroot komutu ile istediğimiz bir process’in root dizinini değiştirebiliriz.
Öyleyse bash process’ine chroot uygulayarak kendi container ortamımızı oluşturmayı deneyelim.
Bash process’i Linux işletim sistemine erişmemizi ve yönetmemizi sağlar. Çalıştırdığımız tüm process’ler bash process’inin child’ı olarak process tree altına eklenir.
Amacımız dosya sistemini izole etmek oldugundan birkaç ön hazırlık yapalım.
- Root dizin olarak çalışacak yeni bir dizin oluştur.
- Çalıştıracağımız bash executable’ını ve bağımlılıklarını yeni root dizin altına kopyala.
- Test etmek istediğimiz diğer komutlar(ls, pwd, mkdir, vb.) için aynı işlemi uygula.
- Test için birkaç yeni dizin oluştur.
- chroot <new_root_directory> /bin/bash komutunu çalıştır.
mkdir /tmp/mynewroot# bash komutunu bağımlılıkları ile beraber yeni root dizini altına kopyalayalım.# ldd komutu ile bağımlılıkları listeyebiliriz.ldd /bin/bash
linux-vdso.so.1 => (0x00007ffc5a958000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
/lib64/ld-linux-x86-64.so.2mkdir /tmp/mynewroot/bin
cp /bin/bash /tmp/mynewroot/bin/bash
cp -a /lib /tmp/mynewroot/lib
cp -a /lib64 /tmp/mynewroot/lib64#ls, pwd ve cat komutları için de ayni işlemi uygulayalım.cp /bin/ls /tmp/mynewroot/bin/ls
cp /bin/pwd /tmp/mynewroot/bin/pwd
cp /bin/mkdir /tmp/mynewroot/bin/mkdir
cp /bin/cat /tmp/mynewroot/bin/cat
# Son olarak birkaç yeni dizin ekleyelim.mkdir /tmp/mynewroot/opt
mkdir /tmp/mynewroot/tmp
mkdir /tmp/mynewroot/varchroot mynewroot /bin/bash
Shell üzerinde aslında /tmp/mynewroot dizini altında olmamıza rağmen kendimizi farklı bir root dizini ve aslında en önemlisi yeni bir işletim sistemi altında gibi görüyoruz artık.
Container teknolojisi chroot üzerine kurulmamıştır. Burada kullanım amacı container teknolojisinin nasıl çalıştığına bir bakış açısı getirmektir. Container teknolojisi Linux 2.6.24 versiyonu ile gelen namespace’ler üzerine geliştirilmiştir.
Bir sonraki yazıda namespace, cgroup gibi konulara girip nasıl sorusunun cevabını biraz data detaylandırıp ardından LXC’ ye doğru bir yolculuk yapabiliriz.
Şimdilik burada bırakalım.
Hatalı veya eksik bilgi olduğunu düşündüğünüz konularda geri bildirimleriniz çok önemli.
Docker ve container konusunda hazırladığı çok faydalı içerikle bana da ilham veren Gökhan Şengün’ün hazırladığı, aşağıda linkini paylaştığım yazı dizisine göz atmanızı tavsiye ederim.