Docker Birimleri ve Bağlama Bağlantıları: Konteyner Verilerini Doğru Şekilde Kalıcılaştırın

  1. Ana sayfa
  2. Blog
  3. DevOps

DevOps

Docker Birimleri ve Bağlama Bağlantıları: Konteyner Verilerini Doğru Şekilde Kalıcılaştırın

Bir kabı kaldırdığınızda, onu daha güvenli bir yerde saklamadığınız sürece içindeki veriler de onunla birlikte gider. Birimler, bağlama bağlantıları ve tmpf’ler arasındaki farkı, her birinin ne zaman kullanılacağını ve önemli olanların nasıl yedekleneceğini öğrenin.

9 dk okuma
Docker birimleri ve bağlama bağları: konteyner verilerini doğru şekilde sürdürün

Önemli noktalar

  • Bir konteynerin yazılabilir katmanı konteynerle birlikte silinir, bu nedenle önemli verilerin bir montaja ihtiyacı vardır.
  • Adlandırılmış birimler Docker tarafından yönetilir ve veritabanları ve üretim verileri için olağan seçimdir.
  • Bind mount’lar bir ana bilgisayar klasörünü eşler; bu da onları geliştirme sırasında canlı kod için ideal kılar.
  • docker compose down -v birimleri siler, bu nedenle dikkatli kullanın ve test edilmiş yedekleri saklayın.

Bir kapsayıcıda bir veritabanı başlatırsınız, biraz veri eklersiniz, kapsayıcıyı çıkarırsınız ve yeni bir tane başlatırsınız. Veriler gitti. Hemen hemen herkes bu dersi zor yoldan öğrenir. Docker birimleri ve bağlama bağlantıları, verileri herhangi bir konteynerin ömrü boyunca canlı tutmak için mevcuttur.

Bu kılavuz her birinin nasıl çalıştığını ve nasıl seçileceğini açıklamaktadır. Buradaki komutlar ve dosyalar, Docker’ın belgelenmiş davranışına dayanan standart örneklerdir ve bunları bu makale için çalıştırmadık, bu nedenle bunları ilk önce tek kullanımlık veriler üzerinde deneyin. Ayrıntılar Docker sürümleri arasında ve Docker Masaüstünde farklılık gösterebilir. Container’lar konusunda yeniyseniz Yeni başlayanlar için Docker eğitimimiz ile başlayın.

Kapsayıcı verileri neden kayboluyor?

Docker görüntüsü salt okunur katmanlardan oluşur. Bir konteyner başladığında, Docker üstüne ince bir yazılabilir katman ekler ve tüm değişiklikler oraya gider. Bu katman durma ve yeniden başlama durumunda hayatta kalır, ancak kapsayıcı silindiğinde kaldırılır.

docker run -d --name db -e POSTGRES_PASSWORD=devonly postgres:17
# ... create tables and add data ...
docker rm -f db
docker run -d --name db -e POSTGRES_PASSWORD=devonly postgres:17
# The data you added is not there

Bu tasarım gereğidir, çünkü kapları serbestçe değiştirmenize olanak sağlar. Bu, saklamanız gereken her şeyin konteynerin dışında yaşaması gerektiği anlamına gelir. Bunu yapmanın üç yolu vardır:

Tür Depolandı Konteynerin çıkarılmasından sağ kurtuldu mu?
Adlandırılmış cilt Docker tarafından yönetilen bir alan Evet
Bağlama montajı Seçtiğiniz bir ana bilgisayar yolu Evet
tmpfs montajı Ana bilgisayar belleği Hayır

Docker birimleri ve bağlama bağları yan yana

Görünüş Adlandırılmış cilt Bağlama montajı
Tarafından yönetilmektedir Liman işçisi sen
Konum Docker’ın depolama alanı Ana bilgisayardaki herhangi bir yol
Ana bilgisayar klasörlerine bağlı mı? Hayır Evet
Ana bilgisayardan düzenleme Tasarım gereği garip Kolay, değişiklikler anında görünür
Boş hedef görüntüden önceden doldurulmuş mu? Evet Hayır, ana makine yolu onu gizliyor
Docker CLI komutları Evet, docker volume Hayır
Uzak depolama için sürücüler Evet Hayır
Şunun için en iyisi: Veritabanları, üretim verileri Kaynak kodu geliştiriliyor

