Docker Volume Nedir?
Docker Volume, container içindeki verilerin container silinse bile kaybolmaması için kullanılan kalıcı veri saklama yöntemidir. Container'lar geçici yapılardır; önemli veriler container içinde değil, volume veya host klasörlerinde tutulmalıdır.
Bizim projemizde web sitesi dosyaları /opt/docker/kemaltokmak/html klasöründe, Nginx Proxy Manager verileri ise /opt/docker/nginx-proxy-manager/data ve letsencrypt klasörlerinde tutulur.
Neden Volume Kullanılır?
Container yeniden oluşturulduğunda veya güncellendiğinde içindeki geçici veriler kaybolabilir. Volume kullanarak önemli dosyaları host sistemde saklarız.
- Veri kalıcılığı sağlar.
- Container güncellemelerinde dosyalar korunur.
- Yedekleme işlemlerini kolaylaştırır.
- Konfigürasyon dosyaları düzenli şekilde saklanır.
- Birden fazla container aynı veriye erişebilir.
Bind Mount ve Named Volume Farkı
Docker'da veri saklamak için en sık kullanılan iki yöntem bind mount ve named volume yapılarıdır.
Host üzerindeki belirli bir klasörü container içine bağlar. Bizim web sitesi dosyalarında kullandığımız yöntem budur.
Docker tarafından yönetilen, ismi olan volume yapısıdır. Verinin fiziksel konumu Docker tarafından yönetilir.
Gerçek Proje Klasör Yapısı
Biz Docker projelerini /opt/docker altında düzenli şekilde tutuyoruz.
/opt/docker
├── kemaltokmak
│ ├── compose.yaml
│ └── html/
│ ├── index.html
│ ├── css/
│ ├── js/
│ ├── images/
│ └── docs/
└── nginx-proxy-manager
├── compose.yaml
├── data/
└── letsencrypt/
Bu yapı sayesinde hem site dosyaları hem de proxy manager verileri kolayca yedeklenebilir.
HTML Klasörünü Container'a Bağlama
Web sitesi container'ında host üzerindeki html klasörünü Nginx'in yayın dizinine bağlıyoruz.
./html:/usr/share/nginx/html:ro
Burada ./html host klasörüdür, /usr/share/nginx/html ise container içindeki Nginx yayın dizinidir.
Sondaki :ro ifadesi container'ın bu klasörü
sadece okuma yetkisiyle kullanmasını sağlar.
Nginx Proxy Manager Data ve SSL Klasörleri
Nginx Proxy Manager ayarları ve SSL sertifikaları container içinde bırakılmamalıdır. Bu yüzden host klasörlerine bağlanır.
./data:/data
./letsencrypt:/etc/letsencrypt
data klasörü NPM ayarlarını, letsencrypt klasörü ise SSL sertifikalarını saklar.
Docker Compose İçinde Volume Tanımlama
Compose dosyasında volume tanımı volumes alanı altında yapılır.
services:
web:
image: nginx:alpine
container_name: kemaltokmak
volumes:
- ./html:/usr/share/nginx/html:ro
Nginx Proxy Manager için örnek:
services:
nginx-proxy-manager:
image: jc21/nginx-proxy-manager:latest
container_name: nginx-proxy-manager
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
Named Volume Oluşturma
Docker tarafından yönetilen bir named volume oluşturmak için aşağıdaki komut kullanılır.
docker volume create site-data
Named volume bir compose dosyasında şu şekilde kullanılabilir:
services:
app:
image: nginx:alpine
volumes:
- site-data:/usr/share/nginx/html
volumes:
site-data:
Volume Listeleme
Docker üzerinde oluşturulmuş volume'ları listelemek için:
docker volume ls
Bu komut named volume'ları listeler. Bind mount olarak kullanılan host klasörleri burada her zaman ayrı volume gibi görünmeyebilir.
Volume Detaylarını İnceleme
Bir named volume hakkında detaylı bilgi almak için docker volume inspect komutu kullanılır.
docker volume inspect site-data
Çıktıda volume adı, driver bilgisi ve sistem üzerindeki mount yolu görülebilir.
Veri Kalıcılığını Test Etme
Volume kullanımının en önemli amacı, container silinse bile verinin korunmasıdır. Bunu test etmek için container yeniden oluşturulabilir.
docker compose down
docker compose up -d
Eğer site dosyaları veya NPM ayarları korunuyorsa volume yapısı doğru çalışıyor demektir.
Kullanılmayan Volume'ları Temizleme
Kullanılmayan volume'lar zamanla disk alanı kaplayabilir. Temizlemek için:
docker volume prune
Bu komut kullanılmayan volume'ları siler. İçinde önemli veri olabilecek volume'ları silmeden önce mutlaka kontrol edin.
Volume ve Backup Mantığı
Volume veya bind mount kullanılan klasörler düzenli olarak yedeklenmelidir. Bizim projede yedeklenmesi gereken ana klasör:
/opt/docker
Tüm Docker projelerini yedeklemek için:
cd /opt
tar -czvf docker-full-backup.tar.gz docker
Bu işlem web sitesi dosyalarını, NPM data klasörünü ve SSL sertifikalarını da kapsar.
Sık Yapılan Hatalar
Docker volume kullanırken yapılan küçük hatalar container'ın çalışmamasına veya verinin beklenen yerde oluşmamasına neden olabilir.
- Host klasör yolunu yanlış yazmak.
- Volume satırında boşluk veya girinti hatası yapmak.
-
:rokullanıldığı halde container'ın yazma yapmasını beklemek. - Silinen container ile verinin de silindiğini düşünmek.
-
Yedek almadan
docker volume pruneçalıştırmak.
Volume Satırlarını Kontrol Etme
docker inspect kemaltokmak
docker inspect nginx-proxy-manager
Bu Dokümanda Ne Öğrendik?
Bu dokümanda Docker Volume mantığını, bind mount ve named volume farkını, Docker Compose içinde volume tanımlamayı, volume listeleme ve temizleme işlemlerini ve gerçek projemizde verilerin nasıl kalıcı tutulduğunu öğrendik.
- Docker Volume kavramını öğrendik.
- Bind mount ve named volume farkını inceledik.
- Web sitesi dosyalarını container'a bağladık.
- NPM data ve letsencrypt klasörlerinin önemini gördük.
- docker volume ls ve inspect komutlarını öğrendik.
- Kullanılmayan volume'ları temizlemeyi gördük.
- Volume ve backup ilişkisini öğrendik.