Translate This Page:
Docker containerların temel sorunu ?
Containerlar yaşam ömürleri olan ve bu sebeple içindeki dataları kendi üzerinde kalıcı olacak şekilde saklayamayan yapılardır; yani container içindeki veriler , container yeniden oluşturulduğunda kaybolur.
Bunun nedeni, Containerlar yalnızca, container silinirken kaldırılan belirli bir Docker imajı üzerinde ince bir okuma/yazma katmanı oluşturmasıdır. Bu özellik, containerları süper hafif ve taşınabilir hale getirir ve temeldeki depolama alanları hakkında fazla endişelenmemize gerek kalmadan onları istediğimiz gibi ölçeklendirmemize olanak tanır.
Peki container üzerindeki verileri container yaşam döngüsünden daha uzun süre saklama ihtiyacımız varsa ne olur ? Örneğin web Apache serverınıda yayınladığınız bir web siteniz var siz apache 7 sürümündesiniz ve apache 8 imajından yeni bir container oluşturdunuz apache8 e dair tüm yapılandırma hazır gelecek fakat yayınladığınız web sitenizin dosyaları ne olacak ? Gibi bir takım sorunlar çıkacak.
İşte bu noktadaki sorunu Docker’ı geliştiren üstadlar görmüş ve application katamanı ile datanın tutulduğu katmanı biz ayıralım containerlar silinse de yeniden oluşturulsa da güncellense de datalarımız bundan etkilenmeyecek ayrı bir katmanda dursun diyerek buna “Volume” denen çözümü getirmişler.
Docker Volume Nedir?
Docker volüme docker’da verileri depolamak için kalıcı bir veri depolama mekanizmasıdır. Volume lerden önce docker, verileri containerda depolamak için bağlama bağlantılarını kullanır. bind mountsana makinenin dizin yapısına bağlıdır.
Bağlama, bir işletim sisteminin bir depolama aygıtındaki dosyaları ve dizinleri kullanıcılarının bir dosya sistemi aracılığıyla erişebilmesi için hazır hale getirdiği bir işlemdir. Konteynerin dosya sisteminden hostun dosya sistemindeki bir dosyaya/klasöre bir dosya/klasör bağlayarak, konteynır kaldırılsa bile verilerinin kalıcı olmasını sağlayabiliriz çünkü host hala kullanılabilir olacaktır.
Daha iyi anlamak için buna ayrıntılı olarak bakalım. Bildiğiniz gibi docker, ana makineden(Alt Tabloda???? Host) dosya sistemini ve donanımı paylaşan ayrı bir işlemle yalıtılmış bir container çalıştırır. Bir konteyner oluşturduğunuzda, uygulamamızı çalıştırmak için konteyner ile bir dizin oluşturur.
Yukarıda temel olarak docker Volumun ne işe yaradığını ve nerede kullanacağımıza değindik şimdi Volume türlerini inceleyebiliriz.
Docker Volume Türleri ve Doğru volume yapısını belirlemek.
Docker Volume
Volumler, Host dosya sisteminin bir parçasıdır. Örneğin, /var/lib/jenkinsdocker container ile paylaşılan konumdur ve bu konum, docker conainerda kalıcı veri görevi görür. Bunun değiştirilmek üzere ana makineden(Docker host) izole edildiğini unutmayın. Burada Cloud üzerinde çalışıyorsanız harici diskler yada cloud ortamlarında Amazon için S3 , Azure için Block Blob, Google için Cloud storage gibi platformları da kullanabilirsiniz.
-mount type=volume,src=volumename,dst=/container/path
Docker Bind Mount
öncelikle ciddi verilerle uğraşırken kullanılacak tek yöntem yukarıdaki seçenek olan volumlerdir. Bind volümese test ortamlarında ya da kendi ortamlarımızda veriyi saklamak hızlı müdehale için kullandığımız yöntemdir.
docker engine’ın yüklü olduğu host sistem üzerinde bir klasörü ya da tek bir dosyayı bir docker container’a Mount etmeye yarayan metottur.
Bind Mounts, dosya sistemindeki herhangi bir noktaya veya Ana makine tarafından halihazırda kullanılabilen ve hem containerlarda hem de Ana Bilgisayardan değiştirilebilen herhangi bir diskte eklenebilir.
Ancak Bind Mounts ile ilgili sınırlama, Bind Mounts’ı yönetmek için Docker CLI’yi kullanamamanızdır buradaki yönetim bu disk alanını nereden sağlıyorsanız o platform üzerinden yönetmeniz gerekmektedir.
Bağlama Bağlantılarını yapılandırmak için kullanabilirsiniz . Unutmayın, Docker container, kendisine eklenen dosya sistemini değiştirebilir ve containerları kötüye kullanırsak zararlı olabilir.
--mount type=bind,source=/host/path/,target=/container/path
Tmpfs Mounts
tmpfs mount, diskteki kalıcı veriler değildir. Ne Host ne de Container dosya sisteminde kalıcı olarak mevcut olacaktır buradaki datalar işletim sistemindeki ön bellek değimiz Memory (RAM) alanına yazılır makine restart olunca veya belirli süre sonra silinir.
Aşağıdaki komutu kullanarak bu bağlantı türünü sağlayabilirsiniz.
--mount type=tmpfs,destination=/app.
Ana bilgisayar dosya sisteminizde bir dosya yapısı oluşturmanız gerekmez. Yalnızca hedef dosya yolundan bahsedebilirsiniz ve dizin yapısını kendi başına oluşturacaktır.
Docker Volume vs Bind
Docker volüme ve Bind Mount arasında farkı aşağıdaki gibi özetleyebiliriz.
Volume | Bind Mount |
Kolay yedeklemeler ve kurtarmalar | Yedekleme ve kurtarma ile ilgili biraz karmaşıklık vardır. Hangi klasörleri yedekleyeceğinizi biliyorsanız, bunun için endişelenmenize gerek yok |
Bağlamak için yalnızca birim adına ihtiyacınız var. Yollar gerekli değildir. | Bind mount’larla montaj yapılırken ana makineye giden bir yol sağlanması gereklidir. |
Kapsayıcılar, oluşturulurken oluşturulmuş hacimlere sahip olabilir. | Bağlanan klasör, ana makine klasörü içermediğinde oluşturulacaktır. |
Docker birimleriyle etkileşime geçmek için API’ler ve CLI’ler vardır. | CLI komutlarını kullanarak bağlama bağlantılarına erişemezsiniz. Ana makine, onlarla anında çalışmanıza izin verir. |
Hacimler hacimlerde saklanır /var/lib/docker/. | Bağlama bağlantısı, bir ana bilgisayarda herhangi bir yerde bulunabilir. |
Volumler, Docker kapsayıcıları tarafından oluşturulan ve kullanılan kalıcı veriler için tercih edilen mekanizmadır. ana makinenin dizin yapısına ve işletim sistemine bağlı olsa da , birimler tamamen Docker tarafından yönetilir. Birimlerin bağlama bağlantılarına göre birçok avantajı vardır:
- Volumlerin yedeklenmesi veya taşınması, bind mount’lardan daha kolaydır.
- Docker CLI komutlarını veya Docker API’sini kullanarak Volumleri yönetebilirsiniz.
- Volumler hem Linux hem de Windows kapsayıcılarında çalışır.
- Volumler, birden çok kapsayıcı arasında daha güvenli bir şekilde paylaşılabilir.
- Volume sürücüleri, Volumlerin içeriklerini şifrelemek veya başka işlevler eklemek için uzak ana bilgisayarlarda veya bulut sağlayıcılarında birimleri depolamanıza izin verir.
- Docker Desktop’taki birimler, Mac ve Windows ana bilgisayarlarındaki bağlama bağlantılarından çok daha yüksek performansa sahiptir.
Ek olarak, Volumler genellikle bir container’ın yazılabilir katmanındaki kalıcı verilerden daha iyi bir seçimdir, çünkü bir Volume onu kullanan container boyutunu büyütmez ve Volum’ün içeriği belirli bir container yaşam döngüsünün dışında bulunur.
Docker Volume Davranışları
Klasör container içerisinde yok ve volume boş ise
Mount edilen volume eğer boşsa, mount edildiği klasör container içerisinde mevcut değilse, container içerisinde direk bu klasör yaratılır ve volume içeriği olduğu hali ile klasöre kopyalanır.
Klasör boş, volume boş ise.
Klasör boş ise, bağlanan volumedeki tüm dosyalar klasöre kopyalanır.
Klasör dolu, volume’de dolu ise.
Eğer bir volume dolu ise, mount edildiği klasörün dolu olup olmaması durumu göz ardı edilir ve klasörde, volume içeriğinde ne varsa o dosyalar gösterilir.
Docker Volumleri Yönetmek
Docker Volume oluşturma :
Kullanacağımız bir volume yaratalım. Ben “ilkvolume_01” adında bir volüme oluşturuyorum.
serdar@docker01:/$ docker volume create ilkvolume_01 ilkvolume_01
Docker Volume Listeleme :
Volumleri görüntülemek için aşağıdaki komutu kullanıyoruz.
serdar@docker01:/$ docker volume ls DRIVER VOLUME NAME local ilkvolume_01 serdar@docker01:/$
Docker Volume Silme :
Volumleri silmek için aşağıdaki komutu kullanıyoruz.
docker volume rm
Kullanılmayan Tüm Volumeleri Silme :
Kullanımda olmayan tüm Volumleri toplu olarak tek bir komutla silmek için aşağıdaki komutu kullanıyoruz.
docker volume prune
Docker Volume kullanım örneği
Docker Volume kullanım örneği
Docker Volume hakkında biraz daha bilgi edinmek için bir örnek verelim. Aynı docker Volume’ü paylaşan iki nginx container uygulamanız olduğunu varsayalım. her iki nginx uygulaması da bir dosyaya yazmak ve okumak için API içeriyor. Docker Volume iki konteyner arasında paylaştırabilir ve tek iki web servisinin ortak bir alana yazması sağlanabilir.
Docker Volume cli kullanımı
PROTOTİP |
---|
docker run –rm -d -p <port_out>:<port_in> –name <container_name> -v <volume_name>:”<target_path>” <image_name> |
AÇIKLAMA |
---|
-v <volume_name>:”<target_path>” : -v parametresi –volume olarak da belirtilebilir. Ayağa kaldırılacak containerın hangi volume ile eşleşeceğini(volume_name) ve hangi hedefteki verileri depoyalacağını(target_path) belirtir. |
Docker Bind Mount Kullanımı
Bu örneğimizde docker Linux host üzerinde host edilmekte ve ben Linux makinemde bir dizin oluşturacağım ve oluşturduğum bu dizini yaratacağım nginx imajına mount edeceğim.
İlk olarak Linux host makinemde publish edeceğim dizini oluşturuyorum
root@docker01:/# mkdir -p /opt/nginx/html
Aşağıdaki komutla oluşturduğum dizini yaracağım nginx containera “bind mount” olarak bağlıyorum. Nginx default olarak publish edeceği dosyaları “:/usr/share/nginx/html” bu dizinde tutmaktadır.
docker run -d -p 80:80 --name nginx_Test01 -v /opt/nginx/html:/usr/share/nginx/html:ro -d nginx
Docker container içerisine bağlanmak
Aşağıdaki komutla cointainer içerisine bağlanıp hostumdaki dizinin içerisinde bulunan “index.html ve merhaba.jpg” dosyalarım container içerisinde mi kontrol ediyorum.
docker exec -it nginx_Test01 sh
Burada da görüldüğü gibi Linux hostumdaki dosyalar direk mount edilerek container içerisinden de erişilecek şekilde paylaşıma açılmış durumda.
Docker Volume Mount
Bu metot ise production ortamlarında kullanacağımız ve en stabil volüme oluşturma metodudur. İlk olarak “test_volume01” adında bir volüm oluşturacağız ve bu volumu oluşturacağımız container a bağlayacağız.
İlk olarak docker üzerinde “test_volume01” adında bir volüme oluşturuyorum.
docker volume create test_volume01
ikinci adım olarak ilk örneğimizdeki gibi nginx imajını kullanıyorum burada protu 8080 olarak belirledim ve “test_volume01” volümünü oluşturacağım nginx cotainer içerisindeki “/usr/share/nginx/html” dizinine Mount edeceğim.
docker run -d -p 8080:80 --name nginx_Test02 -v test_volume01:/usr/share/nginx/html:ro -d nginx
Özet
Bu yazımda docker volüme kullanımını detaylıca ele aldık bir sonraki yazımda görüşmek üzere.