Adlandırılmış ciltler

Birim, Docker tarafından oluşturulan ve yönetilen depolama alanıdır. Ona ismiyle hitap edersiniz ve fiziksel olarak nerede yaşadığını umursamanıza gerek yoktur.

docker volume create pgdata

docker run -d --name db \
  -e POSTGRES_PASSWORD=devonly \
  -v pgdata:/var/lib/postgresql/data \
  postgres:17

Artık veritabanı dosyaları pgdata‘de bulunmaktadır. Kabı silin ve aynı hacimde yeni bir kap başlatın; verileriniz hâlâ orada olacaktır. Linux’ta birimler genellikle /var/lib/docker/volumes/ altında bulunur, ancak bu dosyaları doğrudan düzenlememelisiniz. Docker Desktop’ta normal bir klasörde değil, sanal bir makinenin içinde yaşarlar.

Kabın içindeki yol resme bağlıdır; bu nedenle resmin belgelerini kontrol edin. Yanlış yola montaj yapmak klasik bir hatadır: Her şey çalışıyor gibi görünür ancak veriler hala konteyner katmanına yazılmaktadır. Bir görüntünün daha yeni ana sürümleri de bu yolu değiştirebilir; bu nedenle, yükseltme yapmadan önce sürüm notlarını okuyun.

Docker, eğer mevcut değilse otomatik olarak adlandırılmış bir birim oluşturacaktır. İsimsiz olarak oluşturulan anonim bir birim de çalışır, ancak uzun, rastgele bir kimlik alır ve izini kaybetmesi kolaydır. Her zaman birimlerinize ad verin.

Bağlama bağlantıları

Bağlama montajı, belirli bir ana bilgisayar yolunu doğrudan kapsayıcıya eşler. Her iki taraf da aynı dosyaları anında görür. Bu, düzenleyicinizdeki düzenlemelerin yeniden oluşturma gerekmeden çalışan kapsayıcıda etkili olması nedeniyle onu geliştirme için mükemmel kılar:

docker run -d --name web \
  -p 8080:80 \
  -v "$(pwd)/site:/usr/share/nginx/html:ro" \
  nginx:1.27

site/‘de bir dosyayı düzenleyin, tarayıcıyı yenileyin, değişikliği göreceksiniz. :ro, kabın içindeki montajı salt okunur hale getirir; bu, kabın oraya yazmaya gerek olmadığı durumlarda iyi bir alışkanlıktır.

Bağlama montajları bazı ödünleşimlerle birlikte gelir:

  • Sizi ana makineye bağlarlar. Yolun her makinede mevcut olması gerekir, dolayısıyla kurulumlar daha az taşınabilirdir.
  • Görselin içeriğini gizlerler. Eğer /app‘nin üzerine montaj yaparsanız, görüntünün içinde ne varsa görünmez hale gelir. Yaygın bir örnek, node_modules‘ün kaybolmasıdır.
  • Ana makineyi açığa çıkarırlar. Yazılabilir bağlantıya sahip bir kapsayıcı, gerçek ana makine dosyalarını değiştirebilir veya silebilir. Riski tam olarak anlamadığınız sürece asla / gibi hassas yolları veya Docker soketini monte etmeyin.
  • Performans farklılık gösterebilir. MacOS ve Windows için Docker Desktop’ta dosya paylaşımı, sanallaştırma sınırlarını aşar ve Linux’a göre daha yavaş olabilir.

tmpfs bağlar

Bir tmpfs montajı ana bilgisayarın belleğinde bulunur ve hiçbir zaman konteyner katmanına yazılmaz. Konteyner durduğunda kaybolur, dolayısıyla geçici dosyalara, önbelleklere ve kısa ömürlü hassas verilere uygundur:

