Docker İmajları

Docker imajları oluşturmak, Dockerfile kullanımı ve katman yapısını anlamak

Kubedo Academy’e hoş geldiniz! Bu laboratuvarda Docker imajları oluşturmayı, Dockerfile kullanmayı ve katman yapısını öğreneceksiniz.


Zorluk seviyesi: Başlangıç
Süre: Yaklaşık 25 dakika

İçindekiler


Giriş

Önceki bölümde, container içerisinde çalıştırmak için imajları Docker Hub‘dan indirmiştik. Şimdi kendi imajlarımızı nasıl oluşturacağımızı öğreneceğiz.

Docker Hub’da 700.000’den fazla imaj mevcut olsa da, kendi ihtiyaçlarınıza göre özelleştirilmiş imajlar oluşturmak isteyeceksiniz.


1. Container’dan İmaj Oluşturma

Bir ubuntu container’ında interaktif shell çalıştırarak başlayalım:

Terminal
$ docker container run -ti ubuntu bash

Container içinde figlet paketini kuralım:

Terminal
$ apt-get update
apt-get install -y figlet
figlet "selam docker"

Container’dan çıkın:

Terminal
$ exit

Container’ı İmaj Olarak Kaydetme

Container ID’sini bulun:

Terminal
$ docker container ls -a

Değişiklikleri analiz edin:

docker container diff <container_ID>

Container’ı commit ederek imaj oluşturun:

docker container commit <container_ID>

İmajları listeleyin:

Terminal
$ docker image ls

İmaj Etiketleme

İmajı anlamlı bir isimle etiketleyin:

docker image tag <IMAGE_ID> bizimfiglet
docker image ls

Yeni imajı test edin:

Terminal
$ docker container run bizimfiglet figlet merhaba docker
Container'ın imaj olarak kaydedilmesi
docker commit ile imaj oluşturma

[!TIP] Manuel kurulum yerine Dockerfile kullanmak çok daha iyi bir yöntemdir. Takip eden bölümde bunu öğreneceğiz.


2. Dockerfile ile İmaj Yaratma

Dockerfile, imaj oluşturma talimatlarını içeren bir metin dosyasıdır. Bu yöntemin avantajları:

  • Tekrarlanabilirlik - Her seferinde aynı imaj
  • Versiyon kontrolü - Git ile yönetilebilir
  • Paylaşılabilirlik - Başkalarıyla kolayca paylaşılır

Örnek: Node.js Uygulaması

index.js dosyası oluşturun:

var os = require("os");
var hostname = os.hostname();
console.log(hostname + " sunucusu içinden merhaba");

Dockerfile oluşturun:

FROM alpine
RUN apk update && apk add nodejs
COPY . /app
WORKDIR /app
CMD ["node","index.js"]

Dockerfile Komutları

KomutAçıklama
FROMTemel imajı belirtir
RUNContainer içinde komut çalıştırır
COPYDosyaları container’a kopyalar
WORKDIRÇalışma dizinini ayarlar
CMDContainer başladığında çalışacak komutu belirtir

İmajı Oluşturma

Terminal
$ docker image build -t hello:v0.1 .
Dockerfile'dan imaj oluşturma
docker build ile imaj oluşturma

Test edin:

Terminal
$ docker container run hello:v0.1

[!NOTE] Aristo’nun sözü Docker için: “Bir sistem yöneticisine bir imaj verin, uygulamaları bir gün güncel olsun. Bir Dockerfile verin, uygulamaları her zaman güncel olsun.”


3. İmaj Katmanları

Docker imajları katmanlardan oluşur. Her Dockerfile komutu yeni bir katman oluşturur.

Katman Geçmişi

docker image history <image_ID>
Docker katmanlı yapısı
Docker imaj katmanları

Cache Kullanımı

Uygulamayı güncelleyin:

Terminal
$ echo "console.log(\"surum v0.2\");" >> index.js

Yeniden build edin:

Terminal
$ docker image build -t hello:v0.2 .

“Using cache” mesajına dikkat edin - Docker değişmeyen katmanları yeniden kullanır!

Docker cache kullanımı
Katman önbellekleme

[!IMPORTANT] Katmanlar immutable (değişmez)‘dir. Bu hem güvenlik hem de verimlilik sağlar.


4. İmaj İnceleme

Bir imajın detaylarını incelemek için:

Terminal
$ docker image inspect alpine

Belirli Bilgileri Filtreleme

Katmanları görüntüleme:

Terminal
$ docker image inspect --format "{{ json .RootFS.Layers }}" alpine

Alpine tek katmandan oluşur:

["sha256:60ab55d3..."]

Hello imajımız ise üç katmandan oluşur:

  1. Alpine base image (FROM)
  2. apk install (RUN)
  3. Uygulama dosyaları (COPY)

5. Terminoloji

TerimAçıklama
LayersDocker imajını oluşturan katmanlar. Her Dockerfile komutu bir katman oluşturur.
Dockerfileİmaj oluşturma talimatlarını içeren metin dosyası.
VolumesKalıcı veri depolama için özel Docker bileşeni. Container’dan bağımsız olarak veri saklar.
CacheDeğişmeyen katmanların yeniden kullanılması için önbellek.

Konu Tekrarı - Kısa Sınav


Sonraki Adım

Geliştiriciler için Docker →