Yan yana
Docker ImagevsKonteyner
Docker image ile konteyner arasındaki fark nedir?
Güncellendi 3 dk okuma8 fark
Kısaca
Docker image, uygulamayı ve bağımlılıklarını taşıyan salt okunur bir şablondur; konteyner ise bu imajın kendi yazılabilir katmanı olan, çalışan bir örneğidir.
Docker Image
Docker image, bir uygulamayı, bağımlılıklarını ve ayarlarını içeren, salt okunur ve katmanlı bir pakettir; konteynerler bu şablondan başlatılır.
Docker Image sayfasını okuKonteyner
Konteyner, bir uygulamayı bağımlılıklarıyla paketleyip ana makinenin paylaşılan işletim sistemi çekirdeği üzerinde çalıştıran hafif, yalıtılmış bir pakettir.
Konteyner sayfasını okuDocker Image ve Konteyner karşılaştırması
| Özellik | Docker Image | Konteyner |
|---|---|---|
| Nedir | Katmanlar hâlinde saklanan, salt okunur bir şablon | Bir imajın çalışan ya da durdurulmuş bir örneği |
| Durum | Değişmez: derlendikten sonra hiç değişmez | Çalışırken değişen yazılabilir bir katmanı vardır |
| Nasıl oluşturulur | Bir Dockerfile'dan docker build ile | Bir imajdan docker run ya da docker create ile |
| Nerede yaşar | Yerel imaj deposunda ya da Docker Hub gibi bir registry'de | Ana makinenin konteyner çalışma zamanında, yalıtılmış süreçler olarak |
| Kimliği | Ad, etiket ve SHA-256 özeti | Konteyner kimliği (ID) ve adı |
| Sayı | Bir kez derlenir, sonra kopyalanır ve yeniden kullanılır | Tek bir imajdan aynı anda birçoğu çalışabilir |
| Kullandığı | Yalnızca disk alanı | Çalışırken CPU, bellek ve ağ |
| Benzetme | Bir sınıf ya da bir tarif | Bir nesne ya da tariften pişirilen bir yemek |
Fark, açıklamalı
Docker image (imaj), bir uygulamanın ihtiyaç duyduğu her şeyin paketlenmiş, salt okunur bir anlık görüntüsüdür: kodu, Node.js ya da Python gibi bir çalışma zamanı, sistem kütüphaneleri ve başlangıç komutu gibi varsayılan ayarlar. Konteyner ise bu imajı çalıştırdığınızda elde ettiğiniz şeydir: ana makinede kendi dosya görünümü, ağı ve kaynak sınırları olan yalıtılmış bir süreç ve imajın üstünde ince, yazılabilir bir katman. İmajları derler ve saklarsınız; konteynerleri başlatır, durdurur ve kaldırırsınız.
Aradaki ilişki bir sınıf ile nesneleri ya da bir tarif ile ondan pişirilen yemekler gibidir: tek bir imaj aynı anda istediğiniz sayıda konteyner başlatabilir ve her biri bağımsız çalışır. Bir konteyner bir dosyayı değiştirdiğinde değişiklik kendi yazılabilir katmanına gider; imaj ve diğer konteynerler etkilenmez. Bu yüzden bir imaj bir ad, postgres:17 gibi bir etiket ve bir içerik özetiyle (digest) tanımlanır; her konteyner ise kendi kimliğini (ID) ve adını alır.
Yaşam döngüleri de farklıdır. İmaj, docker build ile bir Dockerfile'dan oluşturulur, bir registry'ye gönderilir ve herhangi bir makineye çekilir; hiç değişmez, yeni bir sürüm yeni bir imajdır. Konteyner docker run ile oluşturulur, ana süreci çalıştığı sürece yaşar ve durdurulabilir, yeniden başlatılabilir ya da kaldırılabilir. OCI biçiminde oluşturulan imajlar containerd, Podman ve Kubernetes üzerinde de çalışır; konteyner imajı (container image) diye de anılmalarının nedeni budur.
Sık yapılan bir yanlış, çalışan bir konteynerin içinde yapılan değişikliklerin imajı güncellediğini düşünmektir. Güncellemez: konteynerin katmanına yazılan her şey, bir volume'a gitmediyse ya da yeni bir imaja commit edilmediyse konteyner kaldırıldığında kaybolur; commit etmek de nadiren iyi bir uygulamadır. Bir diğer yanlış, bir konteyneri silmenin imajını da sildiğini sanmaktır; imaj, siz onu docker rmi ya da bir temizlik komutuyla kaldırana kadar durur.
Hangisini kullanmalısınız?
Docker Image şu durumlarda doğru seçim:
- Bir uygulamayı bir kez paketleyip her ortama aynı şeyi göndermek istiyorsunuz.
- Bağımlılıkları, temel sistemi ya da başlangıç komutunu değiştiriyorsunuz:
Dockerfile'ı düzenleyip yeniden derleyin. - Dağıttığınız şeyi sürümlemeniz, taramanız ya da imzalamanız gerekiyor.
- Yazılımı Docker Hub gibi bir registry üzerinden paylaşmak istiyorsunuz.
Konteyner şu durumlarda doğru seçim:
- Uygulamayı gerçekten çalıştırmak, test etmek ya da hata ayıklamak istiyorsunuz.
- Aynı uygulamanın, her biri kendi port'ları ve ayarlarıyla birkaç yalıtılmış kopyasına ihtiyacınız var.
- Canlı bir süreci incelemeniz, loglarını okumanız ya da içinde bir shell açmanız gerekiyor.
- Ortam değişkenleri, volume'lar ya da kaynak sınırları gibi ayarlar her çalıştırmada değişiyor.
Tek imaj, birçok konteyner (Docker CLI)
# Image: build a read-only template from a Dockerfile, then share it
docker build -t registry.example.com/shop-api:1.4 .
docker image ls # the image, stored once
docker push registry.example.com/shop-api:1.4# Containers: start running instances of that image
docker run -d --name api-1 -p 8001:3000 registry.example.com/shop-api:1.4
docker run -d --name api-2 -p 8002:3000 registry.example.com/shop-api:1.4
docker ps # two containers, one image
docker rm -f api-1 # the image is untouchedSık sorulan sorular
Bir konteyner imaj olmadan çalışabilir mi?
Hayır. Her konteyner, dosyalarını ve varsayılan ayarlarını sağlayan bir imajdan başlar; konteyner bunun üstüne yalnızca yazılabilir bir katman ve çalışma zamanı durumu ekler.
Docker image ile konteyner imajı aynı şey mi?
Pratikte evet. Docker imajları OCI biçiminde oluşturur; bu yüzden aynı imaj containerd, Podman ya da Kubernetes üzerinde çalışır ve "konteyner imajı" araçtan bağımsız addır.
Bir konteynerin içinde yaptığım değişiklikleri nasıl korurum?
Kalması gereken veriyi bir volume'a koyun; yazılımın kendisindeki değişiklikleri ise Dockerfile'a yazıp imajı yeniden derleyin. docker commit bir konteyneri imaja çevirebilir, ama sonucu yeniden üretmek zordur.