Konteynerlarda Veri Kalıcılığı: Docker Volume ve Bind Mount Rehberi

müfettiş

Moderatör
Katılım
20 Ocak 2024
Mesajlar
325
Tepkime puanı
1
Puanları
18

what-is-docker.png

Konteynerlarda Veri Kalıcılığı: Docker Volume ve Bind Mount Rehberi​


Giriş: "Konteyner Öldü, Verilerim Nerede?"​

Docker ve konteyner teknolojilerinin en büyük özelliği "Geçici" (Ephemeral) olmalarıdır. Bir konteyneri durdurup sildiğinizde, o konteynerin içinde oluşturulan tüm dosyalar, loglar ve veritabanı kayıtları sonsuza dek yok olur. Bu, uygulamanın kendisi için harikadır (temiz başlangıç), ancak veritabanları veya kullanıcı dosyaları için bir felakettir.

Modern uygulamalarda "Durumlu" (Stateful) verileri korumak zorundayız. Docker, veriyi konteynerin yaşam döngüsünden ayırmak için üç farklı yöntem sunar: Volumes, Bind Mounts ve tmpfs. Bu makalede, hangisini ne zaman kullanmanız gerektiğini derinlemesine inceleyeceğiz.

Sorunun Kaynağı: Union File System (UFS)​

Docker imajları salt okunur (Read-Only) katmanlardan oluşur. Konteyner çalıştığında, en üste ince bir "Yazılabilir Katman" (Writable Layer) eklenir. Veriler buraya yazılır. Ancak konteyner silindiğinde bu katman da silinir. Çözüm, veriyi bu katmana değil, doğrudan sunucunun (Host) diskine yazmaktır.

1. Docker Volumes (Önerilen Yöntem)​

Volumes, Docker tarafından oluşturulan ve yönetilen, sunucunun dosya sisteminde özel bir alanda (/var/lib/docker/volumes/) saklanan klasörlerdir.
  • Nasıl Çalışır?: Siz bir Volume oluşturursunuz (docker volume create db_data). Sonra konteynere "Benim /var/lib/mysql klasörümü bu Volume'a bağla" dersiniz.
  • Avantajları:
    • Yönetim: Docker CLI ile yönetilir. Yedeklemesi ve taşınması kolaydır.
    • İzolasyon: Sunucunun diğer süreçleri buraya dokunmaz.
    • Sürücü Desteği: Veriyi yerel diske değil, AWS S3'e veya NFS sunucusuna yazan "Volume Driver"lar kullanabilirsiniz.
    • Linux/Windows: Platform bağımsızdır.
  • Kullanım Alanı: Veritabanları (PostgreSQL, MySQL), kalıcı uygulama verileri.
Örnek:

Bash

Bash:
docker run -d \
  -v my_db_volume:/var/lib/mysql \
  mysql:5.7

2. Bind Mounts (Geliştirici Dostu)​

Bind Mounts, sunucunun dosya sistemindeki herhangi bir dosya veya klasörün, konteynerin içine haritalanmasıdır.

  • Nasıl Çalışır?: "Benim masaüstümdeki /home/user/project klasörünü, konteynerin /app klasörüne bağla" dersiniz.
  • Avantajları:
    • Hız: Geliştirme yaparken kodunuzu bilgisayarınızda değiştirirsiniz, konteynerin içinde anında değişir (Hot Reload). İmajı tekrar derlemenize (Rebuild) gerek kalmaz.
  • Dezavantajları:
    • Güvenlik: Konteyner, sunucunun kritik sistem dosyalarına erişebilir veya silebilir.
    • Taşınabilirlik: Sizin bilgisayarınızdaki dosya yolu (/home/ahmet), iş arkadaşınızın bilgisayarında (/home/ayse) farklıdır. Kod çalışmaz.
  • Kullanım Alanı: Geliştirme ortamları, Config dosyalarını (nginx.conf) içeri atmak.
Örnek:

Bash

Bash:
docker run -d \
  -v /home/user/project:/app \
  node:14

3. tmpfs Mounts (Sadece Linux)​

Veriyi diske hiç yazmaz, sunucunun RAM'inde (Memory) tutar. Konteyner kapanınca veri uçar.
  • Kullanım Alanı: Güvenlik anahtarları (Secrets) veya çok hızlı olması gereken geçici Cache verileri.

Karşılaştırma ve En İyi Pratikler​

  • Veritabanı mı kuruyorsunuz? -> Kesinlikle Volume.
  • Kod mu geliştiriyorsunuz? -> Bind Mount.
  • Nginx ayar dosyası mı vereceksiniz? -> Bind Mount.
  • Yedekleme mi yapacaksınız? -> docker volume inspect ile Volume yolunu bulun ve kopyalayın.

Sonuç​

Veri kalıcılığı, Docker'ın en kritik konusudur. Yanlış yöntem (örneğin veritabanı için Bind Mount kullanmak), dosya izinleri (Permissions) sorunlarına ve veri kaybına yol açabilir. Altın kural şudur: Veriyi Docker yönetiyorsa Volume, siz yönetiyorsanız Bind Mount kullanın.
 
Geri
Üst