docker run -d --tmpfs /app/cache:size=64m myapp:1.0

tmpfs Linux ana bilgisayarlarında mevcuttur. Ayrıca, verileri saklamayı umursamadığınız tek kullanımlık test ortamlarında veritabanlarını da hızlandırabilir.

-v veya –mount?

Her iki bayrak da çalışıyor. --mount daha uzundur, ancak daha açıktır ve birçok kişi bunu komut dosyalarında tercih eder:

# Short form
docker run -v pgdata:/var/lib/postgresql/data postgres:17

# Explicit form
docker run --mount type=volume,source=pgdata,target=/var/lib/postgresql/data postgres:17

# Bind mount, read-only
docker run --mount type=bind,source="$(pwd)"/site,target=/usr/share/nginx/html,readonly nginx:1.27

Anlamlı bir fark var. -v ile sizin için boş bir klasör olarak eksik bir ana bilgisayar yolu oluşturulur ve bu, bir yazım hatasını gizleyebilir. --mount ve bir bağlama türüyle Docker bunun yerine bir hata bildirir. Ayrıca, -v ile sol taraf türe karar verir: ad, birim anlamına gelir ve yol, bağlama montajı anlamına gelir. Yani -v data:/x ve -v ./data:/x çok farklı şeyler yaparlar.

Docker Compose’daki birimler

Çoğu gerçek proje, depolamayı bir Compose dosyasında bildirir. Bu, her biri kendi görevi için her iki türü de kullanır:

services:
  web:
    build: .
    ports:
      - "3000:3000"
    volumes:
      - ./src:/app/src      # bind mount: live code
    depends_on:
      - db

  db:
    image: postgres:17
    environment:
      POSTGRES_PASSWORD: devonly
    volumes:
      - pgdata:/var/lib/postgresql/data   # named volume: data

volumes:
  pgdata:

Adlandırılmış birimler üst düzey volumes bölümünde bildirilmelidir. Gerçek adın ön ekini proje adıyla birlikte oluşturun. Tam bir açıklama için Docker Compose eğitimimize bakın.

İpucu: docker compose down adlandırılmış birimleri tutar, ancak docker compose down -v bunları verilerinizle birlikte siler. -v içeren komut dosyaları ve kabuk geçmişi konusunda özellikle dikkatli olun.

Yararlı ses seviyesi komutları

Komut Ne işe yarar
liman işçisi hacmi ls Birimleri listeler
liman işçisi birimi adı oluştur Bir hacim oluşturur
liman işçisi birim inceleme adı Konumu dahil ayrıntıları gösterir
liman işçisi birimi rm adı Bir birimi ve içindeki verileri siler
liman işçisi hacim budaması Kullanılmayan birimleri kaldırır
liman işçisi sistemi df -v Birimler de dahil olmak üzere disk kullanımını gösterir

Bu işlem geri alınamayacağından onaylamadan önce prune‘in neyi kaldıracağını kontrol edin. Şu anda hiçbir kapsayıcının kullanmadığı birimler hâlâ önemli verileri barındırıyor olabilir.

Bir birimi yedekleme ve geri yükleme

Bir birim, hem birimi hem de ana klasörü bağlayan kısa ömürlü bir kapsayıcı çalıştırılarak yedeklenebilir:

# Back up
docker run --rm \
  -v pgdata:/data:ro \
  -v "$(pwd)":/backup \
  alpine tar czf /backup/pgdata.tar.gz -C /data .

# Restore into a new volume
docker volume create pgdata_restored
docker run --rm \
  -v pgdata_restored:/data \
  -v "$(pwd)":/backup \
  alpine tar xzf /backup/pgdata.tar.gz -C /data

Canlı bir veritabanı için bunun gibi dosyaların kopyalanması tutarsız bir durumu yakalayabilir. Önce konteyneri durdurun veya daha iyisi PostgreSQL için pg_dump gibi veritabanının kendi aracını kullanın. Ve asla geri yüklemediğiniz bir yedekleme aslında sadece bir umuttur, bu nedenle geri yüklemeyi test edin.

