- Konu sahibi
- #1
Docker image, bir uygulamayı çalıştırmak için gereken dosyaları, bağımlılıkları ve varsayılan komutları içeren salt-okunur şablondur. Container ise bu image kullanılarak oluşturulan ve çalışan ya da durdurulmuş durumdaki uygulama örneğidir. Kısaca image kalıp, container ise o kalıptan oluşturulan çalıştırılabilir örnektir.
Bir image tek başına çalışan bir süreç değildir.
Image genellikle paylaşılır, sürümlenir ve değiştirilmeden saklanır. Container ise image'ın belirli bir çalıştırma örneğidir. Aynı image'dan birden fazla container oluşturulabilir; her biri farklı port, isim veya ayarla çalışabilir.
Container silinirse yalnızca container'ın yazılabilir katmanındaki veriler kaybolabilir. Kalıcı veriler için volume veya sunucudaki bind mount kullanılmalıdır. Çalışan container içinde sonradan yazılan dosyalar temel image'ı değiştirmez; yalnızca ilgili container'ın geçici katmanında tutulur.
Önkoşul olarak Docker Engine kurulmuş ve Docker daemon çalışıyor olmalıdır. Aşağıdaki örnek, Nginx image'ını indirir,
Güncel Docker’ın varsayılan bridge düzeninde
En sık yapılan hata, container silinince image'ın da silindiğini sanmaktır.
Bir başka hata da image içindeki dosyaları kalıcı depolama sanmaktır. Image yeniden oluşturulduğunda veya container yenilendiğinde container katmanındaki değişiklikler otomatik olarak yeni image'a aktarılmaz. Kalıcı olması gereken dosyaları volume'e taşıyın ve uygulamanın hangi dizine yazdığını doğrulayın.
Bir image tek başına çalışan bir süreç değildir.
docker run komutu image'ı kullanarak yeni bir container oluşturur; container'a ayrı bir isim, ağ, ortam değişkenleri ve yazılabilir geçici katman verir.Temel farklar
Image genellikle paylaşılır, sürümlenir ve değiştirilmeden saklanır. Container ise image'ın belirli bir çalıştırma örneğidir. Aynı image'dan birden fazla container oluşturulabilir; her biri farklı port, isim veya ayarla çalışabilir.
| Özellik | Docker image | Container |
|---|---|---|
| Görevi | Çalışma ortamı şablonunu taşır | Uygulamayı çalıştırır |
| Durumu | Salt-okunur katmanlardan oluşur | Çalışan veya durmuş olabilir |
| Oluşturma | Dockerfile'dan derlenebilir veya registry'den indirilebilir | Image ile docker run kullanılarak oluşturulur |
| Veri | Uygulama dosyalarını içerir | Geçici yazma katmanına ve bağlanan volume'lere sahip olabilir |
Container silinirse yalnızca container'ın yazılabilir katmanındaki veriler kaybolabilir. Kalıcı veriler için volume veya sunucudaki bind mount kullanılmalıdır. Çalışan container içinde sonradan yazılan dosyalar temel image'ı değiştirmez; yalnızca ilgili container'ın geçici katmanında tutulur.
Somut örnek: Bir image'dan container çalıştırmak
Önkoşul olarak Docker Engine kurulmuş ve Docker daemon çalışıyor olmalıdır. Aşağıdaki örnek, Nginx image'ını indirir,
web-demo adlı bir container başlatır ve sunucunun yalnızca yerel adresindeki 8080 portundan erişime açar.- Nginx image'ını indirin ve container'ı arka planda başlatın:
Başarılı olursa Docker bir container kimliği döndürür. Image yerel makinede yoksa önce registry'den indirilir.Kod:docker run -d --name web-demo -p 127.0.0.1:8080:80 nginx - Container'ın çalıştığını kontrol edin:
Kod:docker ps curl http://127.0.0.1:8080docker psçıktısındaweb-demogörünmeli,curlise Nginx'in HTML yanıtını döndürmelidir. - Container'ın hangi image'dan oluşturulduğunu inceleyin:
ÇıktıKod:docker inspect --format '{{.Config.Image}}' web-demonginxolmalıdır. Bu, çalışan container ile onu oluşturan image arasındaki ilişkiyi gösterir. - İşiniz bittiğinde container'ı durdurup kaldırın:
Kod:docker rm -f web-demo
Sonuç beklenenden farklıysa
docker ps içinde container görünmüyorsa docker ps -a ile durmuş container'ları da listeleyin. Container hemen kapanıyorsa, image'ın varsayılan komutu tamamlanmış veya hata vermiş olabilir; docker logs web-demo ile kayıtları inceleyin. 8080 portu kullanımda ise başka bir host portu seçin; örneğin -p 127.0.0.1:8081:80. Bu durumda erişim adresi de 8081 olur.Güncel Docker’ın varsayılan bridge düzeninde
127.0.0.1 yayını erişimi hostla sınırlar. Docker’ın 28.0.0 öncesi sürümlerinde aynı yerel ağ segmentinden erişim istisnası belgelendiğinden eski bir kurulumu yalnız bu ayara güvenerek yalıtılmış saymayın. Dışarıdan erişim gerekiyorsa port eşlemesindeki host adresi ayrıca değerlendirilmelidir; yalnızca portu değiştirmek uygulamanın container içindeki dinleme portunu değiştirmez.Karar verirken dikkat edilmesi gerekenler
- Uygulamanın çalıştırılabilir paketine ihtiyaç duyuyorsanız image seçin veya Dockerfile ile image oluşturun.
- Uygulamayı başlatmak, durdurmak, yeniden başlatmak ve ağa bağlamak için container yönetin.
- Aynı uygulamanın birden fazla örneği gerekiyorsa aynı image'dan ayrı container'lar oluşturun; her birine farklı isim ve çakışmayan host portu verin.
- Veritabanı veya yüklenen dosyalar gibi kalıcı verileri container'ın geçici yazma katmanına bırakmayın; volume ya da uygun bir bind mount kullanın.
- Üretimde image etiketini ve yapılandırmayı bilinçli seçin. Değişebilen bir etiket yerine doğrulanabilir bir sürüm veya digest kullanmak, aynı image'ın tekrar çalıştırılmasına yardımcı olur.
En sık yapılan hata, container silinince image'ın da silindiğini sanmaktır.
docker rm container'ı kaldırır; image'ı kaldırmaz. Image'ı ayrıca silmek için docker rmi kullanılır. Tersine, image'ı silmeye çalışırken onu kullanan container varsa Docker işlemi reddedebilir; önce ilgili container'ların durumunu kontrol etmek gerekir.Bir başka hata da image içindeki dosyaları kalıcı depolama sanmaktır. Image yeniden oluşturulduğunda veya container yenilendiğinde container katmanındaki değişiklikler otomatik olarak yeni image'a aktarılmaz. Kalıcı olması gereken dosyaları volume'e taşıyın ve uygulamanın hangi dizine yazdığını doğrulayın.
Kaynaklar
Sık sorulan sorular
Bir image'dan aynı anda birden fazla container çalıştırılabilir mi?
Evet. Her container kendi kimliğine ve çalışma durumuna sahip olur. Aynı host IP’si, port ve protokol birleşimini iki ayrı yayın aynı anda kullanamaz. Port yayınlamayan container’ların ise sırf çoğaltıldıkları için host portu ayırması gerekmez.Container durdurulunca image silinir mi?
Hayır. Durdurulan container yerel olarak kalabilir ve yeniden başlatılabilir. Image da ayrıca saklanır; container ile image birbirinden bağımsız olarak yönetilir.Dockerfile ile image arasındaki ilişki nedir?
Dockerfile, image'ın nasıl oluşturulacağını tarif eden metin dosyasıdır.docker build çalıştırıldığında Dockerfile'daki adımlar uygulanır ve sonucunda yeni bir image üretilir.