Docker File, Image ve Container

1. Docker File

Dockerfile,  bir image görüntüsü oluşturmak için var olan tüm katmanların belirtildiği uzantısı olmayan dosyadır. Docker file’da hangi Image’ın kullanılacağı, hangi dosyaların dahil edileceği ve hangi uygulamanın hangi parametrelerle çalışacağı belirtilir. Docker, Docker file dosyasında bulunan komutları sırayla tek tek çalıştırır. Her komut yeni bir layer oluşturur.

2. Docker Image & Container

Image’lar containerlar için taslaklardır. Bu taslak runtime environmentlar, application code, tüm dependencyler ve extra configuration (e.g env variables) gibi şeyleri içerir. Dockerfile build edildikten sonra elimizde uygulamaya ait Docker Image oluşur. Imageler kendi file sistemine sahiptir ve read only olup değiştirilemezler. Imagelarda bir şey değiştirmek istediğimizde imajı tekrar yaratmanız gerekir. Kısaca, bir uygulamanın ve onun içinde çalışması için gereken kütüphane ve öğelerin paketlenmiş haline docker image deriz. İçinde sanallaştırılmış kernel yoktur. Çünkü konteynerlar üzerinde koştukları makinanın işletim sistemlerinin kernelini kullanır. 

Container image’ın çalışan instance’sı ve izole olmuş processidir. Bilgisayardaki diğer tüm processlerden ayrı çalışır. Yani docker engine yüklü olan herhangi bir bilgisayar bu imagei indirir ve istediğim kadar konteyner oluşturabilir. Uygulamanın çalışması için her şeyi içeren bir image yaratırız. Sonra image’ı run ederek container yaratırız. Bilgisayarımızda hangi yazılımın version hangi bağımlılıkların yüklü olduğu önemli değildir. Çünkü uygulamanın ihtiyaç duyduğu tüm bağımlılıklar container içerisinde bulunur. Bu sayede uygulamayı kendi bilgisayarında run etmek isteyen herkesle image’ı paylaşabiliriz ve paylaştığımız kişinin bilgisayarında neyin hangi versiyonunun yüklü olduğunun önemli olmaz. Bizim bilgisayarımızda nasıl çalışırsa karşıdaki kişinin bilgisayarında da aynı şekilde çalışır.

Her container imajında, o imajdan bir container yarattığımız zaman varsayılan olarak çalıştırışması için ayarlanmış bir uygulama vardır. Bu uygulama çalıştığı sürece container ayakta kalır. Uygulama çalışmayı bıraktığıda container da kapanır. Ayrıca, bir docker imageinin içinde birden fazla uygulama olabilir. Zaten docker bir linux dağılımının içinde çekirdek olmayanı demektir.

Aynı imajı kullanıp 10 farklı konteyner bile yaratabilirsiniz ve bunlar 10 farklı sanal makina gibidir. Birinin içinde değişiklik yapılması diğer aynı imajdan türetilen veya türetilecek olan konteynarları ve çıktıları etkilemez. Bunları apayrı makinalar gibi düşünmek gerek, hiçbiri birbirinin dosyasına sahip değildir.

Docker Engine

Docker Engine kısaca image, container ve bunların tamamlayıcısı olan volume ve networkler oluşturarak yönetmenizi sağlayan docker deamon ve o deamonla iletişim kurmanızı sağlayan rest api ve docker clienttan oluşan enginedir.

Imagelar farklı layerlardan oluşur.

Parent image : OS ve runtime enviromentleri tanımlar. Bu da bir pre-made docker image’dır.

Diğer layerlar : Parent layerin üzerinde durur ve imageimiza eklemek istediğimiz source code, dependencies gibi herhangi şeyler burada yer alabilir.

hub.docker.com üzerinden diğer pre-made imagelara ulaşabilirsiniz.

3. Layer Caching