Dosya izinleri

Bağlamalarda en sık karşılaşılan sorun “İzin reddedildi” sorunudur. Dosyalar, sayısal kullanıcı ve grup kimliklerini Linux’ta tutar; dolayısıyla bir kapsayıcı, kullanıcı 1000 olarak çalışırsa ve ana bilgisayar klasörü başka bir kullanıcıya aitse, yazma işlemleri başarısız olur. Bunu düzeltmenin bazı yolları:

  • Kapsayıcıyı eşleşen bir kullanıcıyla çalıştırın: docker run --user "$(id -u):$(id -g)" ...
  • Dockerfile en iyi uygulamalarımızda açıklandığı gibi, görüntünüzde doğru sahipliği ayarlayın.
  • Yeni bir birim ilk kullanıldığında görüntü klasörünün sahipliğini üstlendiğinden, veriler için adlandırılmış birimleri tercih edin.
  • SELinux kullanan sistemlerde bağlama bağlantılarının :z veya :Z etiketine ihtiyacı olabilir.

Linux komutları kılavuzumuzun açıkladığı gibi, chmod 777‘in cazibesinden kaçının.

Hangisini kullanmalısınız?

Durum Kullanım
Veritabanı verileri Adlandırılmış cilt
Canlı düzenleme kaynak kodu Bağlama montajı
Deponuzdan bir yapılandırma dosyası Salt okunur bağlama montajı
Kapsayıcılar arasında veri paylaşımı Adlandırılmış cilt
Geçici önbellek veya çalışma dosyaları tmpf’ler
Tek kullanımlık test veritabanı tmpfs veya montaj yok
Üretimdeki uygulama kodu Görüntünün içine yerleştirin

Bu son satır önemli. Üretimde kod görüntüye aittir, böylece test ettiğiniz şey çalıştırdığınız şeydir. Kümelerde veri depolama, daha geniş Kubernetes belgelerinde ele alınan kalıcı birimler aracılığıyla yine farklı şekilde çalışır. Docker ve Kubernetes kılavuzumuz bu ikisinin nasıl bir ilişki içinde olduğunu açıklıyor.

Yaygın hatalar

  • Yanlış yola montaj. Veriler hâlâ konteyner katmanında bulunuyor ve daha sonra kayboluyor.
  • down -v‘yi rastgele çalıştırıyorum. Bu, adlandırılmış birimlerinizi siler.
  • Göreceli yolları -v ile kullanmak. -v data:/x gibi formlar, klasör eşlemesi yerine bir birim oluşturur.
  • Gizli dizileri yazılabilir bağlama bağlantılarına yerleştirme. Bunları salt okunur olarak ekleyin veya bir gizli dizi özelliği kullanın.
  • İki veritabanı kapsayıcısını bir birime yönlendirme. Bu, verileri bozabilir.
  • Yedeği yok. Birim, yedek değildir. Aynı diskte yaşıyor.

Son sözler

Temel kural kısadır: veriler için adlandırılmış birimler, düzenlediğiniz kod için bağlama bağlantıları ve uzun sürmemesi gereken şeyler için tmpf’ler. Tek kullanımlık bir veritabanında deneyin. Adlandırılmış bir birim oluşturun, bir satır ekleyin, kapsayıcıyı silin, yeni bir birim başlatın ve satırınızın hayatta kaldığını doğrulayın. Daha sonra ihtiyaç duymadan önce yedekleme ve geri yükleme işlemleri yapın.

Sık sorulan sorular

Docker birimi ile bağlama montajı arasındaki fark nedir?

Bir birim Docker tarafından yönetilir ve kendi alanında depolanır. Bağlama montajı, kontrol ettiğiniz belirli bir ana bilgisayar yolunu doğrudan kapsayıcıya eşler.

Bir konteynerin durdurulması içindeki verileri siler mi?

Hayır. Yazılabilir katmandaki veriler durma ve yeniden başlatma durumunda hayatta kalır. Bir birim veya bağlama biriminde depolanmadığı sürece kapsayıcı çıkarıldığında kaybolur.

