Docker görüntüleri nasıl çalışır?

Tamamlandı

Kapsayıcı görüntüsünün uygulamaları dağıtmak için kullandığımız birim haline geldiğini söylemiştik. Kapsayıcının hem geliştirici hem de operasyon ekiplerimizin kullandığı standart bir biçimde olduğundan da bahsettik.

Burada Docker'da kullanılan yazılımlar, paketler ve görüntüler arasındaki farkları inceleyeceğiz. Bu kavramlar arasındaki farkı öğrenmek, Docker görüntülerinin nasıl çalıştığını daha iyi anlamanıza yardımcı olacaktır.

Ayrıca konakta çalışan işletim sisteminin rolü ile kapsayıcı çalışan işletim sisteminin rolüne de kısaca değineceğiz.

Kapsayıcı içinde paketlenmiş yazılımlar

Kapsayıcıya paketlenen yazılım, geliştiricilerimizin derledikleri uygulamalarla sınırlı değildir. Yazılımlar uygulama kodlarını, sistem paketlerini, ikili dosyaları, kitaplıkları, yapılandırma dosyalarını ve kapsayıcıda çalışan işletim sistemini kapsar.

Örneğin, şirketimizin çeşitli satış noktalarının kullanacağı bir sipariş izleme portalı geliştirdiğimizi varsayalım. Web uygulamasını çalıştıracak tüm yazılım yığınına göz atmamız gerekir. Derlediğimiz uygulama bir .NET Core MVC uygulamasıdır ve Ubuntu Linux'ta ters ara sunucu olarak nginx kullanarak uygulamayı dağıtmayı planlıyoruz. Tüm bu yazılım bileşenler, kapsayıcı görüntüsünün bir parçasını oluşturur.

Kapsayıcı görüntüsü nedir?

Kapsayıcı görüntüsü, yazılımları içeren bir taşınabilir pakettir. Çalıştırıldığında kapsayıcı haline gelen bir görüntüdür. Kapsayıcı, görüntünün bellek içi örneğidir.

Kapsayıcı görüntüsü sabittir. Bir görüntü derledikten sonra değiştiremezsiniz. Görüntüyü değiştirmenin tek yolu yeni bir görüntü oluşturmaktır. Bu özellik, üretimde kullanılan görüntünün geliştirme ve QA aşamalarında kullanılan görüntüyle aynı olmasını garanti eder.

Konak işletim sistemi nedir?

Konak işletim sistemi, Docker altyapısının üzerinde çalıştığı işletim sistemidir. Linux üzerinde çalışan Docker kapsayıcıları konak işletim sistemi çekirdeğini paylaşır ve ikilinin işletim sistemi çekirdeğine doğrudan erişebilmesi şartıyla kapsayıcı işletim sistemi gerektirmez.

Diagram showing a Docker image with no base OS and the dependency on the host OS Kernel.

Ancak Windows kapsayıcılar için bir kapsayıcı işletim sistemine ihtiyaç duyulur. Kapsayıcı; dosya sistemi, ağ yönetimi, işlem zamanlama ve bellek yönetimi gibi hizmetleri yönetmek için işletim sistemi çekirdeğinden faydalanır.

Kapsayıcı işletim sistemi nedir?

Kapsayıcı işletim sistemi, paketlenmiş görüntünün parçası olan işletim sistemidir. Linux veya Windows işletim sistemlerinin farklı sürümlerini bir kapsayıcıya ekleme esnekliğine sahibiz. Bu esneklik, belirli işletim sistemi özelliklerine erişmemizi veya uygulamalarımızın kullanabileceği ek yazılımları yüklememizi sağlar.

Diagram showing a Docker image with an Ubuntu base OS and the dependency on the host OS Kernel.

Kapsayıcı işletim sistemi konak işletim sisteminden yalıtılır ve uygulamamızı dağıtıp çalıştırdığımız ortamdır. Görüntünün de sabit olduğu düşünüldüğünde bu yalıtım, uygulamanızın hem geliştirme hem de üretim aşamasında aynı ortamda çalışmasını sağlar.

Örneğimizde kapsayıcı işletim sistemi olarak Ubuntu Linux kullanıyoruz ve bu işletim sistemi geliştirme veya üretimden farklı değil. Kullanılan görüntü her zaman aynıdır.

Yığınlanabilir Birleştirme Dosya Sistemi (Unionfs) nedir?

Docker görüntüleri oluşturmak için kullanırız Unionfs . Unionfs , dallar olarak adlandırılan çeşitli dizinleri içerik birleştirilmiş gibi görünecek şekilde yığmanızı sağlayan bir dosya sistemidir. Bunu yaptığınızda içerik fiziksel olarak ayrı yerlerde tutulmaya devam eder. Unionfs, dosya sisteminizi oluştururken dal ekleyip kaldırmanıza olanak sağlar.

