Bloğa geri dön

Docker Konteynerleri Arasında Veri Paylaşımı

Docker Konteynerleri Arasında Veri Paylaşımı

Giriş

Docker, yazılımın fiziksel ana makinede çalışan diğer yazılımlardan yalıtılmış olarak çalışmasını sağlayan hafif, sanallaştırılmış, taşınabilir, yazılım tanımlı standartlaştırılmış bir ortam olan bir konteyner platformudur. Docker, Yazılım Geliştirmenin Sürekli Geliştirme ve Entegrasyon yönünün tanımlayıcı bir bileşenidir. Tutarlı bir çalışma zamanı ortamı sağlayarak Docker, yazılımın dağıtıldığı fiziksel ana makineden bağımsız olarak aynı şekilde davranmasını sağlar. Kapsamlı bir Docker ekosistemine genel bakış için bu makaleye göz atın.

Docker konteynerleri kendi kendilerine yetebilseler de, bazen verilere erişimi paylaşmaları veya konteyner durdurulduktan sonra verileri diske kaydetmeleri gerekir. Veriler; veritabanları, günlük dosyaları veya kullanıcı tarafından oluşturulan veriler biçiminde olabilir. Bu tür verilerin bir Docker imajı yapılandırma dosyasına dahil edilmesi imkansızdır ancak uygulamanızın beklendiği gibi çalışması için kullanılabilir olması gerekir. Docker konteynerlerinde veri paylaşımı ve kalıcılığı Docker Volumes, tarafından yönetilir. Docker Volumes, konteyner oluşturma sırasında oluşturulabilir veya daha sonra oluşturulup konteynerlere bağlanabilir. Bu eğitimde, konteynerler arasında veri paylaşmanın dört farklı yolunu tartışacağız.

Gereksinimler

Lütfen unutmayın, biz Ubuntu 20.04 ile çalışırken, Docker talimatları ve komutları, Docker'ın kurulu olduğu ve yukarıdaki gereksinimlerde açıklandığı gibi sudo kullanıcısının docker grubuna eklendiği diğer tüm işletim sistemlerinde çalışacaktır.

Adım 1: Bağımsız Docker Birimleri Oluşturma

Herhangi bir Docker konteyneri ile ilişkili olmayan bağımsız birimler oluşturarak başlayacağız. Bunu başarmak için şu komuta sahibiz: docker volume create (bu komut Docker 1.9 sürümünde sunulmuştur). Aşağıdaki komutu girerek şu adla bir birim oluşturun: Step1DataVolume :

Birim oluşturmanın başarılı olduğunu gösteren aşağıdaki çıktıyı görmelisiniz:

Docker Volume Create

Artık bağımsız bir birimimiz olduğuna göre, bundan yararlanmak için örnek olarak resmi Ubuntu imajından yeni bir konteyner oluşturabiliriz. Konteyneri oluşturmak ve birimi bağlamak için aşağıdaki komutu girin:

Bu komutta, --rm bayrağı, çıkış yaptıktan sonra konteyneri otomatik olarak silecektir. -v bayrağı, birimi belirtmek ve bağlamak için kullanılır. -v bayrağı; birimin adını, iki nokta üst üste işaretini ve birimin görünmesi gereken konteyner içindeki mutlak yolu alır. Komut çalıştığında, yoldaki belirtilen dizinler mevcut değilse oluşturulacağını unutmayın. Zaten mevcutlarsa, bağlanan birim mevcut içeriği gizleyecektir. -ti bayrağı için, -t terminale erişim sağlar ve -i terminal aracılığıyla konteynerle etkileşime girmemizi sağlar.

Konteynerin içindeyken, birime bazı veriler yazmak için aşağıdaki komutu çalıştırın:

Konteynerden çıkmak için exit yazın ve enter tuşuna basın. Açıklandığı gibi, --rm bayrağı sayesinde çıktığınızda konteyner otomatik olarak silinir, ancak birime yine de erişilebilir olacaktır.

Birimin hala var olduğunu doğrulamak için docker volume inspect komutunu kullanabilirsiniz:

Aşağıdaki çıktıyı görmelisiniz:

Docker Volume Inspect

Ardından, yeni bir konteyner oluşturalım. İlk olarak, birimi bağlayın ve önceki konteynerde oluşturduğumuz metne erişip erişemediğimizi görün. Aşağıdaki komutu girerek kullanarak konteyneri oluşturun ve çalıştırın:ubuntu imaj:

Konteynerin içinde, StepOne.txt dosyasının var olduğunu doğrulamak için aşağıdaki komutu çalıştırın:

Buna benzer bir çıktı görmelisiniz:

Docker Volume Content 1