Docker birimleri, docker oluşturulduktan sonra da devam ediyor mu?

Evet, adlandırılmış birimler liman işçisi tarafından oluşturulduktan sonra kalır. -v bayrağının eklenmesi, içerdikleri verilerle birlikte bunları da siler.

Docker birimleri nerede depolanıyor?

Linux’ta genellikle /var/lib/docker/volumes altındadır. Docker Desktop’ta sanal bir makinenin içinde yaşarlar. Konumu görmek için docker hacim denetimini kullanın.

Birden çok kapsayıcı bir birimi paylaşabilir mi?

Evet, birden fazla kapsayıcı bir birimi bağlayabilir. Uygulamanın eşzamanlı erişimi güvenli bir şekilde işlemesi gerekir ve veritabanları genellikle veri dosyalarını bu şekilde paylaşmamalıdır.

Öğrenmeye devam et

Stack Quora ile çalışın

Test, WordPress veya SEO konusunda yardıma mı ihtiyacınız var?

Ekiplerin daha iyi yazılımlar sunmasına ve sitelerini büyütmesine yardımcı oluyoruz. Bize ne üzerinde çalıştığınızı söyleyin, biz de bir sonraki adım için net bir öneride bulunalım.

Okumaya devam et

Daha fazla kılavuz test, yapay zeka ve modern geliştirme

Bu makaleyi beğendiniz mi? Bir konu seçin ve doğrudan en yeni eğitimlerimize geçin.

Yapay zekâ

Yapay Zeka Halüsinasyonları Açıklandı: Dil Modelleri Neden İşleri Düzeltiyor ve Nasıl Azaltılabilir?

Yapay zeka halüsinasyonları açıkladı: ne olduklarını, dil modellerinin bunları neden ürettiğini, yaygın türlerini, temellendirme ve yönlendirmelerle…

Makaleyi okuyun →
DevOps

Açıklanan Ortam Değişkenleri: .env Dosyaları, Sırlar ve Yapılandırma Doğru Yapıldı

Çalıştırdığımız Python örnekleriyle açıklanan ortam değişkenleri: bunları okumak ve ayarlamak, neden her değerin bir dize olduğu, .env dosyaları, sü…

Makaleyi okuyun →
Yazılım geliştirme

API Hız Sınırlamasının Açıklaması: Algoritmalar, Başlıklar ve 429 Hatalarının Ele Alınması

API hızı sınırlaması, çalıştırdığımız bir simülasyonla açıklanmıştır: belirteç kümesi, sabit pencere, kayan pencere, 429 yanıt, hız sınırı başlıklar…

Makaleyi okuyun →
Test otomasyonu

Python'da alay etme: Unittest.mock, patch ve Testleri Yalan Yapan Hatalar

Unittest.mock ile Python'da alay etme, test edildi: Sahte ve dönüş_değeri, yan_etki, bir adın kullanıldığı yerde yama uygulama, spesifikasyon ve oto…

Makaleyi okuyun →
Yazılım testi

Kod Kapsamının Açıklaması: Hat ve Şube Kapsamı ve %100'ün Gerçek Anlamı

Kod kapsamı gerçek bir kapsama.py çalışmasıyla açıklanmıştır: hat, şube ve durum kapsamı, bir raporun okunması, %100 kapsamın neden hâlâ hataları ka…

Makaleyi okuyun →
Veritabanları ve SQL

SQL'de DELETE vs TRUNCATE vs DROP: Farklılıklar, Geri Alma ve Her Biri Ne Zaman Kullanılmalı

DELETE vs TRUNCATE vs DROP test edilmiş SQL ile açıklandı: her birinin neyi kaldırdığı, geri aldığı, tetiklediği, kimlik sıfırlaması, hızı ve Postgr…

Makaleyi okuyun →
Veritabanları ve SQL

Açıklanan SQL Görünümleri: Örneklerle Tuzakları Oluşturun, Kullanın ve Önleyin