Diagram showing the stacking of layers in a Docker image created with unionfs.

Örneğin, daha önce bahsettiğimiz web uygulaması için bir görüntü oluşturduğunuzu varsayalım. Ubuntu dağıtımını, kök dosya sisteminin üzerine temel görüntü olarak eklemeniz gerekir. Ardından nginx ve web uygulamamızı yükleyeceğiz. Nginx ve web uygulamasını özgün Ubuntu görüntüsünün üzerine etkili bir şekilde katmanlıyoruz.

Görüntüden kapsayıcı çalıştırıldığında son bir yazılabilir katman oluşturulur. Ancak kapsayıcı yok edildiğinde bu katman kalıcı olmaz.

Temel görüntü nedir?

Temel görüntü, Docker scratch görüntüsünü kullanan bir görüntüdür. scratch görüntüsü, dosya sistemi katmanı oluşturmayan boş bir kapsayıcı görüntüsüdür. Bu görüntü, çalıştıracağınız uygulamanın konak işletim sistemi çekirdeğini doğrudan kullanabileceğini varsayar.

Üst görüntü nedir?

Üst görüntü, görüntülerinizi oluşturduğunuz kapsayıcı görüntüsüdür.

Örneğin, Ubuntu'dan scratch görüntü oluşturmak ve ardından Ubuntu yüklemek yerine Ubuntu'ya dayalı bir görüntü kullanacağız. Hatta nginx yüklü olan bir görüntüyü bile kullanabiliriz. Üst görüntü genellikle bir kapsayıcı işletim sistemi içerir.

Temel görüntü ile üst görüntü arasındaki temel fark nedir?

İki görüntü türü de yeniden kullanılabilir bir görüntü oluşturmanıza olanak tanır. Ancak temel görüntüler, son görüntü içeriği üzerinde daha fazla denetim sahibi olmamızı sağlar. Önceki bölümlerden hatırlayacağınız üzere bir görüntü sabittir; bir görüntüye yalnızca ekleyebilir ve çıkaramayın.

Windows'da, yalnızca Windows temel kapsayıcı görüntülerini temel alan kapsayıcı görüntüleri oluşturabilirsiniz. Microsoft, bu Windows temel kapsayıcı görüntülerini sağlar ve hizmet verir.

Dockerfile nedir?

Dockerfile, Docker görüntüsü derlemek ve çalıştırmak için kullanılan yönergeleri içeren bir metin dosyasıdır. Dosyada, görüntüyle ilgili şu özellikler tanımlanır:

  • Yeni görüntü oluşturmak için kullanılan temel veya üst görüntü
  • Temel işletim sistemini güncelleştirmek ve ek yazılım yüklemek için gerekli komutlar
  • Geliştirilmiş uygulama gibi eklenecek derleme yapıtları
  • Depolama ve ağ yapılandırması gibi kullanıma sunılması gereken hizmetler
  • Kapsayıcı başlatıldığında çalıştırılacak komutlar

Şimdi bu özellikleri örnek bir Dockerfile ile eşleyelim. ASP.NET Core web siteniz için bir Docker görüntüsü oluşturduğunuzu düşünün. Dockerfile aşağıdaki örnekteki gibi görünebilir:

# Step 1: Specify the parent image for the new image
FROM ubuntu:18.04

# Step 2: Update OS packages and install additional software
RUN apt -y update &&  apt install -y wget nginx software-properties-common apt-transport-https \
	&& wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb \
	&& dpkg -i packages-microsoft-prod.deb \
	&& add-apt-repository universe \
	&& apt -y update \
	&& apt install -y dotnet-sdk-3.0

# Step 3: Configure Nginx environment
CMD service nginx start

# Step 4: Configure Nginx environment
COPY ./default /etc/nginx/sites-available/default

# STEP 5: Configure work directory
WORKDIR /app

# STEP 6: Copy website code to container
COPY ./website/. .

# STEP 7: Configure network requirements
EXPOSE 80:8080

# STEP 8: Define the entry point of the process that runs in the container
ENTRYPOINT ["dotnet", "website.dll"]

Burada Dockerfile dosya belirtimini veya yukarıdaki örnekteki her komutun ayrıntılarını ele almayacağız. Ancak, bu dosyada görüntü yapısını işlememize olanak sağlayan birkaç komut olduğuna dikkat edin. Örneğin, COPY komut içeriği yerel makinedeki belirli bir klasörden oluşturmakta olduğumuz kapsayıcı görüntüsüne kopyalar.

