Skip to content
Back to blog
Teknoloji Docker Backup DevOps Sistem Yönetimi Linux

Docker Volume Yedekleme ve Geri Yükleme Stratejileri: Veri Kaybını Önleme Rehberi

Docker container verilerinizi güvence altına alın. Volume yedekleme, manuel dışa aktarma, otomatikleştirilmiş senaryolar ve felaket senaryolarına karşı pratik kurtarma yöntemleri.

Caner Serbest

Sistem ve Altyapı

5 min read

Docker Volume Yedekleme ve Geri Yükleme Stratejileri: Veri Kaybını Önleme Rehberi

Konteyner (container) teknolojileri, yazılım geliştirme ve operasyon süreçlerinde hayatımızı kökten değiştirdi. Uygulamaları izole ortamlarda çalıştırmak, bağımlılıkları paketlemek ve her ortamda aynı şekilde çalışmasını sağlamak büyük bir konfor. Ancak konteynerlerin geçici (ephemeral) doğası, veri kalıcılığı (data persistence) konusunu kritik bir başlık haline getiriyor. Konteynerler silindiğinde içindeki veriler de kaybolur; bu nedenle verileri konteyner ömründen bağımsız yaşatmak için Docker Volume yapılarını kullanırız.

Peki, bu volume’lerin içinde saklanan verilerin güvenliği nasıl sağlanır? Bir sunucu çöktüğünde veya yanlışlıkla silinen bir komut yüzünden veritabanınız uçtuğunda elinizde güncel bir yedek yoksa, mimarinizin ne kadar modern olduğunun bir önemi kalmaz. Bu yazıda, Docker volume yedekleme ve geri yükleme süreçlerini teorik olarak ele almakla kalmayacak, sahada doğrudan uygulayabileceğiniz pratik yöntemleri adım adım inceleyeceğiz.


Docker Mimarisinde Veri Saklama Yöntemleri

Yedekleme stratejisine geçmeden önce, Docker’ın verileri nasıl sakladığını kısaca hatırlayalım. Docker üzerinde veri saklamak için üç temel yaklaşım vardır:

  1. Volumes (Ciltler): Docker tarafından yönetilen, host makinenin dosya sisteminde (/var/lib/docker/volumes/ altında) depolanan alanlardır. Docker veri güvenliği ve performans açısından en çok bunu önerir.
  2. Bind Mounts: Host makinenin dilediğiniz bir dizinini doğrudan konteyner içine bağlamaktır. Esnektir ancak host işletim sistemi bağımlılıklarını artırır.
  3. Tmpfs Mounts: Veriler yalnızca bellekte (RAM) saklanır, diske yazılmaz. Hassas veriler veya geçici önbellekler için idealdir.

Biz bu yazıda, en yaygın kullanılan ve yönetim sorumluluğu Docker’da olan Volumes yapı yedeklemesine odaklanacağız.


Temel Mantık: Geçici Bir Konteyner ile Yedek Almak

Docker volume’leri doğrudan host üzerinde normal bir klasör gibi görünse de (varsayılan izinler ve dosya sahiplikleri nedeniyle) doğrudan host seviyesinden ziplemek her zaman güvenli değildir. Doğru yaklaşım, veriye erişmek için geçici bir konteyner ayağa kaldırmak, ilgili volume’ü bu konteynere bağlamak ve veriyi dışarı aktarmaktır.

Bu yöntem şu temel mantığa dayanır:

  • Hedef volume’ü okuma yetkisiyle geçici bir konteynere bağla (--volumes-from veya -v).
  • Host üzerindeki hedef dizini de bu konteynere mount et.
  • Bir tar komutu ile volume içeriğini sıkıştırıp host üzerindeki dizine kaydet.
  • İşlem bitince geçici konteyneri yok et.

1. Adım: Manuel Volume Yedekleme (Export)

Farz edelim ki elimizde app_data adında kritik verilerin tutulduğu bir volume var. Bu veriyi /backup dizinine .tar.gz formatında yedeklemek istiyoruz.

docker run --rm \\
  -v app_data:/volume \\
  -v $(pwd):/backup \\
  alpine \\
  tar czf /backup/app_data_backup.tar.gz -C /volume .

Bu komutun parametrelerini inceleyelim:

  • run --rm: Konteyner işi bittiğinde otomatik olarak silinir (disk alanında çöp bırakmaz).
  • -v app_data:/volume: Yedeklemek istediğimiz app_data volume’ünü konteyner içindeki /volume dizinine bağlar.
  • -v $(pwd):/backup: Komutu çalıştırdığınız mevcut dizini konteyner içindeki /backup dizinine bağlar.
  • alpine: Hafif (yaklaşık 5 MB) bir Linux dağıtımıdır, bu tür operasyonlar için idealdir.
  • tar czf /backup/app_data_backup.tar.gz -C /volume .: /volume dizini içine girer ve içindeki her şeyi (.) sıkıştırarak host üzerindeki /backup dizinine yazar.

2. Adım: Yedekten Geri Yükleme (Restore)

Veri kaybı yaşadınız veya yeni bir sunucuya geçtiniz. Aldığınız yedeği yeni veya mevcut bir volume’e geri yüklemek için benzer mantığı tersine işletiriz.

Öncelikle boş bir volume oluşturalım:

docker volume create app_data

Şimdi bu volume’e yedeği geri yükleyelim:

docker run --rm \\
  -v app_data:/volume \\
  -v $(pwd):/backup \\
  alpine \\
  sh -c "rm -rf /volume/* && tar xzf /backup/app_data_backup.tar.gz -C /volume"

Bu komut, önce hedef volume’ün içini temizler (rm -rf) ve ardından tar aracı ile arşiv dosyasını ilgili volume dizinine açar.


Veritabanı Volume Yedeklemelerinde Dikkat Edilmesi Gerekenler

Eğer yedeklediğiniz volume bir veritabanına (PostgreSQL, MySQL, MongoDB vb.) aitse, yukarıdaki gibi doğrudan tar almak her zaman güvenli sonuç vermeyebilir. Veritabanı çalışırken dosya sisteminden yapılan kopyalamalar (özellikle disk yazma işlemleri sürerken), veritabanının tutarsız duruma gelmesine (corrupted data) yol açabilir.

Bu tür durumlarda en iyi pratikler şunlardır:

  1. Uygulama Seviyesinde Backup: Dosya sistemini yedeklemek yerine veritabanının kendi yedekleme aracını kullanmak (örn: pg_dump, mysqldump).
  2. Konteyneri Durdurarak Backup: Eğer kesinti (downtime) toleransınız varsa, veritabanı konteynerini durdurup volume yedeğini almak en güvenlisidir.

Örnek bir PostgreSQL yedekleme senaryosu:

# 1. Konteyneri durdur
docker stop postgres_container

# 2. Volume yedeğini al
docker run --rm -v pg_data:/volume -v $(pwd):/backup alpine tar czf /backup/pg_backup.tar.gz -C /volume .

# 3. Konteyneri tekrar başlat
docker start postgres_container

Otomatikleştirilmiş Yedekleme Stratejileri

Manuel yedekleme operasyonları insan hatasına açıktır. Sürdürülebilir bir sistem yönetiminde bu süreçlerin otomatize edilmesi şarttır. Bash scriptleri ve sistemin zamanlayıcısı olan cron kullanarak bu süreci tamamen arka plana atabiliriz.

Örnek Otomasyon Scripti (docker-backup.sh)

#!/bin/bash

# Ayarlar
BACKUP_DIR="/opt/docker-backups"
DATE=$(date +%Y%m%d_%H%M%S)
VOLUME_NAME="app_data"
CONTAINER_NAME="app_container"

# Yedek dizini yoksa oluştur
mkdir -p $BACKUP_DIR

echo "[$DATE] Yedekleme işlemi başlatılıyor..."

# Veri tutarlılığı için gerekirse konteyneri durdurun veya flush işlemi yapın
# docker stop $CONTAINER_NAME

# Yedek alma komutu
docker run --rm \\
  -v ${VOLUME_NAME}:/volume \\
  -v ${BACKUP_DIR}:/backup \\
  alpine \\
  tar czf /backup/${VOLUME_NAME}_${DATE}.tar.gz -C /volume .

# Konteyneri tekrar başlat
# docker start $CONTAINER_NAME

# Eski yedekleri temizle (Örn: 7 günden eski olanları sil)
find $BACKUP_DIR -name "${VOLUME_NAME}_*.tar.gz" -mtime +7 -exec rm {} \\;

echo "[$DATE] Yedekleme başarıyla tamamlandı."

Bu scripti çalıştırılabilir hale getirmek için:

chmod +x docker-backup.sh

Crontab ile Zamanlama

Bu scriptin her gece saat 03:00’te otomatik olarak çalışmasını istiyorsanız, crontab düzenleyicisine (crontab -e) şu satırı ekleyebilirsiniz:

0 3 * * * /bin/bash /opt/docker-backups/docker-backup.sh >> /var/log/docker-backup.log 2>&1

Felaket Senaryoları ve Test Etme (Disaster Recovery)

Bir yedeğin kalitesi, geri yüklenebilirliği ile ölçülür. Asla geri yükleme testi yapmadığınız bir yedeğe %100 güvenmeyin. Sistem yöneticisinin en önemli reflekslerinden biri, düzenli aralıklarla yedeklerin sağlığını test etmektir.

Test sürecinde şu adımları izleyebilirsiniz:

  1. Üretim ortamından bağımsız, test amaçlı bir sunucu veya yerel ortam (Homelab) kullanın.
  2. Alınan son .tar.gz yedeğini bu ortama taşıyın.
  3. Yukarıda anlatılan restore adımlarını uygulayın.
  4. Uygulamayı ayağa kaldırarak verilerin eksiksiz ve tutarlı olduğunu doğrulayın.

Sonuç

Docker volume yedekleme, göz ardı edildiğinde pahalı projelere ve veri kayıplarına mal olabilen ancak temel mantığı kavrandığında oldukça kolay yönetilen bir süreçtir. Konteyner ekosisteminin sunduğu esnekliği, doğru yedekleme ve otomasyon stratejileriyle desteklemek sisteminizin sürdürülebilirliği için hayati önem taşır.

Unutmayın; iyi bir sistem yöneticisi sistemin hiç çökmemesini sağlayan değil, çöktüğünde en kısa sürede ve veri kaybı olmadan ayağa kaldırabilendir. Yedeklerinizi düzenli alın, otomatize edin ve mutlaka test edin.


Bu yazı Gemini ile otomatik oluşturulmuştur.