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
- Ubuntu 20.04 çalıştıran bir sunucu kurun ve Sudo ayrıcalıklarına sahip root olmayan bir kullanıcı oluşturun. Aşağıdaki adımlarla devam etmek için root olmayan kullanıcıyla oturum açın.
- Docker'ı yükleyin - Ubuntu'da Docker nasıl kurulur ve çalıştırılır üzerine bir eğitimimiz var, 1, 2, 3 ve 4. adımları izlemeniz gerekir. Bu, herhangi bir Ubuntu dağıtımı için çalışacaktır.
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 :
|
1 |
docker volume create --name Step1DataVolume |
Birim oluşturmanın başarılı olduğunu gösteren aşağıdaki çıktıyı görmelisiniz:
![]()
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:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
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:
|
1 |
echo "Step One Sample Text" > /Step1DataVolume/StepOne.txt |
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:
|
1 |
docker volume inspect Step1DataVolume |
Aşağıdaki çıktıyı görmelisiniz:

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:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
Konteynerin içinde, StepOne.txt dosyasının var olduğunu doğrulamak için aşağıdaki komutu çalıştırın:
|
1 |
cat /Step1DataVolume/StepOne.txt |
Buna benzer bir çıktı görmelisiniz:

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:
|
1 |
docker run -ti --name=Step2Container1 -v Step2DataVolume:/Step2DataVolume ubuntu |
Konteynerin içindeyken, birime veri yazmak ve verilerin orada olduğunu doğrulamak için aşağıdaki komutu girin:
|
1 2 3 |
echo "Step Two Sample Text" > /Step2DataVolume/StepTwo.txt cat /Step2DataVolume/StepTwo.txt |
Aşağıda üç komutun çıktısı verilmiştir:

Ardından, konteynerden çıkın. Aşağıdaki komutu kullanarak konteyneri yeniden başlattığınızda, birim otomatik olarak bağlanacaktır:
|
1 |
docker start -ai Step2Container1 |
Konteynerin içinde, StepTwo.txt dosyasının varlığını aşağıdaki komutla kontrol ederek birimin bağlandığını doğrulayın:
|
1 |
cat /Step2DataVolume/StepTwo.txt |
İşte çıktı:

Şimdi konteynerden çıkabilirsiniz. Docker, başka bir konteynerin referans gösterdiği bir birimin silinmesini engeller. Şu komutu kullanarak birimi silmeyi deneyebilirsiniz:
|
1 |
docker volume rm Step2DataVolume |
Çıktıda şu hata mesajını görmelisiniz:
![]()
Çıktıda gösterilen konteyner kimliğini kullanarak konteyneri docker rm komutuyla silelim:
|
1 |
docker rm e3932e65e484bbf4524ca8de1b1dd99c4e92c12f92a9d6b0567a643d0aa6bb2d |
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:
|
1 |
docker volume ls |
İşte çıktı:

Şu adımda oluşturulan konteyneri silmek için: Adım 2, aşağıdaki komutu girin:
|
1 |
docker volume rm Step2DataVolume |
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:
|
1 |
docker run -ti --rm -v Step3DataVolume:/var ubuntu |
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:

Konteyneri oluşturmak, birimi bağlamak ve ls komutunu kullanarak birimin içeriğini listelemek için aşağıdaki komutu girin:
|
1 |
docker run --rm -v Step3DataVolume:/Step3DataVolume ubuntu ls Step3DataVolume |
Komuttan, temel imajdaki /var dizininin içeriğinin bir kopyası olan ve artık şu konumda bulunan benzer bir çıktı görmelisiniz: Step3DataVolume:

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:
|
1 |
docker run -ti --name=Step4Container1 -v Step4DataVolume:/Step4DataVolume ubuntu |
Konteynerin içinde, bir metin dosyası oluşturmak ve biraz metin eklemek için aşağıdaki komutu çalıştırın:
|
1 |
echo "Step Four Sample Text" > /Step4DataVolume/StepFour.txt |
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:
|
1 |
docker run -ti --name=Step4Container2 --volumes-from Step4Container1 ubuntu |
Konteynerin içinde, veri kalıcılığını doğrulamak için cat komutunu kullanın:
|
1 |
cat /Step4DataVolume/StepFour.txt |
Aşağıdaki çıktıyı görmelisiniz:

Aşağıdaki komutu girerek Step4Container2 üzerinden dosyaya biraz daha metin ekleyebiliriz:
|
1 |
echo "We are appending text while inside Step4Container2" >> /Step4DataVolume/StepFour.txt |
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:
|
1 |
docker start -ai Step4Container1 |
Aşağıdaki komutu kullanarak değişiklikleri kontrol edin:
|
1 |
cat /Step4DataVolume/StepFour.txt |
Aşağıdaki ekran görüntüsüne benzer bir çıktı görmelisiniz:

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:
|
1 |
docker run -ti --name=Step4Container3 --volumes-from Step4Container1:ro ubuntu |
Konteynerin içine girdikten sonra, aşağıdaki komutu girerek birimdeki metin dosyasını okuyabilirsiniz:
|
1 |
cat /Step4DataVolume/StepFour.txt |

Ancak, aşağıdaki komutu kullanarak dosyayı kaldırmayı denerseniz:
|
1 |
rm /Step4DataVolume/StepFour.txt |
Terminalinizde şu şekilde bir hata mesajı alacaksınız:
![]()
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:
|
1 2 3 |
docker rm Step4Container1 Step4Container2 Step4Container3 docker volume rm Step4DataVolume |
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:
- Bir Docker Konteyneri ile Host Arasında Veri Paylaşımı Nasıl Yapılır
- Docker Kaynaklarını Temizleme – İmajlar, Konteynerler ve Birimler
- Docker Compose ile Laravel, Nginx ve MySQL Dağıtımı
- CentOS 7 üzerinde Docker Kurulumu ve Yapılandırması
Keyifli Çalışmalar!
Yorumlar
Henüz yorum yapılmamış. İlk siz olun.