Daha önce Docker görüntülerinin kullandığından unionfsbahsetmiştik. Bu adımların her biri, son kapsayıcı görüntüsünü oluşturma sürecinde önbelleğe alınmış bir kapsayıcı görüntüsü oluşturur. Bu geçici görüntüler önceki görüntünün üzerine katmanlanır ve tüm adımlar tamamlandıktan sonra tek görüntü olarak sunulur.

Son olarak son adım olan 8. adıma bakın. Dosyadaki ENTRYPOINT, görüntüden bir kapsayıcı çalıştırıldığında yürütülecek işlemleri belirtmektedir. Yürütülecek ENTRYPOINT veya başka bir işlem yoksa Docker, kapsayıcının yapması gereken bir şey olmadığı için bunu yorumlar ve kapsayıcıdan çıkar.

Docker görüntülerini yönetme

Docker görüntüleri başlangıçta bilgisayarınızda depolanan büyük dosyalardır ve bu dosyaları yönetmek için araçlara ihtiyacımız vardır.

Docker CLI ve Docker Desktop görüntüleri oluşturarak, listeleyerek, kaldırarak ve çalıştırarak yönetmemize olanak sağlar. Docker görüntülerini yönetmek için docker istemcisini kullanmanız gerekir. İstemci komutları doğrudan yürütmez ve tüm sorguları daemon'a dockerd gönderir.

Burada tüm istemci komutlarına ve komut bayraklarına yer vermek yerine en çok kullanılan komutların birkaçına göz atacağız. Bu modülün sonundaki Daha fazla bilgi edinin bölümü, tüm komutları ve komut bayraklarını ayrıntılı olarak kapsayan Docker belgelerinin bağlantılarını içerir.

Görüntü oluşturma

Docker görüntüsü oluşturmak için docker build komutu kullanılır. Daha önce oluşturduğunuz Dockerfile tanımını kullanarak bir görüntü derlemek istediğinizi düşünelim. Derleme komutunu gösteren bir örnek aşağıda verilmişti:

docker build -t temp-ubuntu .

Derleme komutunun oluşturduğu çıkış aşağıdadır:

Sending build context to Docker daemon  4.69MB
Step 1/8 : FROM ubuntu:18.04
 ---> a2a15febcdf3
Step 2/8 : RUN apt -y update && apt install -y wget nginx software-properties-common apt-transport-https && wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb && dpkg -i packages-microsoft-prod.deb && add-apt-repository universe && apt -y update && apt install -y dotnet-sdk-3.0
 ---> Using cache
 ---> feb452bac55a
Step 3/8 : CMD service nginx start
 ---> Using cache
 ---> ce3fd40bd13c
Step 4/8 : COPY ./default /etc/nginx/sites-available/default
 ---> 97ff0c042b03
Step 5/8 : WORKDIR /app
 ---> Running in 883f8dc5dcce
Removing intermediate container 883f8dc5dcce
 ---> 6e36758d40b1
Step 6/8 : COPY ./website/. .
 ---> bfe84cc406a4
Step 7/8 : EXPOSE 80:8080
 ---> Running in b611a87425f2
Removing intermediate container b611a87425f2
 ---> 209b54a9567f
Step 8/8 : ENTRYPOINT ["dotnet", "website.dll"]
 ---> Running in ea2efbc6c375
Removing intermediate container ea2efbc6c375
 ---> f982892ea056
Successfully built f982892ea056
Successfully tagged temp-ubuntu:latest

Önceki çıkışı anlamıyorsanız endişelenmeyin. Ancak çıktıda listelenen adımlara dikkat edin. Her adım yürütüldüğünde, derlenen görüntüye yeni bir katman eklenir.

Ayrıca yazılımları yüklemek ve yapılandırmayı yönetmek için bir dizi komut yürütüldüğüne dikkat edin. Örneğin 2. adımda apt -y update ve apt install -y komutları ile işletim sistemi güncelleştirilmektedir. Bu komutlar, bu adım için oluşturulan çalışan bir kapsayıcıda yürütülür. Komut çalıştırıldıktan sonra ara kapsayıcı kaldırılır. Arka plandaki önbelleğe alınmış görüntü, derleme konağında tutulur ve otomatik olarak silinmez. Bu iyileştirme, bu görüntüleri yeniden kullanan yeni derlemelerin daha hızlı oluşturulmasını sağlar.

Görüntü etiketi nedir?

Görüntü etiketi, bir görüntünün sürümünü oluşturmak için kullanılan bir metin dizesidir.

