Docker Serisi — Docker Volumes
Docker Volumes, Docker Container’larındaki verileri saklamamız veya Container’lar arasında veri paylaşmamız gerektiğinde çok kullanışlıdır. Docker Volumes çok önemli bir kavramdır. Çünkü Docker Container silindiğinde tüm dosya sistemi de yok edilir. Bu gibi durumlarda verileri bir şekilde saklamak istiyorsak, Docker Volumes kullanmamız gerekiyor.
Docker Volumes, “docker run” komutuna “-v” flagı kullanarak Container’lara eklenir.
Herhangi bir Docker Image’ını düşünelim. Çalışma dizini “/var/www” olan bir web uygulaması olsun ve uygulama kodu da orada olduğunu varsayalım. Uygulamayı durduktan sonra veya Image silinse dahi bu klasördeki dosyaların silinmesini istemediğimiz durumlar mutlaka olacaktır. Buna çözüm sağlamak için Docker’ın bize sunduğu seçenekleri inceleyelim.
Dizin Eşleme Yöntemi
Dizin eşleme, ana makinedeki bir dizini Container’daki bir dizine eşleme yapar. Böylece Container kaldırıldığında, dizini etkilemez.
Eğer “-v” veya “--volume” flagleri bir path ise, dizin eşleme olarak algılanır. Eğer dizin yoksa, yaratılacaktır. Bunu yaptığımızda aşağıdaki örnekte görüleceği gibi ana makinedeki “/tmp/source/target” ile Container üzerindeki “/var/www” klasörü içeriği aynı olacaktır.
docker run -d -it --name devtest -v /tmp/source/target:/var/www nginx:latest
Docker Volumes
Volumes, Docker Container’ları tarafından üretilen ve kullanılan verileri kalıcı kılmak için tercih edilen mekanizmadır. Dizin eşleme, ana makinenin dizin yapısına bağlıdır. Volumes ise tamamen Docker tarafından yönetilmektedir.
Volumes avantajlarını kısaca bakalım;
- Yedekleme veya migrate yapmak kolaydır.
- Docker CLI komutlarını veya Docker API’sini kullanarak Volumes yönetilebilir.
- Hem Linux hem de Windows Container’larında çalışır.
- Birden fazla Container arasında güvenli bir şekilde paylaşılabilir.
- Sürücüleri uzak bilgisayarda veya bulut sağlayıcılarında saklamamıza, birimlerin içeriğini şifrelememize veya başka işlevler eklememize izin verir.
- Yeni bir Volume içeriği bir Container tarafından önceden doldurulabilir.
Ek olarak, Volumes genellikle bir Container’ın yazılabilir katmanındaki kalıcı verilere göre daha iyi bir seçimdir. Çünkü Container’ların boyutu arttırılmaz.
Docker Volume Oluşturma ve Kaldırma
Aşağıdaki komutu kullarak bir Docker Volume oluşturabiliriz.
docker volume create volume_name
Tüm Volume’ları listelemek için aşağıdaki komutu kullanıyoruz.
docker volume ls
Bir Docker Volume silmek istersek, aşağıdaki komut ile yaparız.
docker volume rm volume_name
Bir Container’a Docker Volume Ekleme
“-v” veya “--volume” flagi bir Docker Volume eklemek için de kullanılır. Ancak, dizin eşlerken ana bilgisayardaki dizin pathini veriyorduk. Burada Volume adını yazıyoruz.
docker run -d -it --name devtest -v volume_name:/var/www nginx:latest
Not: Varolmayan bir Volume belirtirsek, öncelikle Volume’u oluşturacaktır.
Dockerfile ile Volume Ekleme
Aşağıda bir Dockerfile içinde Volume tanımı örneği vardır.
FROM alpine
VOLUME ["/data"]
ENTRYPOINT ["/bin/sh"]
Bu Dockerfile’a göre “/data” dizini ana makinedeki Volume name ile yaratılan bir dizine eşlenir. Container’a inspect komutu ile bakarak “source” alanında hangi path ile eşlendiği görülebilir.
[
{
"Destination": "/data",
"Driver": "local",
"Mode": "",
"Name": "f9fb8ttb78494939453fc7a09198da3c20406f15272121722632a4fab54w40qc",
"Propagation": "",
"RW": true,
"Source": "/var/lib/docker/volumes/f9fb8ttb78494939453fc7a09198da3c20406f15272121722632a4fab54w40qc/_data",
"Type": "volume"
}
]
Docker-Compose ile Volume Kullanımı
Aşağıdaki örnekte görüleceği gibi bir yml dosyası oluştururuz.
version: '2'services:
webserver:
build: .
ports:
- "9000:80"
volumes:
- .:/usr/share/nginx/html
Yukarıdaki örnekte YML dosyasının bulunduğu dizini Container için “/usr/share/nginx/html” dizinine eşler.
volumes:
-/var/lib/mysql
Yalnız Container’daki dizini tanımlar, ana makinede anonim Volume oluşur.
volumes:
-/opt/data:/var/lib/mysql
Ana makinedeki ve Container’daki dizini birlikte tanımlar
volumes:
-./cache:/tmp/cache
YML dosyasının bulunduğu dizine göre tanımlar
volumes:
-html-volume:/usr/share/nginx/html
İsimlendirilmiş bir volume üzerinden tanımlar
Eğer isimlendirilmiş bir Volume üzerinden bir tanımlama var ise Volume konfigurasyonunda ek olarak yapılmalıdır.
version: '2'services:
webserver:
build: .
ports:
- "8080:80"
volumes:
- html-volume:/usr/share/nginx/htmlvolumes:
html-volume:
Read-Only Mode
Bir Docker Volume birden fazla Container’a eklenebilir. Bunun yanı sıra bazı Container’ların bu Volume’a yazmasını, bazılarının yazmamasını isteyebiliriz. Bunu yapmak için Volume bağlarken read-only kullanılacak Container’da “ro” opsiyonunu aşağıdaki şekilde kullanırız.
docker run -d -it --name devtest -v volume_name:/var/www:ro nginx:latest
Bu komut hem path verirken hem de Docker Volume bağlarken kullanılabilir.
Volumes ile çalışırken Container silerken Volume’ları da mutlaka yönetin. Yoksa sistemde gereksiz yere sismelere neden olabilir.