{"id":276,"date":"2026-07-24T12:00:00","date_gmt":"2026-07-24T12:00:00","guid":{"rendered":"https:\/\/konteynerium.com\/?p=215"},"modified":"2026-10-06T12:19:40","modified_gmt":"2026-10-06T12:19:40","slug":"docker-volumes-kalici-veri-yonetimi","status":"publish","type":"post","link":"https:\/\/konteynerium.com\/index.php\/2026\/07\/24\/docker-volumes-kalici-veri-yonetimi\/","title":{"rendered":"Docker Volumes: Kal\u0131c\u0131 Veri Y\u00f6netimi"},"content":{"rendered":"<p>Bir container silindi\u011finde, i\u00e7ine yaz\u0131lm\u0131\u015f her \u015fey de onunla birlikte gider \u2014 container&#8217;lar tasar\u0131m gere\u011fi <em>ge\u00e7icidir<\/em> (ephemeral). Peki bir veritaban\u0131 container&#8217;\u0131n\u0131 yeniden ba\u015flatt\u0131\u011f\u0131n\u0131zda t\u00fcm verinizin kaybolmas\u0131n\u0131 nas\u0131l \u00f6nlersiniz? Cevap: <strong>volume<\/strong>&#8216;ler \u2014 container&#8217;\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fcnden ba\u011f\u0131ms\u0131z, kal\u0131c\u0131 veri depolama alanlar\u0131.<\/p>\n<h2>Container&#8217;lar neden ge\u00e7icidir?<\/h2>\n<p>Bir container, imaj\u0131n \u00fczerine ince, yaz\u0131labilir bir katman (writable layer) ekleyerek \u00e7al\u0131\u015f\u0131r. Container i\u00e7inde yapt\u0131\u011f\u0131n\u0131z her de\u011fi\u015fiklik (yeni dosya, log kayd\u0131, veritaban\u0131 sat\u0131r\u0131) bu ince katmana yaz\u0131l\u0131r. Container silindi\u011finde bu katman da siliniyor \u2014 imaj\u0131n kendisi hi\u00e7 de\u011fi\u015fmiyor. Bu, ayn\u0131 imajdan defalarca temiz bir kopya ba\u015flatabilmenizi sa\u011flayan tasar\u0131m\u0131n ta kendisi, ama kal\u0131c\u0131 veri i\u00e7in ayr\u0131 bir mekanizma gerektirir.<\/p>\n<h2>\u00dc\u00e7 depolama se\u00e7ene\u011fi<\/h2>\n<table>\n<thead>\n<tr>\n<th>Y\u00f6ntem<\/th>\n<th>Nerede saklan\u0131r<\/th>\n<th>Ne zaman kullan\u0131l\u0131r<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Named volume<\/strong><\/td>\n<td>Docker&#8217;\u0131n y\u00f6netti\u011fi alanda (<code>\/var\/lib\/docker\/volumes\/...<\/code>)<\/td>\n<td>Veritabanlar\u0131, kal\u0131c\u0131 uygulama verisi \u2014 <strong>\u00f6nerilen y\u00f6ntem<\/strong><\/td>\n<\/tr>\n<tr>\n<td><strong>Bind mount<\/strong><\/td>\n<td>Host&#8217;ta sizin belirledi\u011finiz herhangi bir dizin<\/td>\n<td>Geli\u015ftirme s\u0131ras\u0131nda kaynak kodu container&#8217;a canl\u0131 yans\u0131tmak<\/td>\n<\/tr>\n<tr>\n<td><strong>tmpfs mount<\/strong><\/td>\n<td>Sadece host&#8217;un belle\u011finde (RAM), diske hi\u00e7 yaz\u0131lmaz<\/td>\n<td>Ge\u00e7ici, hassas veriler (\u00f6rn. \u015fifreleme anahtarlar\u0131)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Named volume: kal\u0131c\u0131 veri i\u00e7in standart yol<\/h2>\n<pre><code># Bir volume olu\u015ftur (iste\u011fe ba\u011fl\u0131 \u2014 run s\u0131ras\u0131nda da otomatik olu\u015fur)\ndocker volume create pg_data\n\n# PostgreSQL container'\u0131n\u0131 bu volume'e ba\u011fla\ndocker run -d --name veritabani \\\n  -e POSTGRES_PASSWORD=gizli123 \\\n  -v pg_data:\/var\/lib\/postgresql\/data \\\n  postgres:16\n\n# Container'\u0131 sil, volume'\u00fc S\u0130LME\ndocker rm -f veritabani\n\n# Ayn\u0131 volume'e ba\u011fl\u0131 yeni bir container ba\u015flat \u2014 veri h\u00e2l\u00e2 orada!\ndocker run -d --name veritabani-v2 \\\n  -e POSTGRES_PASSWORD=gizli123 \\\n  -v pg_data:\/var\/lib\/postgresql\/data \\\n  postgres:16<\/code><\/pre>\n<p>Buradaki kritik nokta: <code>docker rm<\/code> ile container&#8217;\u0131 sildi\u011finizde volume dokunulmadan kal\u0131r. Yeni bir container ayn\u0131 volume ad\u0131n\u0131 referans etti\u011finde, \u00f6nceki t\u00fcm veriye sorunsuzca eri\u015fir.<\/p>\n<div class=\"callout\">\n  <span class=\"glyph\">\u2713<\/span><\/p>\n<p>Volume&#8217;lerinizi y\u00f6netmek i\u00e7in: <code>docker volume ls<\/code> (listele), <code>docker volume inspect pg_data<\/code> (detaylar\u0131 g\u00f6r), <code>docker volume rm pg_data<\/code> (sil \u2014 sadece hi\u00e7bir container kullanm\u0131yorsa).<\/p>\n<\/div>\n<h2>Bind mount: geli\u015ftirme s\u0131ras\u0131nda canl\u0131 kod yans\u0131tma<\/h2>\n<p>Geli\u015ftirme yaparken, kaynak kodunuzu her de\u011fi\u015fiklikte yeniden imaj build etmeden container i\u00e7ine anl\u0131k yans\u0131tmak isteyebilirsiniz. Bunun i\u00e7in host&#8217;taki bir dizini do\u011frudan container&#8217;a ba\u011flayan bind mount kullan\u0131l\u0131r:<\/p>\n<pre><code># Host'taki .\/src dizinini container i\u00e7indeki \/app\/src'e ba\u011fla\ndocker run -d --name gelistirme \\\n  -v $(pwd)\/src:\/app\/src \\\n  -p 3000:3000 \\\n  node:20-alpine npm run dev<\/code><\/pre>\n<p>Art\u0131k host&#8217;ta bir dosyay\u0131 d\u00fczenledi\u011finizde de\u011fi\u015fiklik an\u0131nda container i\u00e7inde de g\u00f6r\u00fcn\u00fcr \u2014 imaj\u0131 yeniden build etmeye gerek kalmaz. Bind mount&#8217;un dezavantaj\u0131 ta\u015f\u0131nabilirliktir: host&#8217;un dosya sistem yap\u0131s\u0131na ba\u011f\u0131ml\u0131 oldu\u011fu i\u00e7in, ayn\u0131 komutu farkl\u0131 bir makinede \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda dizin yolunun orada da var olmas\u0131 gerekir.<\/p>\n<h2>Docker Compose&#8217;da volume tan\u0131mlamak<\/h2>\n<pre><code>services:\n  db:\n    image: postgres:16\n    environment:\n      POSTGRES_PASSWORD: gizli123\n    volumes:\n      - pg_data:\/var\/lib\/postgresql\/data   # named volume\n\n  web:\n    build: .\n    volumes:\n      - .\/src:\/app\/src                     # bind mount\n\nvolumes:\n  pg_data:   # named volume'\u00fc burada tan\u0131mlamak gerekir<\/code><\/pre>\n<h2>S\u0131k yap\u0131lan hata: yanl\u0131\u015fl\u0131kla volume silmek<\/h2>\n<p>Silme komutlar\u0131na dikkat: <code>docker compose down -v<\/code>, Compose dosyas\u0131ndaki isimli volume&#8217;leri <strong>kal\u0131c\u0131 olarak<\/strong> siler (d\u00fcz <code>docker compose down<\/code> silmez). <code>docker volume prune<\/code> ve <code>docker system prune --volumes<\/code> Docker 29.4 denemesinde yaln\u0131zca <em>anonim<\/em> volume&#8217;leri temizledi; isimli volume, hi\u00e7bir container&#8217;a ba\u011fl\u0131 olmasa da yerinde kald\u0131. <code>docker volume prune -a<\/code> ise ba\u011fl\u0131 olmayan isimli volume&#8217;leri de siler. Production ortam\u0131nda \u00e7al\u0131\u015ft\u0131rmadan \u00f6nce <code>docker volume ls<\/code> ile kontrol edin \u2014 geri d\u00f6n\u00fc\u015f\u00fc yoktur.<\/p>\n<p>Verinizi kal\u0131c\u0131 hale getirdikten sonra s\u0131radaki do\u011fal ad\u0131m, birden fazla container&#8217;\u0131n birbiriyle nas\u0131l g\u00fcvenli ve \u00f6ng\u00f6r\u00fclebilir \u015fekilde haberle\u015fti\u011fidir \u2014 bunu bir sonraki yaz\u0131da, Docker networking ba\u015fl\u0131\u011f\u0131 alt\u0131nda ele al\u0131yoruz.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Container&#8217;lar neden ge\u00e7icidir, named volume ile bind mount aras\u0131ndaki fark nedir ve bir veritaban\u0131n\u0131n verisini container yeniden ba\u015flasa da nas\u0131l korursunuz \u2014 hepsi \u00f6rneklerle.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"seviye":[8],"class_list":["post-276","post","type-post","status-publish","format-standard","hentry","category-docker-derinlemesine","seviye-orta"],"_links":{"self":[{"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/posts\/276","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/comments?post=276"}],"version-history":[{"count":2,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/posts\/276\/revisions"}],"predecessor-version":[{"id":610,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/posts\/276\/revisions\/610"}],"wp:attachment":[{"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/media?parent=276"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/categories?post=276"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/tags?post=276"},{"taxonomy":"seviye","embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/seviye?post=276"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}