Yukarıdaki örnek derlemede "Successfully tagged temp-ubuntu: latest" şeklindeki son derleme iletisine dikkat edin. Görüntü derlerken -t komut bayrağını kullanarak görüntüye ad ve isteğe bağlı etiket ekleyebilirsiniz. Buradaki örnekte -t temp-ubuntu komutuyla görüntüye ad verilmiş ve son görüntü temp-ubuntu: latest olarak etiketlenmiştir. Etiket belirtmezseniz görüntü latest ile etiketlenir.

Bir görüntüye birden fazla etiket atanabilir. Kural gereği görüntünün en yeni sürümüne, latest (en son) etiketi ve görüntü sürüm numarası etiketi eklenir. Görüntünün yeni sürümünü yayımladığınızda "latest" etiketini yeni görüntüye atayabilirsiniz.

Microsoft, Windows için en son etikete sahip temel kapsayıcı görüntüleri sağlamaz. Windows temel kapsayıcı görüntüleri için kullanmak istediğiniz etiketi belirtmeniz gerekir. Örneğin, Sunucu Çekirdeği için Windows temel kapsayıcı görüntüsü şeklindedir mcr.microsoft.com/windows/servercore. Etiketleri arasında , ltsc2019ve ltsc2022bulunurltsc2016.

İşte başka bir örnek. .NET Core örneklerinin Docker görüntülerini kullanmak istediğinizi düşünelim. Burada, aralarından seçim yapabileceğiniz dört platform sürümü vardır:

  • mcr.microsoft.com/dotnet/core/samples:dotnetapp

  • mcr.microsoft.com/dotnet/core/samples:aspnetapp

  • mcr.microsoft.com/dotnet/core/samples:wcfservice

  • mcr.microsoft.com/dotnet/core/samples:wcfclient

Yukarıdaki görüntü listesinde, Microsoft'un birden çok .NET Core örneği sağladığını görebiliriz. Etiketler, görüntünün hangi örneklere başvuracağını belirtir: ASP.NET, WCF Hizmeti vb.

Görüntüleri listeleme

Docker yazılımı, makinenizde otomatik olarak bir yerel görüntü kayıt defteri yapılandırır. Kayıt defterindeki görüntüleri docker images komutuyla görüntüleyebilirsiniz.

docker images

Çıktı aşağıdaki örneğe benzer:

REPOSITORY          TAG                     IMAGE ID            CREATED                     SIZE
tmp-ubuntu          latest             f89469694960        14 minutes ago         1.69GB
tmp-ubuntu          version-1.0        f89469694960        14 minutes ago         1.69GB
ubuntu              18.04                   a2a15febcdf3        5 weeks ago            64.2MB

Listelenen görüntünün Name (Ad), Tag (Etiket) ve Image ID (Görüntü Kimliği) değerlerine sahip olduğuna dikkat edin. Hatırlayacağınız gibi bir görüntüye birden fazla etiket uygulayabilirsiniz. Yukarıdaki çıktıda bir örnek gösterilmektedir; görüntü adları farklı olsa da kimliklerin aynı olduğunu görebiliriz.

Görüntü kimliği, adından veya etiketinden ayırt edilemeyen görüntüleri tanımlamak ve yönetmek için kullanışlı bir yöntemdir.

Görüntü kaldırma

Yerel Docker kayıt defterinizdeki görüntüleri docker rmi komutuyla kaldırabilirsiniz. Kapsayıcı görüntüsü katmanları kullanılabilir toplam alana eklendiğinden, kapsayıcı ana bilgisayar diskinde yer tasarrufu yapmanız gerekiyorsa bu yararlı olur.

Kaldırmak istediğiniz görüntünün adını veya kimliğini belirtin. Bu örnekte, örnek web uygulaması, görüntü adı kullanılarak kaldırılmaktadır:

docker rmi temp-ubuntu:version-1.0

Kapsayıcı hala görüntüyü kullanıyorsa görüntüyü kaldıramazsınız. Komutu docker rmi , görüntüye dayalı kapsayıcıyı listeleyen bir hata iletisi döndürür.

Docker görüntülerinin temellerini, bu görüntüleri yönetmeyi ve bir görüntüden kapsayıcı çalıştırmayı inceledik. Şimdi kapsayıcı yönetme adımlarına geçeceğiz.

Bilgilerinizi kontrol edin

1.

Docker Desktop uygulamasıyla oluşturulan ve paylaşılan kapsayıcılı uygulamalar ve mikro hizmetler aşağıdaki işletim sistemlerinden hangisinde kullanılabilir?

2.

Kapsayıcı görüntüsünü yeniden oluşturmak için kullanılan doğru Docker komutu hangisidir?

3.

Kapsayıcı görüntüsünü en iyi ifade eden cümle aşağıdakilerden hangisidir?