Docker file’daki her satır yeni bir layer oluşturur olarak düşünebilirsiniz. Çünkü her satır imajda yeni bir şey ekler. Her layer bir diğerinin üstüne oturur ve her bir layer docker’a yapması için yeni bir iş ekler.  Bir docker fileını run ettiğinizde bu layerların sırayla çalıştığını görebilirsiniz. Aşağıda sıfırdan çalıştırılmış bir docker file mevcut ve her bir layer için ilgili bağımlılık yüklenir. Bu da belli bir süre alır.

Ancak aynı docker file’ı source code’umuzu biraz değiştirip tekrar run ettiğimizde göreceğimiz şey bazı layerların tekrardan yüklenmek yerine cacheten kullanıldığıdır. Docker değişiklik yapılan layerın altında kalan layerları cachten kullanmıştır. Source codeınızda yapacağınız değişikliğin etkilediği command COPY . . olduğu için bu layer ve dolayısıyla üstündeki tüm layerlar yeniden yüklenmiş ancak öncekiler cacheten kullanılmıştır. Bu noktada docker file’ınızı oluştururken source kod değişiklikleri sonrası cachten kullanılamayacak layerları olabildiğinde üstlerde ve cachten faydalanmak istediğiniz layerları alt layerlarda tutmak gerekir ancak bunu yaparken layerlar arası bağımlılığa da dikkat etmek gerekir.

4. Docker’da Veri Saklama

Elimizdeki image’ı kullanarak bir container oluşturduğumuz ve içerisinde file1.txt ve file2.txt adında iki dosya eklediğimizi varsayalım. Ardından bu containerı durdurup aynı image ile yeni bir container başlattığımızda eklenen file’lar yok olur. Standart bir container içinde yaptıgımız değişiklikler o container sonlandığında container ile birlikte son bulur. Yeni bir container oluştursak da kendi eklentilerimiz kaybolmuştur çünkü yine image baz alınır ve container image’a göre oluşturulur.

O zaman ben docker içindeki bilgilerimi nasıl saklarım. Docker bunun için bind mount, volumes ve tmpfs adında üç çözüm sunar. Ana mantık ; container içinde bir klasör yani target belirleriz ve bu klasörün içeriğini nerede saklaması gerektiğini yani source’u belirtiriz.

4.1 Bind Mount

Yarattığımız dosyaları Docker dışında bir klasörde saklayabiliriz ve docker dışındaki processler de bu dosyalara erişebilir. Diğer tüm processlerin dosyaya erişme ve değiştirme yetkisi olduğundan geliştirme aşamasında kullanılması tavsiye edilip ancak live esnada kullanılması tavsiye edilmez.

source –> /mydocuments/temp (kendi bilgisayarımda içinde seçtiğim klasör)     
target–> /mytemp    (konteyner içinde seçtiğim klasör)

4.2 Volume

Bilgileri bilgisayarın içinde dockerın yönettiği bölümde saklar. Bu yüzden source yerine bir klasör değil de isim verilir. Docker dışı processler buraya dokunamaz. Volume seçeneği docker tarafından da tavsiye edilen en iyi veri yönetme seçeneği olup live ortamda bunun kullanılması tavsiye edilir. Veriyi birden fazla konteyner arasında paylaştırmak için kullanılır. Backup edilmesi kolaydır.

source –> volume name (bir volume ismi /var/lib/docker/volumes/** içinde docker tarafından klasör yaratılarak yönetilir)     
target–> /mytemp    (konteyner içinde seçtiğim klasör)

4.3 TMPFS

tmpfs dosyaları bilgisayarın hafızasında tutan saklama yöntemidir. Hiç bir şekilde diske yazılmaz. Bu nedenle source için hiç bir değer verilmez.

source –> X (her şey hafızada olduğu için yer belirtmeye gerek yok. Source bilgisayarın hafızasıdır)
target –> mytemp (konteyner içinde seçtiğim klasör)

You may also like...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir