Dockerfile, Docker Image, Docker Registry ve Docker Container Kavramları Nelerdir?
Merhaba,
.NET Core & Docker Yazı Dizisinin ikinci makalesinde Docker ile ilgili süreçte kaleme alacağımız makalelerde bizlere yardımcı olarak bazı kavramsal yapılar üzerine duracak ve gerekli izah ve izahatlerde bulunacağız.
Docker önceki makalemizde de incelediğimiz üzere uygulamaları işletim sistemine karşı var olan bağımlılıklarından koparıp sanallaştırılmış ortamlarda çalışabilir hale getirmeyi amaçlayan bir platformdur. Bu şekilde kompleks tarzda ve ağır mimarisel planlarla tasarlanmış uygulamaları, yüksek kullanılabilirlik(high availability) sağlayarak ve bir yandan da sıfır kesinti süresi(zero down time) ile güncellemeleri direkt olarak uygulamalara yansıtarak yayınlamakta ve tüm bunların yanında hiçbir zahmete katlanmaksızın yapılan işleri geri alabilmemizi sağlayabilen bir özelliğide bünyesinde barındırmaktadır.
Haliyle bu niteliklere sahip olan bir platformun kavramsal olarak oldukça zengin olması kadar doğal bir durum olmasa gerek. O halde gelin Docker’a dair ileride ihtiyacımız olacak olan ve bir uygulamayı Dockerize edebilmek için bilmemiz gereken Dockerfile, Docker Image ve Container kavramlarını tanıyalım.
Dockerfile
Maddenin temel yapıtaşı nasıl atom ise Docker projelerinin temel yapıtaşı Dockerfile’dır. Sözün alıntılandığı kaynak için tıklayınız.
Dockerfile, uygulamanın ana root dizininde herhangi bir uzantısı olmayan ve ismi birebir ‘Dockerfile’ şeklinde olan bir dosyadan ibarettir. İçerisinde yayınlanacak olan uygulamanın nasıl bir ortamda çalışacağına dair talimatları barındırmaktadır. Örneğin; geliştirme yapılan herhangi bir Asp.NET Core uygulamasının, hangi işletim sistemi üzerinde kaçıncı versiyonla ayağa kaldırılacağını ve hangi dll dosyalarının yüklü olması gerektiği vs. gibi talimatlar belirtilebilmektedir.
Dockerfile sayesinde verilen talimatlar neticesinde sunucu yapılandırması gibi zahmetli bir işten kurtulanmakta ve böylece geliştiriciye olan bağımlılıkta olabildiğince izole edilmiş olmaktadır. Nihayetinde, işten ayrılan bir personelin ayağa kaldırdığı bir uygulamayı nasıl ve ne şekilde gerçekleştirdiğine dair bir telaşa kapılmaksızın Dockerfile dosyası sayesinde tek bir komut ile aynı proje tekrar aynı özelliklerle ayağa kaldırılabilmekte ve böylece projenin özgürlüğünü desteklemektedir.
Docker Image
Docker build edildikten sonra Dockerfile dosyasında belirtilen talimatlara göre read only özellik gösteren static yapıda image(imaj) dosyası oluşturulur.. Dockerfile içerisinde belirtilmiş her bir satıra karşılık Docker Image içerisinde bir layer oluşur. Dolayısıyla imageler bir katman(layer) topluluğudur. Örneğin; Dockerfile içerisinde 4 satırlık talimat varsa o halde 4 katmanlı bir Docker Image oluşturulacaktır.
Docker Image’lar da Dockerfile dosyası içerisinde belirtilen talimatlara göre işletim sistemi, enviroment ve publish data verileri bulunur. Bir nevi, amaca yönelik container’ların çalışması için önceden tasarlanmış tak çalıştır mantığında işlev gören kalıplardırda diyebiliriz. Docker Image’leri ister kendimiz yaratabilir istersekte belirli firmaların sunduğu hazır Docker kalıplarını kullanabiliriz.
Peki hazır Docker kalıplarını nereden elde edebiliriz?
Bunun için Docker Registry başlığını inceleyelim.
Docker Registry
İmajların kaydedilip dağıtılabildiği bir ortam olarak düşünebiliriz. Sol taraftaki görüntüdeki dolabı Registry gibi düşünürsek eğer her bir raftaki kutuyuda tek bir amaca hizmet eden imajlar olarak değerlendirebiliriz.
Görüldüğü üzere registry’e depolanan bir imaja çok hızlı bir şekilde erişebilir ve gerekirse üzerinde değişiklikler yapıp farklı bir versiyon olarak yeniden gönderebiliriz.
Hazır registry ortamını sağlayan firmalar hangileridir?
Uygulamanıza dair hazır imajlar barındıran mevcuttaki birkaç cloud registry firmasını aşağıda görebilirsiniz.
- Docker Hub Registry
Private uygulamaya 1 adet sınırlaması vardır. Public sınırsızdır. - Azure Container Registry
- AWS Container Registry
- Google Container Registry
- Quay Registry
Peki neden imajları registry etmek isteriz?
- Yapılan çalışma neticesinde elde edilen imajlarımızı cloud’da ki registry ortamına depolayarak güvence sağlayabilmek için,
- İhtiyaca dönük sunucular arasındaki imaj transferini daha hızlı ve sağlıklı sağlayabilmek için,
- Ayağa kaldırılacak uygulamadaki temel dosyaların, işletim sisteminin ve environment(ortam) yapılanmasının getireceği iş yükünden kaçınmak ve hazır imaj kullanarak bu tarz maliyetleri minimize etmek için
imajları registry ediyor yahut registry’dan çekip kullanıyoruz…
Docker Container
Docker Image dosyasını Dockerfile içerisindeki talimatlara göre oluşturduktan sonra uygulamanın çalıştırılabilmesi için run edilmesi gerekmektedir. Run neticesinde bir container ayağa kaldırılır ve böylece ilgili uygulama ayağa kaldırılmış olacaktır.
Container, Docker Imagelerin çalışabilen instance’larıdır.
Bir Docker Image üzerinden istenildiği kadar Container ayağa kaldırılabilir. Burada Docker Image uygulama için bir fabrika görevi görmektedir. Ayrıca Containerlar; durdurulabilir, silinebilir, tekrardan oluşturulabilirler. (Read/Write)
Docker Image ve Container Örneklendirmesi
Yukarıdaki şemaya göz atarsak eğer Dockerfile dosyası içerisinde verilen talimatlar kadar Docker Image içerisinde katman oluşturulduğunu görmekteyiz. Bu imaj üzerinden ayağa kaldırılan tüm container instanceları, öncelikle imaj üzerine eklenen hem okunabilir hem yazılabilir katman üzerinden ayağa kaldırılmaktadırlar. Bu okunabilir/yazılabilir katmanın amacı uygulama içerisinde yapılan tüm işlemlerin gerçekleştirilmesi içindir. İlgili katmanın container’a bağlı olmasından dolayı container silindiğinde de yok olacağından dolayı haliyle yapılan tüm işlemler geri dönüşsüz kaybolmuş olacaktır.
Netice olarak bu yazımızda Docker platformuna dair temel yapısal kavramları tanımlama ve tanıma üzerine teorik izahatlerde bulunmuş olduk. Makalelerimiz ilerledikçe yavaş ama sindire sindire Docker’ın derinliklerine adım adım giriyor olacağız. Sükunetle takipte kalın 🙂
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
Teşekkürler