Docker, container imajları container ekosisteminin temelini oluşturan bileşenlerden birisidir. Temel olarak container imaj tanımını, uygulama containerları oluşturmak için sadece okuma yapabildiğiniz dosyalar olarak düşünebilirsiniz.
Docker imajları containerlarımızı oluşturduğumuz Read Only dosyalardır. Bu dosyalar “layers” olarak tanımlanan katmanlı bir yapıdan oluşur. Pratikte bir container imajı tek bir dosyadan oluşmaz. Her katman aslında dockerfile’ da bir yönerge veya talimattır.
FROM ubuntu:17.10
COPY . /app
RUN make /app
CMD python /app/app.py
Örnek olarak yukarıda ki gibi olan bir dockerfile’ a sahip imaj dosyası, ubuntu 17.10 versiyonunu temel alan ve ardından bir takım dosya kopyalama ve bazı komutların çalıştırılmasını içeren katmanlar içermektedir. Her katman bir önceki katmandan bazı farklılıklar gösterir, bunları işletim sisteminde yaptığınız değişiklikler olarak düşünebilirsiniz.
Her imajın katmanlı bir yapıdan oluştuğunu imajı pull ederken de görebiliyoruz.
Resim-1
Bu katmanların bütünlükleri ayrı ayrı korunur. Yani her katmanın kendine özel bir hash (Content Hash) değeri vardır. En sonunda tüm katmanları hep beraber hashlenir ve buna Distribution hash denir. Bu hash indirdiğiniz imajın gerçektente ilgili yayımlayıcı tarafından olup olmadığınında doğrulamanın yoludur. İmaj güvenliği açısından bu önemli bi konu.
Imajın bütünlüğünü kontrol etmek için imaj indirdiğiniz de size iletilen hash’ ı indirdiğiniz yerde ki hash ile karşılaştırmalısınız.
Imajın mevcut imajınızın hash değerini görmek için “docker images –digests” komutunu çalıştırabilirsiniz.
Resim-2
İmajlarla ilgili tüm detaylı bilgileri ise “docker inspect microsoft/dotnet” komutu ile alabilirsiniz.
Resim-3
Resim-4
Resim-5
Bir imajın geçmiş bilgisini görmek için, imaj üzerinde hangi işlemler yapılmış ve hangi katmanlar oluşturulmuş “docker history” komutunu kullanabilirsiniz. Aşağıda gördüğünüz gibi Docker imajımıza öncelikle temel Windows Server imajı uygulanmış, güncellemeler kurulmuş, ve bazı komutlar çalıştırılmış.
Resim-6
Docker hub üzerinden bir imaj indirdiğimiz zaman docker varsayılan olarak “latest” taglı imajı indirir. Bu docker hub tarafından uygulanan otomatik bir yöntemdir. Tüm Container Registrylerde bu yöntem uygulanmaz.
Resim-7
Bu her zaman sizin isteğiniz senaryo olmayabilir. Bu yüzden ilgili imajın kendisini özel olarak belirtmelisiniz.
Resim-8
Resim-9
Yukarıda ki istenilen imaj tanımının gerçek görünümü aşağıda ki gibidir.
Yani bizim kullanımımızda aslında aldığımız imaj; docker.io/microsoft/dotnet:2.1.300-sdk
İndirdiğiniz imajı kullanarak yeni bir container oluşturduğunuzda, yukarıda bahsettiğimiz gib docker bu imaj üstüne yazılabilir bir katman daha ekler.
Resim-10
Eklenen bu yazılabilir katman Docker container’ının silinmesi ile beraber silinir.
Resim-11
Fakat container oluşturulmak için kullanılan imaj değişmeden kalır. Çünkü aslında bu imaj üzerinde herhangi bir işlem yapılmamıştır.
Bir docker imajında yazılan verilerin tutulmasını istiyorsanız, Docker container’larınıza volume’ler eklemelisiniz.
Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.
Referanslar
TAGs: docker, containers, docker images, docker image security, docker işletim sistemleri, docker imaj güvenliği, docker storage drivers, docker hub, dockerfile