İlk yazıda Docker’da çalışan konteynerlerin yaşam döngüsünü kontrol etmiştik ancak sistem kaynaklarını nasıl kullandığını ya da ağda nasıl bir davranış gösterdiğini sonraki yazılara bırakmıştık. Aslında Docker, kendi içinde çalışan tüm konteynerlerin hem süreçlerini hem de disk kullanım alanlarını birbirlerinden yalıtır. Her konteyner, bünyesinde ayrı işletim sistemi süreçleri işletilirken ayrı disk alanlarında çalıştırılır.
Peki bir Docker konteyneri verilerini nereye yazar ya da yazar mı? Bunu kim, nerede tanımlar? Bu soruların cevaplarını bulmak için öncelikle Docker’da volume kavramını anlamak lazım. Evet, Docker konteynerleri de üzerinde çalıştığı işletim sisteminde “ön tanımlı” bir disk alanını kullanıyor ve biz bu disk alanını kontrol edebiliyor ya da tanımladığımız başka bir disk alanını kullanabiliyoruz.
Öncelikle Docker konteynerleri ölümlüdür! Yani docker konteynerleri kapatıldığında içlerinde oluşturulan veriler de silinir. Docker, bir imajdan yeni bir konteyner ürettiğinde, kullanıcının yaptığı değişiklikler artık yoktur. Her Docker imajında ön tanımlı bazı ayarlar vardır ve bunların yer aldığı dosya Dockerfile olarak geçer. Diskte kullanılacak alanı temsilen Dockerfile’da yer alan volume tanımı da bu ayarlardan birisi olup imajdan üretilen konteynerde açıkça tanımlanması halinde diskte verilerin kalıcı olarak saklanabileceği bir alanın ön tanımını içerir. Konteyner durdurulsa ve silinse dahi tanımlanmış volume sayesinde konteynerde oluşturulmuş veriler Docker dosya sisteminde var olmaya devam edebilirler. Özetle “ölümlü” Docker konteynerleri durdurulduklarında verileri de beraberlerinde yok ederken, kullanıcının isteği doğrultusunda diskte saklama seçeneğini de sunarlar. Bu tür durumlarda konteynerde kalmasını istediğimiz veriler için volume tanımlaması yapılmalıdır.
Volume ismine ve konumuna karar verebileceğimiz gibi bu atama işlerini Docker’a da bırakabiliriz. Ancak Docker otomatik isimlendirdiği volume’lere genellikle “insani” isimler de vermez. Bu süreci ve sonrasını kolayca yönetmek istiyorsak konteynerin kullanacağı disk alanını kendimiz tanımlar, böylece hem kullanılacak disk alanını hem de volume için Docker’ın kullanacağı ismi belirleyebiliriz. Docker, disk alanı tanımı için Data Volume ve Bind Mount olmak üzere iki farklı kullanıma izin verir. Bu yazıda biz sadece Data Volume üzerinden örnek vereceğiz.
PostgreSQL 11 sürümümüze ait imaj dosyası pull ile Docker Registry’den çekildi ve çalıştırıldı. Eğer çalışan konteyner imajını docker container inspect’le sorgularsak konteynerin kullandığı disk alanını Volumes başlığında göreceğiz. Burada ayrıca Mounts kısmında bulunan source (kaynak) ve destination (hedef) etiketleri de işletim sistemindeki hangi dizinin konteynerdeki hangi dizine yönlendirildiğini (bağlantılarının eşlendiğini) görmek açısından önemli.