Çalıştırdığımız sorgularla açıklanan SQL görünümleri: görünüm oluşturma, canlı sonuçlar, sütunları gizleme, performans, güncellenebilir ve gerçekleş…

Makaleyi okuyun →
Yazılım geliştirme

TypeScript Arayüzü ve Tür: Gerçek Farklılıklar, Derleyiciyle Test Edildi

TypeScript arayüzü ve türü, gerçek derleyiciyle kontrol edildi: her ikisinin de yapabileceği, yalnızca birinin yapabileceği, bildirim birleştirme, g…

Makaleyi okuyun →
Yazılım geliştirme

Python *args ve **kwargs'ın Açıklaması: Açık Örneklerle Esnek Fonksiyonlar

Python *args ve **kwargs çalıştırdığımız kodla açıklanmıştır: paketleme ve paketten çıkarma, parametre sırası, yalnızca anahtar kelime ve yalnızca k…

Makaleyi okuyun →
Yazılım geliştirme

Python Lambda İşlevleri: Söz Dizimi, Gerçek Kullanımlar ve Ne Zaman Kullanılmaması Gerektiği

Çalıştırdığımız kodla açıklanan Python lambda işlevleri: sözdizimi, anahtarla sıralama, harita ve filtre, kapatmalar, geç bağlama tuzağı ve normal b…

Makaleyi okuyun →
Yapay zekâ

Yapay Zeka Ajanları Nelerdir? Çalıştırabileceğiniz Basit Bir Aracı Döngüsüyle Nasıl Çalışırlar?

Yapay zeka ajanları nedir? Aracı döngüsüne, araçlara, belleğe ve korkuluklara ilişkin basit bir kılavuz, çalıştırdığımız küçük bir Python döngüsü, g…

Makaleyi okuyun →
DevOps

İzleme ve Gözlemlenebilirlik: Günlükler, Metrikler ve İzlerle Gerçek Fark

İzleme ve gözlemlenebilirliğin açıklanması: bilinen ve bilinmeyen arızalar, günlükler, ölçümler ve izler, ödeme olayının gözden geçirilmesi, altın s…

Makaleyi okuyun →
DevOps

Docker Birimleri ve Bağlama Bağlantıları: Konteyner Verilerini Doğru Şekilde Kalıcılaştırın

Docker birimleri ile bağlama bağlamaları arasındaki karşılaştırma açıklandı: kapsayıcı verilerinin neden kaybolduğu, adlandırılmış birimler, bağlama…

Makaleyi okuyun →
Test otomasyonu

TDD ve BDD: Temel Farklılıklar, Her İki Şekilde Geliştirilmiş Bir Özellik ve Her Birinin Ne Zaman Kullanılacağı

TDD ve BDD, her iki yönde de oluşturulmuş bir indirim özelliğiyle açıklandı: çalıştırdığımız kodla kırmızı-yeşil-refactor, Verilen-Ne Zaman-O Zaman …

Makaleyi okuyun →
Yazılım geliştirme

Git merge vs rebase: farklar, örnekler ve hangisi ne zaman kullanılır

Git merge vs rebase; gerçek log çıktısı, karşılaştırma tablosu, rebase'in altın kuralı ve güvenli bir ekip iş akışıyla anlatılıyor.

Makaleyi okuyun →
Yazılım geliştirme

Python Liste Üreteci (List Comprehension): Sözdizimi, Örnekler ve Kaçınılacak Durumlar

Python list comprehension anlatımı: sözdizimi, filtreleme, if-else, iç içe döngüler, ölçülmüş süreler ve düz for döngüsünün daha iyi olduğu durumlar.

Makaleyi okuyun →
Veritabanları ve SQL

SQL JOIN Örneklerle Açıklama (Inner, Left, Right, Full)

SQL JOIN'leri örnek tablolar ve sorgularla adım adım öğrenin: INNER, LEFT, RIGHT, FULL, CROSS ve SELF; yaygın hatalar ve performans ipuçları.

Makaleyi okuyun →