Docker Serisi — Docker Volumes

Ahmet Cokgungordu
3 min readJan 21, 2019

--

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/html
volumes:
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.

--

--