Docker Bölüm 3: Docker Image

Docker

Birden çok katmandan oluşan ve Docker container’da için oluşturulmuş dosyalardır. Amaca yönelik, container’lar için tasarlanmış, önceden oluşturulmuş kalıplardır.

 

Docker Image Özellikleri

  • Container oluşturmak için salt okunur şablonlardır.
  • Bir manifest ve farklı obje dosyalarından oluşur. Manifest dosyasında indirilecek tüm dosyaların bilgileri saklanır.
  • Container silinmeden image silinemez. Bir image silinmek istenirse, öncelikle bu image ile bağımlı olan container’ların silinmesi gerekir.
  • Dockerfile kullanılarak oluşturulurlar.
  • Birden çok katmandan oluşurlar ve her katman, bir önceki katmanın uzantısıdır.
  • Her image dosyası kod, runtime, ortam değişkenleri, file system ve kütüphaneden oluşur.

 

Docker Image Yapısı ve Container Arasındaki Fark

Image dosyaları katmanlardan oluşurlar. Her bir katman, bir önceki katmanın uzantısıdır ve salt okunur durumdad yani kilitlidir, bu yüzden değiştirilemezler. İlk katmana temel katman denir.

Katmanlardan kasıt ayrı dosya ve klasörlerdir. Temel katmanda işletim sistemi dosyaları, kernel bulunmaktadır. Bir üst katmanda ise temel katmanda tanımlanmış değeri kullanarak yeni tanımlamalar yapılır ve bir üst katman tarafından kullanılır hale gelir.

Image dosyası oluşturulurken, oluşturulan her bir katman için sha256 algoritmasıyla bir hash code verilmektedir ve bununla şifrelenmiş hale getirilmektedir. Image silinirken bu hash code’larda tek tek silinirler.

Image bir sisteme indirildiğinde, sistem ona bir image id vermektedir. Container oluşturma işlemleri de bu image id kullanılarak oluşturulur ve takip edilir.

Container ise image kullanılarak yazılabilir bir katmanın oluşturulmasıdır.

Bir docker run komutu işlettiğimizde, kullanılacak olan sal okunur image dosyası alınır ve onu işlem yapılabilir, yazılabilir hale getiren bir container içerisine yüklenir. Bizim yaptığımız değişiklikler image dosyasına yansımaz, sadece container içerisinde kalır. Böylece image temel olarak birden fazla container tarafından kullanılabilir olarak kalır. Yine container’ı silersek bu image’i etkilemez, saklı kalmaya devam eder.

Image’ler genelde Docker Hub üzerinde konumlandırılırlar; ama kurumlar kendi Registry’lerine sahiptir. Buna DTR (Docker Trusted Registry) denir. Biz bir image üzerinden container ayağa kaldırmak istediğimizde ne olur?

Örneğin Nginx container ayağa kaldırdığımızı düşünelim.

Bunu yazdığımızda docker image’i direk almaz, başına ve sonuna bazı eklemeler yapar. Detaylarına bakalım.

Docker’da image yazım şekli 3 ayrı bölümden oluşur:

Registry / Repo / Tags

Registry, tutulduğu Registry, default Docker Hub yani docker.io’dur.

Repo yani kullanacağımız image

Tags ise version bilgisini gösterir, default olarak latest eklenir

Kısacası biz nginx yazdığımızda Docker bunu: docker.io/nginx:latest şekline dönüştürür.

Eğer bizim Docker Hub (Global namespace) içerisinde bir namespace’imiz var ise  var ise, o zaman bunu image’den önce belirtmemiz gerekir. Örneğin benim Docker Hub içerisinde ferhatsarikaya diye bir namespace’im var. Nginx’i buradan indireceksem:

Şeklinde yazmam gerekir. Docker bunu docker.io/ferhatsarikaya/nginx:latest haline dönüştürecektir.

 

Docker Image Komutları

Docker image ile ilgili tüm komutlar, docker image altında yer alır.

commit

Bir container’ı image haline getirmek için kullanırız.

Dikkat ederseniz image değil container kullandık, çünkü image’in böyle bir komutu yok.

Eğer kendi repository’imize göndereceksek image ismini verirken repomuzun adını da yazmamız gerekir. Örneğin ben ApacheWeb container’ımı apachestable ismi ile kendi repoma gönderecek şekilde image oluşturmak istiyorum. Şimdi komutunu yazalım:

history

Image’in katmanlarını gösterir.

inspect

Image detaylarına bakmak için kulanılır:

search

Image arama işlemleri için kullanılır:

Dikkat ettiyseniz image komuta eklenmedi, direk docker search şeklinde image aradık.

Bunun yanında bir namespace’i de listelememizi sağlar. Mesela kendi namespace’imi görelim:

ls

Lokaldeki image’leri listelemek için kullanılır:

prune

Lokaldeki tüm imageleri siler:

pull

Registry üzerinden image indirme işlemi için kullanılır:

push

Lokalimizde oluşturduğumuz image dosyasını registry’ye yani Docker Hub’a göndermek için kullanılır:

Push işlemini yapabilmemiz için Docker Hub’a giriş yapmış olmamaı gerekir, eğer yapmadıysak hata alırız. Giriş yapmak için:

deriz ve bizden username ve password bilgilerini isteyerek girişimiz yapılır. Eğer başka bir hesaba geçmek istersek

ile çıkar ve yeniden giriş yaparız.

rm

Lokaldeki bir image’i silmek için kullanılır:

tag

Tag’lenmemiş imageleri düzenlemek için kullanılır. Eğer ben container’ı commit’lerken bir repository ve image name vermezsem, bunlar none olarak gözükür. Mesela kopyalama isimli container’ımı direk commitleyeyim:

Bu durumdaki image’leri düzenlemek için tag komutunu kullanırız.

Örnek:

Bunun dışında istersek mevcut bir image’i de yeniden tag’leyebiliriz:

Not: Kaynak olarak Murat AKSU’dan faydalanılmıştır.

Data Science Earth

Data Science Earth ekibi, üst düzey Veri Bilim çözümleri üretmek amacı ile toplanmış akademisyenler ve uzmanlardan oluşmaktadır. Öncelikli olarak veri bilincini geliştirmeyi ve küreselleşen rekabet ortamında verinin gücünün doğru kullanılmasını sağlamayı amaçlamaktadır.

Sponsor

QuestionPro 35 farklı soru seçim özelliği ile anket çalışmalarımıza güç katmaktadır.