Ardından, exit yazın ve konteynerden çıkmak için enter tuşuna basın. Bu adımda, bağımsız Docker birimlerini kullanarak veri kalıcılığını nasıl yöneteceğinizi ve birimleri konteynerlere nasıl bağlayacağınızı öğrendiniz.

Adım 2: Bir Konteyneri Sildiğinizde Verileri Koruyan Bir Docker Birimi Oluşturma

Bu adımda, bir konteyner oluştururken aynı zamanda bir birim oluşturmak için tek bir komut kullanacağız. Ardından konteyneri sileceğiz ve birimi yeni bir konteynere bağlayacağız. Komut, Adım 1 içinde kullanılana benzerdir, ancak konteyner için bir ad belirtmek üzere bir adet --name bayrağı ekleriz:

Konteynerin içindeyken, birime veri yazmak ve verilerin orada olduğunu doğrulamak için aşağıdaki komutu girin:

Aşağıda üç komutun çıktısı verilmiştir:

Persistent Docker Volume

Ardından, konteynerden çıkın. Aşağıdaki komutu kullanarak konteyneri yeniden başlattığınızda, birim otomatik olarak bağlanacaktır:

Konteynerin içinde, StepTwo.txt dosyasının varlığını aşağıdaki komutla kontrol ederek birimin bağlandığını doğrulayın:

İşte çıktı:

Docker Volume After Restart

Şimdi konteynerden çıkabilirsiniz. Docker, başka bir konteynerin referans gösterdiği bir birimin silinmesini engeller. Şu komutu kullanarak birimi silmeyi deneyebilirsiniz:

Çıktıda şu hata mesajını görmelisiniz:

Error Response

Çıktıda gösterilen konteyner kimliğini kullanarak konteyneri docker rm komutuyla silelim:

Vurgulanan container id bilgisini, terminalinizde gösterilen kendi konteynerinizin id bilgisiyle değiştirin. Bu komut konteyneri siler ancak oluşturduğumuz birimi silmez. Doğrulamak için docker volume ls komutunu kullanarak mevcut birimleri listeleyebilirsiniz:

İşte çıktı:

Docker Volume List

Şu adımda oluşturulan konteyneri silmek için: Adım 2, aşağıdaki komutu girin:

Bu adımda, bir konteyner oluştururken aynı zamanda bir Docker birimi oluşturabildiniz. Şimdi verileri olan mevcut bir dizinden nasıl birim oluşturabileceğimizi görelim.

Adım 3: Veri İçeren Mevcut Bir Dizinden Docker Birimi Oluşturma

Bir birime veri kopyalamak istiyorsanız, bir konteyner oluştururken bir birim oluşturabilir ve temel imajda verileri içeren bir dizinin yolunu sağlayabilirsiniz. Aşağıdaki komutta, bir konteyner oluşturuyoruz ve temel imajda veri içeren bir dizin olan /var dizininde bir veri birimi ekliyoruz:

Komut çalıştığında, temel imajın /var dizinindeki içerik birime kopyalanacaktır. Birim yeni bir konteynere bağlanabilir. Ardından, konteynerden çıkın:

Create Docker Volume

Konteyneri oluşturmak, birimi bağlamak ve ls komutunu kullanarak birimin içeriğini listelemek için aşağıdaki komutu girin:

Komuttan, temel imajdaki /var dizininin içeriğinin bir kopyası olan ve artık şu konumda bulunan benzer bir çıktı görmelisiniz: Step3DataVolume:

Copy Docker Volume

Bu örnekte yaptığımız gibi /var dizinini bağlamak pratik olmayabilir, ancak özel imajlarınızda oluşturulan herhangi bir dizini, verileri diğer konteynerlerin kullanımına sunmak için bir Docker birimine bağlayabileceğinizi anlamanıza yardımcı olur.

Adım 4: Birden Çok Docker Konteyneri Arasında Veri Paylaşımı

Çoğu durumda, birden fazla konteynerin tek bir Docker birimindeki verilere erişmesini istersiniz. Önceki örneklerde, bir birimi yalnızca tek bir konteynere bağlamıştık. Şimdi, bir birimi birden fazla konteynere nasıl bağlayacağınızı öğreneceksiniz. Bunu kolayca başarabilseniz de, Docker dosya kilitleme işlemini gerçekleştirmez. Aynı birime yazan birden fazla konteyner için, veri bozulmasını önlemek amacıyla bu konteynerlerde çalışan uygulamaları, paylaşılan veri depolarına yazma işlemlerini yönetecek şekilde ayrı ayrı tasarlamalısınız.

  • Şunu oluşturun: Step4Container1 ve Step4DataVolume

Adlandırılmış bir konteyner oluşturmak için docker run komutunu --name bayrağıyla birlikte kullanın:

Konteynerin içinde, bir metin dosyası oluşturmak ve biraz metin eklemek için aşağıdaki komutu çalıştırın:

Bundan sonra, konteynerden çıkın ve ana makine ortamına geri dönün. Şimdi, başka bir konteyner oluşturmak ve Step4Container1 birimlerini ona bağlamak istiyoruz.

  • Şunu oluşturun: Step4Container2 ve şu konteynerdeki birimleri bağlayın: Step4Container1

Şunu oluşturmak Step4Container2 ve şu konteynerdeki birimleri bağlamak için aşağıdaki komutu yürütün: Step4Container1:

Konteynerin içinde, veri kalıcılığını doğrulamak için cat komutunu kullanın:

Aşağıdaki çıktıyı görmelisiniz:

Container Data Sharing

Aşağıdaki komutu girerek Step4Container2 üzerinden dosyaya biraz daha metin ekleyebiliriz:

Bundan sonra konteynerden çıkın; verilerin hala mevcut olup olmadığını kontrol etmek için Step4Container1 konteynerine geri döneceğiz.

  • Farklı konteynerler arasında Docker biriminde yapılan değişiklikleri doğrulama

Değişiklikleri görüntülemek için öncelikle şu komutu kullanarak Step4Container1 konteynerini yeniden başlatacaksınız:

Aşağıdaki komutu kullanarak değişiklikleri kontrol edin:

Aşağıdaki ekran görüntüsüne benzer bir çıktı görmelisiniz:

Copied Container Data

Her iki konteynerin de aynı birime veri yazıp okuyabildiğini doğruladıktan sonra artık konteynerden çıkabilirsiniz. Belirtildiği gibi, Docker dosya kilitleme işlemini gerçekleştirmez; paylaşılan veri depolarına okuma-yazma erişimini yönetmek, konteynerlerin içinde çalışan uygulama mantığınızın görevidir. Docker, yalnızca salt okunur erişim gerektiren konteynerlerin yanlışlıkla veri bozmasını önlemek için :ro ekleyerek birimlerin salt okunur olarak bağlanmasına izin verir (bir sonraki örnekte gösterildiği gibi).

  • Bir birimi Docker konteynerine salt okunur olarak bağlama

Bu örnek için, Step4Container3 adında bir konteyner oluşturacağız. Oluşturma komutunda, Step4Container1 birimlerini bağlayıp :ro ekleyerek bu konteynerin salt okunur erişime sahip olduğunu ancak birime yazamayacağını belirteceğiz. Terminalinizde aşağıdaki komutu yürütün:

Konteynerin içine girdikten sonra, aşağıdaki komutu girerek birimdeki metin dosyasını okuyabilirsiniz:

Read Only Mount

Ancak, aşağıdaki komutu kullanarak dosyayı kaldırmayı denerseniz:

Terminalinizde şu şekilde bir hata mesajı alacaksınız:

Read Only Error

Okuma-yazma izinlerini doğruladıktan sonra konteynerden çıkabilirsiniz. Bu öğreticide oluşturulan konteynerleri ve birimi temizlemek isterseniz aşağıdaki komutları çalıştırın:

Bu adımda, Docker birimlerini kullanarak birden fazla konteyner arasında nasıl veri paylaşacağınızı ve veri birimlerini konteynerlere salt okunur olarak nasıl bağlayacağınızı öğrendiniz.

Sonuç

Bu öğreticide, bazı Docker birimleri oluşturdunuz ve Docker konteynerleri arasında nasıl veri paylaşacağınızı öğrendiniz. Konteynerler arasında veri paylaşımıyla ilgilenirken, Docker'ın dosya kilitlemeyi işlemek için bir uygulaması olmadığından, paylaşılan veri depolarına yazarken veri bozulmasını önlemek için konteyner içindeki bireysel uygulama mantığının dosya kilitlemeyi yönetmesi gerektiğini belirttik.

Docker'ı kullanmaya yönelik daha fazla kaynak için, şu adresteki diğer öğreticilere göz atmak isteyebilirsiniz: blogumuz:

Keyifli Çalışmalar!

author

Pranay Kapgate

Yazar · CloudSigma

Preslav Dobrev, CloudSigma'da Kreatif Tasarımcı olarak görev yapmakta olup geleneksel ve yenilikçi pazarlama kanallarını kullanarak tutarlı bir kurumsal kimlik oluşturmaya odaklanmaktadır. Sanatsal vizyonu stratejik pazarlamayla harmanlayarak etkili marka anlatıları oluşturma konusunda oldukça yeteneklidir.

Yorumlar

Henüz yorum yapılmamış. İlk siz olun.