Docker Volume ve Bind Mount Nedir? Farkları Nelerdir?
5 min read

Docker Volume ve Bind Mount Nedir? Farkları Nelerdir?

Docker volume ve bind mount yöntemlerini kullanarak container içindeki verilerinizi kalıcı hale getirebilirsiniz.
Docker Volume ve Bind Mount Nedir? Farkları Nelerdir?
Photo by Caleb Russell / Unsplash

Docker, stateless çalıştığı için containerlar öldüğünde üzerindeki tüm verileri kaybederler. Bu verileri kaybetmemek için Docker kalıcı veri depolama çözümleri sunar. Kalıcı veri depolama çözümleri, birden fazla container arasında veri erişimini kolaylaştırmak, veri yedekleme ve geri yükleme, veri ayrıştırması gibi işlemleri yapmak için de kullanılabilir.

Docker ile container üzerindeki verilerinizi kalıcı hale getirmek için iki yöntem kullanabilirsiniz. Bu yöntemler şunlardır:

  1. Volume
  2. Bind Mount

Docker volume ve bind mount, Docker containerlarınızda saklamak için kullandığınız verileri kalıcı olarak depolamak ve erişmek için kullanılan iki farklı yöntemdir.

Docker volume, Docker containerlarınızda saklamak için kullandığınız verilerin depolandığı bir alandır. Volume, containerların ölünce verileri kaybetmemesi için kullanılır. Ayrıca, birden fazla container arasında veri erişimini kolaylaştırmak, veri yedekleme ve geri yükleme, veri ayrıştırması gibi işlemleri yapmak için de kullanılabilir. Volume, host sistemi üzerinde fiziksel olarak ayrı bir yerde depolanır ve containerlar tarafından erişilebilir.

Docker mount ise, host sistemi üzerinde yer alan mevcut dizin veya dosyaları containerlar tarafından kullanmak için kullanılır. Bu containerlarınızın host sistemi üzerinde yer alan verilerle çalışmasını sağlar. Örneğin, host sisteminizde yer alan bir dizinin containerlar tarafından kullanılmasını sağlamak için -v $(pwd):/app parametresi kullanılabilir.

Docker Volume ve Bind Mount Arasındaki Fark Nedir?

Docker volume ve mount farkı olarak, Volume ile veriler Docker seviyesinde tutulur ve yönetilir. Dolayısıyla Docker CLI ile yönetilebilmekte ve backup, restore, migrate vs. gibi işlemler daha dinamik gerçekleştirilebilmektedir. Tüm bunların yanında cloud ortamda depolanabilmekte ve böylece ortam ile birlikte sunuculara olan bağımlılığı koparabilmektedirler. Bind Mount ise, host sistemi üzerinde yer alan mevcut verilerin containerlar tarafından kullanmasını sağlar.

Şimdi bu iki konuya detaylıca bakalım.

1. Docker Volume

Docker volume, host sisteminde fiziksel olarak ayrı bir yerde depolanır ve containerlar tarafından erişilebilir. Volume, host sistemiyle ayrı tutularak containerlar arasında veri taşınmasını ve veri yönetimini kolaylaştırır. Volume, Docker'ın kendi yönetiminde olmasına rağmen, containerlar tarafından mount edilerek kullanılır.

Docker volume kullanmak, containerlarınızda sakladığınız verileri kalıcı hale getirmek, verileri yedeklemek ve geri yüklemek, verileri daha iyi yönetmek, containerları daha güvenli ve stabil hale getirmek için faydalıdır.

Docker volume, 3 farklı türde olabilir:

  1. local : Host sistemi üzerinde yerel olarak depolanır.
  2. network : Network üzerinde depolanır ve birden fazla host sistemi arasında paylaşılabilir.
  3. cloud : Bulut tabanlı olarak depolanır ve bulut hizmeti sağlayıcısı tarafından yönetilir.

Docker volume yönetimi için kullanabileceğiniz bazı komutlar ve parametreler şunlardır:

  1. docker volume create: Yeni bir volume oluşturmak için kullanılır. Örnek kod: docker volume create my-volume
  2. docker volume ls: Mevcut tüm volumeleri listelemek için kullanılır. Örnek kod: docker volume ls
  3. docker volume inspect: Bir volume hakkında detaylı bilgi almak için kullanılır. Örnek kod: docker volume inspect my-volume
  4. docker volume rm: Bir volume silmek için kullanılır. Örnek kod: docker volume rm my-volume
  5. docker volume prune: Kullanılmayan volumeleri silmek için kullanılır. Örnek kod: docker volume prune

Örnek olarak öncelikle my_volume isimli bir volume oluşturalım.

docker volume create my_volume

Volume'leri listelemek için docker volume ls komutunu kullanırsak çıktımız şu şekilde olacaktır:

DRIVER    VOLUME NAME
local     my_volume
📍
Varsayılan volume tipi local'dir. Yani volume'ler üzerinde çalıştığı host cihazda tutulur.

Şimdi bu volume'u my_container isimli container'a -v veya --volume parametresini kullanarak bağlayalım:

docker run -it -v my_volume:/app -p 80:80 --name my_container nginx

Artık container içerisindeki /app dizinine koyduğunuz dosyalar container silinse bile my_volume isimli volume içerisinde host cihazda kalacaktır. Dilerseniz my_volume isimli volume'ı tekrar istediğiniz bir container'a bağlayarak aynı verilerle çalışmaya devam edebilirsiniz. Üstelik bir volume, aynı anda farklı container'lara da bağlanarak ortak bir çalışma alanı oluşturulabilir.

1.1. Docker Volume İçindeki Dosyalar Nerede Tutulur?

Oluşturduğunuz docker  volume'ları docker volume inspect volume_name komutu ile incelediğinizde mountpoint değerinin /var/lib/docker/volume/[volume_name]/_data olduğunu görürsünüz.

[
    {
        "CreatedAt": "2023-01-25T18:01:56Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/volume_name/_data",
        "Name": "volume_name",
        "Options": {},
        "Scope": "local"
    }
]

Yani oluşturulan tüm volume'ler /var/lib/docker/volume/ dizininde kendi adıyla tutulur. Ayrıca volume içindeki verilere oluşturduğunuz volume isimli dizin içindeki _data dizininden erişebilirsiniz.

Linux sistemlerde, volume içindeki datalara host cihazdan  erişebilmek için /var/lib/docker/volumes dizinini kullanabilirsiniz. Fakat, Windows sistemlerde, Docker Engine sanal bir makine üzerinde çalıştığı için (WSL) bu alana direkt olarak erişemeyiz. Bu dizine erişim için Win+R veya çalıştır komutuyla \\wsl$\docker-desktop-data\data\docker\volumes dizinine gitmeniz gerekir. İkinci bir yöntem ise WSL terminalini açarak tıpkı Linux'te olduğu gibi /var/lib/docker/volumes dizinine gitmektir.

1.2. Docker Boş ve Dolu Volume Mount Etme Senaryoları

Bir volume'u bir container'a mount ederken, ilgili volume ve mount edilecek dizinin boş veya dolu olmasına göre Docker'ın davranışı farklıdır. Bu davranışları incelersek;

  1. Eğer bir volume'un container içindeki mount edildiği dizin (destination) mevcut değilse, bu dizin ilk olarak container içinde oluşturulur. Ve volume içerisinde mevcut olan tüm dosya ve dizinler, yaratılan dizin içinde gözükmeye başlar. Volume boşsa, dizin içeriğini de boş görürsünüz.
  2. Eğer bir volume, container içindeki mevcut olan bir dizine mount edilirse üç senaryo mevcuttur:
  • Container içindeki dizin boşsa, o anda volume içerisinde mevcut olan tüm dosya ve dizinler, yaratılan dizin içinde gözükmeye başlar. Volume boşsa, dizin içeriğini de boş görürsünüz.
  • Mount edilecek volume'un içi boş fakat container içindeki dizin boş değilse, container içindeki dizinde yer alan dosya ve dizinler volume içine kopyalanır.
  • Mount edilecek volume'un içi boş değil ve container içindeki dizin boş veya doluysa, container içindeki dizinde volume içerisinde yer alan dosya ve dizinleri görürsünüz.
💡
Bu senaryoları hatırlamanın kolay yolu, volume içeriğinin öncelikli olduğunun hatırlanmasıdır.

2. Docker Bind Mount

Docker Bind Mount ile, host sistemi üzerinde yer alan mevcut dizin veya dosyalar containerlar tarafından kullanılabilir. Bu, containerlarınızın host sistemi üzerinde yer alan mevut verilerle çalışmasını sağlar.

docker run komutu ile containerları çalıştırırken -v veya --volume parametrelerini kullanarak bind mount yapabilirsiniz. Örnek olarak, Linux host sisteminizde yer alan /data dizinini containerdaki /app dizinine mount edelim.

docker run -v /data:/app -it my_image

Benzer şekilde Windows üzerindeki bir dizini mount etmek için aşağıdaki gibi bir kullanımı referans alabilirsiniz:

docker run -v C:\Users\kerteriz\html:/usr/share/nginx/html -it my_image

Docker serimizin sıradaki yazısı için aşağıdaki bağlantıyla devam edebilirsiniz.

Docker Compose Nedir ve Nasıl Kullanılır?
Docker Compose birden fazla container’ı kolayca oluşturulmada ve yönetmede kullanılır.