müfettiş
Moderatör
- Katılım
- 20 Ocak 2024
- Mesajlar
- 325
- Tepkime puanı
- 1
- Puanları
- 18
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.
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.
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.