{"id":44574,"date":"2026-09-07T21:04:24","date_gmt":"2026-09-07T18:04:24","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/"},"modified":"2026-09-07T21:04:53","modified_gmt":"2026-09-07T18:04:53","slug":"dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/","title":{"rendered":"Docker&#8217;\u0131 Anlamadan \u00d6nce Kullanmak: Bir Geli\u015ftiricinin \u0130tiraflar\u0131"},"content":{"rendered":"<h2>Docker&#8217;\u0131 Anlamadan \u00d6nce Kullanmak: Bir Geli\u015ftiricinin \u0130tiraflar\u0131<\/h2>\n<p>Bir\u00e7o\u011fumuzun teknoloji yolculu\u011funda benzer bir hikayesi vard\u0131r: yeni bir araca veya teknolojiye rastlar\u0131z, temel komutlar\u0131n\u0131 \u00f6\u011freniriz ve sihirli bir \u015fekilde \u00e7al\u0131\u015fmaya ba\u015flad\u0131\u011f\u0131n\u0131 g\u00f6r\u00fcr\u00fcz. \u0130\u015fte Docker da tam olarak bu t\u00fcrden bir ara\u00e7. Konteynerle\u015ftirme d\u00fcnyas\u0131n\u0131n kap\u0131lar\u0131n\u0131 aralayan bu g\u00fc\u00e7l\u00fc platform, uygulamalar\u0131m\u0131z\u0131 paketleme ve \u00e7al\u0131\u015ft\u0131rma \u015feklimizi k\u00f6kten de\u011fi\u015ftirdi. Ancak, ka\u00e7\u0131m\u0131z <code>docker run<\/code> veya <code>docker build<\/code> komutlar\u0131n\u0131 ezbere yazarken, asl\u0131nda arka planda nelerin d\u00f6nd\u00fc\u011f\u00fcn\u00fc tam olarak anlad\u0131k? Bu makale, Docker&#8217;\u0131 sadece &#8220;kullanmaktan&#8221; &#8220;anlamaya&#8221; do\u011fru giden o d\u00f6n\u00fc\u015ft\u00fcr\u00fcc\u00fc yolculu\u011fu ele alacak, temel kavramlardan ileri d\u00fczey konulara kadar her \u015feyi ad\u0131m ad\u0131m a\u00e7\u0131klayarak sizi bilin\u00e7li bir Docker kullan\u0131c\u0131s\u0131 yapmay\u0131 hedefliyor.<\/p>\n<h2>Docker&#8217;\u0131 Anlamadan \u00d6nce Kullanmak: Neden Hepimiz Bu Yoldan Ge\u00e7tik?<\/h2>\n<p>Yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda h\u0131zla adapte olmak ve yeni teknolojileri \u00f6\u011frenmek, adeta bir hayatta kalma becerisi haline geldi. Bu s\u00fcre\u00e7te, bazen bir arac\u0131n sundu\u011fu pratik faydalar, onun derinlemesine anla\u015f\u0131lmas\u0131ndan \u00f6nce gelir. Docker, bu durumu en iyi \u00f6zetleyen ara\u00e7lardan biridir. Projelerin ba\u011f\u0131ml\u0131l\u0131k cehenneminden kurtulmak, &#8220;benim bilgisayar\u0131mda \u00e7al\u0131\u015f\u0131yor&#8221; sendromunu sona erdirmek ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini basitle\u015ftirmek gibi cazip vaatleriyle Docker, k\u0131sa s\u00fcrede geli\u015ftiricilerin vazge\u00e7ilmezi oldu. Ancak bu h\u0131zl\u0131 benimseme, \u00e7o\u011fu zaman temel prensiplerin g\u00f6z ard\u0131 edilmesine yol a\u00e7t\u0131.<\/p>\n<p>Pek \u00e7ok geli\u015ftirici, t\u0131pk\u0131 bir araba kullanmay\u0131 \u00f6\u011frenir gibi, Docker komutlar\u0131n\u0131 ezberleyerek i\u015fe ba\u015flad\u0131. <code>docker pull<\/code> ile imajlar\u0131 \u00e7ektik, <code>docker run<\/code> ile konteynerleri \u00e7al\u0131\u015ft\u0131rd\u0131k, <code>docker build<\/code> ile kendi imajlar\u0131m\u0131z\u0131 olu\u015fturduk. Her \u015fey \u00e7al\u0131\u015f\u0131yordu ve bu, ilk ba\u015fta yeterli g\u00f6r\u00fcn\u00fcyordu. Ancak sorunlar ba\u015f g\u00f6stermeye ba\u015flad\u0131\u011f\u0131nda, \u00f6rne\u011fin bir konteynerin neden beklendi\u011fi gibi davranmad\u0131\u011f\u0131n\u0131, veri kayb\u0131 ya\u015fand\u0131\u011f\u0131n\u0131 veya a\u011f yap\u0131land\u0131rmas\u0131n\u0131n karma\u015f\u0131kla\u015ft\u0131\u011f\u0131n\u0131 fark etti\u011fimizde, temel bilgi eksikli\u011fi kendini g\u00f6sterdi. \u0130\u015fte tam da bu noktada, &#8220;Docker&#8217;\u0131 kullan\u0131yorum ama asl\u0131nda anlam\u0131yorum&#8221; hissi ortaya \u00e7\u0131kt\u0131. Bu makale, tam da bu hissi ya\u015fayanlar i\u00e7in bir rehber niteli\u011finde. Docker&#8217;\u0131n sadece bir komut sat\u0131r\u0131 arac\u0131 olmad\u0131\u011f\u0131n\u0131, arkas\u0131nda g\u00fc\u00e7l\u00fc bir felsefe ve mimari bar\u0131nd\u0131rd\u0131\u011f\u0131n\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Art\u0131k sadece komutlar\u0131 kopyalay\u0131p yap\u0131\u015ft\u0131rmak yerine, neyin neden \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 kavrayarak daha sa\u011flam ve g\u00fcvenilir uygulamalar geli\u015ftirebileceksiniz.<\/p>\n<h2>Docker Nedir ve Neden \u00d6nemlidir? Temel Ta\u015flar\u0131 Anlamak<\/h2>\n<p>Docker, uygulamalar\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 izole edilmi\u015f bir ortamda, yani &#8220;konteynerler&#8221; i\u00e7inde paketlemeyi ve \u00e7al\u0131\u015ft\u0131rmay\u0131 sa\u011flayan a\u00e7\u0131k kaynakl\u0131 bir platformdur. Peki, bu neden bu kadar \u00f6nemli? Geleneksel olarak, bir uygulamay\u0131 farkl\u0131 ortamlarda (geli\u015ftirme, test, \u00fcretim) \u00e7al\u0131\u015ft\u0131rmak, ba\u011f\u0131ml\u0131l\u0131k sorunlar\u0131, uyumsuzluklar ve &#8220;benim makinemde \u00e7al\u0131\u015f\u0131yor&#8221; itirazlar\u0131yla doluydu. Docker, bu sorunlar\u0131 k\u00f6kten \u00e7\u00f6zerek, uygulamalar\u0131n her yerde ayn\u0131 \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 garanti alt\u0131na al\u0131r. Bu, geli\u015ftiriciler i\u00e7in zaman tasarrufu, operasyon ekipleri i\u00e7in kolayl\u0131k ve genel olarak daha g\u00fcvenilir bir yaz\u0131l\u0131m da\u011f\u0131t\u0131m s\u00fcreci anlam\u0131na gelir.<\/p>\n<h3>Konteyner (Container) ve Sanal Makine (Virtual Machine) Fark\u0131 Nedir?<\/h3>\n<p>Docker&#8217;\u0131 anlaman\u0131n ilk ad\u0131m\u0131, konteynerlerin ne oldu\u011funu ve sanal makinelerden (VM &#8211; Virtual Machine) nas\u0131l ayr\u0131ld\u0131\u011f\u0131n\u0131 kavramakt\u0131r. Her iki teknoloji de uygulamalar\u0131 izole etme ve \u00e7al\u0131\u015ft\u0131rma amac\u0131 ta\u015f\u0131r, ancak bunu farkl\u0131 yakla\u015f\u0131mlarla yaparlar. Sanal makineler, fiziksel donan\u0131m\u0131n \u00fczerinde \u00e7al\u0131\u015fan bir hiperviz\u00f6r (hypervisor) arac\u0131l\u0131\u011f\u0131yla t\u00fcm bir i\u015fletim sistemini (guest OS) taklit ederler. Bu, her VM&#8217;nin kendi \u00e7ekirde\u011fi (kernel), k\u00fct\u00fcphaneleri ve ikili dosyalar\u0131 oldu\u011fu anlam\u0131na gelir. Sonu\u00e7 olarak, VM&#8217;ler olduk\u00e7a b\u00fcy\u00fck (gigabaytlarca) ve kaynak yo\u011fundur. Bir VM&#8217;yi ba\u015flatmak dakikalar alabilir ve \u00f6nemli miktarda RAM ve CPU t\u00fcketir.<\/p>\n<p>Konteynerler ise \u00e7ok daha hafif ve verimlidir. Bir sanal makinenin aksine, konteynerler kendi i\u015fletim sistemlerine sahip de\u011fildir; bunun yerine ana bilgisayar\u0131n (host) i\u015fletim sistemi \u00e7ekirde\u011fini (kernel) payla\u015f\u0131rlar. Her konteyner, yaln\u0131zca uygulaman\u0131n ihtiya\u00e7 duydu\u011fu k\u00fct\u00fcphaneleri, ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve ikili dosyalar\u0131 i\u00e7erir. Bu yap\u0131 sayesinde konteynerler megabaytlarca boyutunda olabilir, saniyeler i\u00e7inde ba\u015flar ve \u00e7ok daha az sistem kayna\u011f\u0131 t\u00fcketir. Konteynerler, dosya sistemi, s\u00fcre\u00e7ler ve a\u011f gibi kaynaklar\u0131 izole etmek i\u00e7in Linux&#8217;un cgroups ve namespace \u00f6zelliklerini kullan\u0131r. Bu sayede, ayn\u0131 ana bilgisayar \u00fczerinde birden fazla konteyner, birbirini etkilemeden g\u00fcvenli bir \u015fekilde \u00e7al\u0131\u015fabilir. Docker, bu konteyner teknolojisini kullan\u0131c\u0131 dostu bir aray\u00fczle sunarak, geli\u015ftiricilerin ve operasyon ekiplerinin konteynerleri kolayca olu\u015fturmas\u0131n\u0131, da\u011f\u0131tmas\u0131n\u0131 ve y\u00f6netmesini sa\u011flar. Bu temel ayr\u0131m, Docker&#8217;\u0131n neden modern yaz\u0131l\u0131m geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinin vazge\u00e7ilmez bir par\u00e7as\u0131 oldu\u011funu a\u00e7\u0131k\u00e7a ortaya koyar.<\/p>\n<h2>Docker&#8217;\u0131n Anatomisi: Docker Nas\u0131l \u00c7al\u0131\u015f\u0131r? Mimarisine Yak\u0131ndan Bak\u0131\u015f<\/h2>\n<p>Docker&#8217;\u0131n temelini olu\u015fturan mimariyi ve bile\u015fenleri anlamak, sadece komutlar\u0131 ezberlemekten \u00e7ok daha fazlas\u0131n\u0131 sunar. Docker, istemci-sunucu mimarisine dayal\u0131 bir yap\u0131ya sahiptir. Temelde, bir Docker istemcisi (CLI &#8211; Komut Sat\u0131r\u0131 Aray\u00fcz\u00fc) ve bir Docker daemon&#8217;u (sunucu) bulunur. \u0130stemci, kullan\u0131c\u0131n\u0131n Docker komutlar\u0131n\u0131 girmesini sa\u011flar ve bu komutlar\u0131 Docker daemon&#8217;una iletir. Daemon ise konteynerleri olu\u015fturan, \u00e7al\u0131\u015ft\u0131ran ve y\u00f6neten arka plan servisidir. Bu iki bile\u015fen aras\u0131ndaki ileti\u015fim genellikle REST API \u00fczerinden ger\u00e7ekle\u015fir. Docker ekosisteminde ayr\u0131ca, Docker imajlar\u0131n\u0131n depoland\u0131\u011f\u0131 bir kay\u0131t defteri (registry), genellikle Docker Hub gibi, bulunur. \u015eimdi, bu mimarinin temel yap\u0131 ta\u015flar\u0131na daha yak\u0131ndan bakal\u0131m.<\/p>\n<h3>Dockerfile: Uygulamalar\u0131m\u0131z\u0131n Tarifi<\/h3>\n<p>Dockerfile, bir Docker imaj\u0131n\u0131 olu\u015fturmak i\u00e7in gerekli t\u00fcm ad\u0131mlar\u0131 i\u00e7eren metin tabanl\u0131 bir talimat dosyas\u0131d\u0131r. T\u0131pk\u0131 bir yemek tarifi gibi, uygulaman\u0131z\u0131n konteyner i\u00e7inde nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131 ve yap\u0131land\u0131r\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m belirtir. Her sat\u0131r, imaj\u0131n yeni bir katman\u0131n\u0131 (layer) olu\u015fturur ve bu katmanlar, imaj\u0131n verimli bir \u015fekilde depolanmas\u0131n\u0131 ve payla\u015f\u0131lmas\u0131n\u0131 sa\u011flar. Dockerfile&#8217;daki talimatlar genellikle <code>FROM<\/code>, <code>RUN<\/code>, <code>COPY<\/code>, <code>EXPOSE<\/code>, <code>WORKDIR<\/code> ve <code>CMD<\/code> gibi anahtar kelimelerle ba\u015flar. \u00d6rne\u011fin, bir Node.js uygulamas\u0131n\u0131 Dockerize etmek i\u00e7in basit bir Dockerfile \u015f\u00f6yle g\u00f6r\u00fcnebilir:<\/p>\n<div class=\"code-container\">\n<pre><code>\n# FROM: Temel imaj\u0131m\u0131z\u0131 belirtiriz. Node.js 16 s\u00fcr\u00fcm\u00fcn\u00fc kullan\u0131yoruz.\nFROM node:16-alpine\n\n# WORKDIR: Konteyner i\u00e7inde \u00e7al\u0131\u015fma dizinini ayarlar\u0131z.\nWORKDIR \/app\n\n# COPY: Uygulama ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kopyalar\u0131z.\nCOPY package*.json .\/\n\n# RUN: Ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckleriz.\nRUN npm install\n\n# COPY: Uygulama kaynak kodunu kopyalar\u0131z.\nCOPY . .\n\n# EXPOSE: Uygulaman\u0131n dinledi\u011fi portu belirtiriz.\nEXPOSE 3000\n\n# CMD: Konteyner ba\u015flat\u0131ld\u0131\u011f\u0131nda \u00e7al\u0131\u015facak komutu belirtiriz.\nCMD [\"npm\", \"start\"]\n  <\/code><\/pre>\n<\/div>\n<p>Bu Dockerfile, uygulaman\u0131z i\u00e7in k\u00fc\u00e7\u00fck boyutlu bir Node.js ortam\u0131 olu\u015fturur, ba\u011f\u0131ml\u0131l\u0131klar\u0131 kurar, kodunuzu kopyalar ve uygulamay\u0131 3000 numaral\u0131 portta ba\u015flat\u0131r. Her bir komut, imaj\u0131n \u00fczerine yeni bir katman ekler ve bu katmanlar, imaj\u0131n verimli bir \u015fekilde \u00f6nbelle\u011fe al\u0131nmas\u0131n\u0131 ve yeniden kullan\u0131lmas\u0131n\u0131 sa\u011flar. Dockerfile&#8217;\u0131 do\u011fru bir \u015fekilde anlamak ve optimize etmek, daha k\u00fc\u00e7\u00fck, daha h\u0131zl\u0131 ve daha g\u00fcvenli imajlar olu\u015fturman\u0131n anahtar\u0131d\u0131r.<\/p>\n<h3>Docker Image: Uygulamalar\u0131m\u0131z\u0131n Kal\u0131b\u0131<\/h3>\n<p>Docker imaj\u0131, bir uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gereken her \u015feyi (kod, \u00e7al\u0131\u015fma zaman\u0131, sistem ara\u00e7lar\u0131, sistem k\u00fct\u00fcphaneleri ve ayarlar) i\u00e7eren, hafif, ba\u011f\u0131ms\u0131z ve y\u00fcr\u00fct\u00fclebilir bir yaz\u0131l\u0131m paketidir. \u0130majlar, Dockerfile&#8217;daki talimatlar kullan\u0131larak olu\u015fturulur ve bir kez olu\u015fturulduktan sonra de\u011fi\u015ftirilemezler (immutable). Bu de\u011fi\u015fmezlik, bir imaj\u0131n her zaman ayn\u0131 \u015fekilde davranmas\u0131n\u0131 sa\u011flar, bu da &#8220;benim makinemde \u00e7al\u0131\u015f\u0131yor&#8221; sorununu ortadan kald\u0131r\u0131r. \u0130majlar, katmanlar (layers) halinde d\u00fczenlenir. Her bir Dockerfile komutu, imaja yeni bir okuma-salt katman ekler. Bu katmanlama sistemi, imajlar\u0131n verimli bir \u015fekilde depolanmas\u0131n\u0131 ve payla\u015f\u0131lmas\u0131n\u0131 sa\u011flar. \u00d6rne\u011fin, birden fazla imaj ayn\u0131 temel katman\u0131 kullan\u0131yorsa, bu katman yaln\u0131zca bir kez depolan\u0131r. Bu da disk alan\u0131ndan tasarruf sa\u011flar ve imaj indirme s\u00fcrelerini k\u0131salt\u0131r.<\/p>\n<p>Bir imaj\u0131 olu\u015fturmak i\u00e7in, Dockerfile&#8217;\u0131n bulundu\u011fu dizinde a\u015fa\u011f\u0131daki komutu kullan\u0131r\u0131z:<\/p>\n<div class=\"code-container\">\n<pre><code>\ndocker build -t benim-node-uygulamam:1.0 .\n  <\/code><\/pre>\n<\/div>\n<p>Burada <code>-t<\/code> etiketi (tag) imaja bir isim ve s\u00fcr\u00fcm verirken, <code>.<\/code> (nokta) Dockerfile&#8217;\u0131n mevcut dizinde oldu\u011funu belirtir. Bu komut, Dockerfile&#8217;daki her bir talimat\u0131 s\u0131ras\u0131yla \u00e7al\u0131\u015ft\u0131rarak imaj katmanlar\u0131n\u0131 olu\u015fturur ve sonunda etiketlenmi\u015f bir imaj elde ederiz. Bu imaj\u0131 daha sonra Docker Hub gibi bir kay\u0131t defterine g\u00f6nderebilir ve farkl\u0131 ortamlarda kolayca da\u011f\u0131tabiliriz.<\/p>\n<h3>Docker Container: Uygulamalar\u0131m\u0131z\u0131n \u00c7al\u0131\u015fan \u00d6rne\u011fi<\/h3>\n<p>Docker konteyneri, bir Docker imaj\u0131n\u0131n \u00e7al\u0131\u015fan bir \u00f6rne\u011fidir. \u0130maj, bir uygulaman\u0131n statik bir kal\u0131b\u0131 iken, konteyner bu kal\u0131ptan \u00fcretilen dinamik, canl\u0131 bir s\u00fcre\u00e7tir. Bir konteyner ba\u015flat\u0131ld\u0131\u011f\u0131nda, imaj\u0131n \u00fczerine okuma-yazma katman\u0131 eklenir. Bu, konteynerin kendi durumunu ve de\u011fi\u015fikliklerini korurken, temel imaj\u0131n de\u011fi\u015fmeden kalmas\u0131n\u0131 sa\u011flar. Konteynerler, ana bilgisayar\u0131n kaynaklar\u0131ndan (CPU, RAM, a\u011f, depolama) izole edilmi\u015f bir ortamda \u00e7al\u0131\u015f\u0131r. Her konteynerin kendine ait bir dosya sistemi, s\u00fcre\u00e7 alan\u0131, a\u011f aray\u00fczleri ve kaynak limitleri vard\u0131r. Bu izolasyon, bir konteynerdeki sorunlar\u0131n di\u011fer konteynerleri veya ana bilgisayar\u0131 etkilemesini \u00f6nler.<\/p>\n<p>Bir imajdan konteyner ba\u015flatmak i\u00e7in a\u015fa\u011f\u0131daki komutu kullan\u0131r\u0131z:<\/p>\n<div class=\"code-container\">\n<pre><code>\ndocker run -p 80:3000 --name benim-web-servisim benim-node-uygulamam:1.0\n  <\/code><\/pre>\n<\/div>\n<p>Bu komut, <code>benim-node-uygulamam:1.0<\/code> imaj\u0131ndan yeni bir konteyner olu\u015fturur ve \u00e7al\u0131\u015ft\u0131r\u0131r. <code>-p 80:3000<\/code> parametresi, ana bilgisayar\u0131n 80 numaral\u0131 portunu konteynerin 3000 numaral\u0131 portuna ba\u011flar (port y\u00f6nlendirme). B\u00f6ylece, ana bilgisayar\u0131n 80 numaral\u0131 portuna gelen istekler, konteyner i\u00e7indeki uygulamaya y\u00f6nlendirilir. <code>--name<\/code> parametresi ise konteynere okunabilir bir isim verir. Konteynerler, uygulamalar\u0131n tutarl\u0131 bir \u015fekilde \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131, \u00f6l\u00e7eklendirilmesini ve y\u00f6netilmesini sa\u011flayan temel birimlerdir. Docker&#8217;\u0131n g\u00fcc\u00fc, bu konteynerleri kolayca olu\u015fturma, ba\u015flatma, durdurma ve silme yetene\u011finden gelir.<\/p>\n<h2>Pratik Uygulama: Ad\u0131m Ad\u0131m Kendi Docker Uygulaman\u0131z\u0131 Olu\u015fturma ve \u00c7al\u0131\u015ft\u0131rma<\/h2>\n<p>Teorik bilgileri peki\u015ftirmenin en iyi yolu, pratik yapmakt\u0131r. \u015eimdi, basit bir Node.js tabanl\u0131 web uygulamas\u0131n\u0131 ele al\u0131p, onu Docker ile konteynerle\u015ftirece\u011fiz. Bu s\u00fcre\u00e7, Dockerfile olu\u015fturmaktan imaj\u0131 derlemeye ve konteyneri \u00e7al\u0131\u015ft\u0131rmaya kadar t\u00fcm ad\u0131mlar\u0131 kapsayacak. Bu sayede, Docker&#8217;\u0131n nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 somut bir \u00f6rnek \u00fczerinden deneyimleyeceksiniz.<\/p>\n<h3>Basit Bir Web Uygulamas\u0131n\u0131 Dockerize Etmek<\/h3>\n<p>\u0130lk olarak, Node.js ile basit bir &#8220;Merhaba D\u00fcnya&#8221; uygulamas\u0131 olu\u015ftural\u0131m. Proje dizininizde <code>app.js<\/code> ad\u0131nda bir dosya olu\u015fturun ve i\u00e7ine a\u015fa\u011f\u0131daki kodu yap\u0131\u015ft\u0131r\u0131n:<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ app.js\nconst http = require('http');\n\nconst hostname = '0.0.0.0'; \/\/ Konteyner i\u00e7inde herhangi bir IP'den eri\u015filebilir olmal\u0131\nconst port = 3000;\n\nconst server = http.createServer((req, res) => {\n  res.statusCode = 200;\n  res.setHeader('Content-Type', 'text\/plain');\n  res.end('Merhaba Docker Dunyasi!\\n');\n});\n\nserver.listen(port, hostname, () => {\n  console.log(<code>Sunucu http:\/\/${hostname}:${port}\/ adresinde calisiyor.<\/code>);\n});\n  <\/code><\/pre>\n<\/div>\n<p>Ard\u0131ndan, Node.js projemizin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 tan\u0131mlamak i\u00e7in bir <code>package.json<\/code> dosyas\u0131na ihtiyac\u0131m\u0131z var. Ayn\u0131 dizinde a\u015fa\u011f\u0131daki i\u00e7eri\u011fe sahip bir <code>package.json<\/code> olu\u015fturun:<\/p>\n<div class=\"code-container\">\n<pre><code>\n{\n  \"name\": \"docker-merhaba\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Basit bir Node.js Docker uygulamasi\",\n  \"main\": \"app.js\",\n  \"scripts\": {\n    \"start\": \"node app.js\"\n  },\n  \"keywords\": [],\n  \"author\": \"\",\n  \"license\": \"ISC\"\n}\n  <\/code><\/pre>\n<\/div>\n<p>\u015eimdi bu uygulamay\u0131 Dockerize etmek i\u00e7in bir <code>Dockerfile<\/code> olu\u015ftural\u0131m. Proje dizininizin k\u00f6k\u00fcnde <code>Dockerfile<\/code> ad\u0131nda bir dosya olu\u015fturun (uzant\u0131s\u0131z) ve i\u00e7ine daha \u00f6nce bahsetti\u011fimiz talimatlar\u0131 ekleyin:<\/p>\n<div class=\"code-container\">\n<pre><code>\n# app.js ve package.json dosyalar\u0131n\u0131zla ayn\u0131 dizinde olmal\u0131\nFROM node:16-alpine\nWORKDIR \/app\nCOPY package*.json .\/\nRUN npm install\nCOPY . .\nEXPOSE 3000\nCMD [\"npm\", \"start\"]\n  <\/code><\/pre>\n<\/div>\n<p>Bu Dockerfile, Node.js uygulaman\u0131z\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in gerekli t\u00fcm ad\u0131mlar\u0131 i\u00e7erir. <code>WORKDIR \/app<\/code> ile konteyner i\u00e7inde bir \u00e7al\u0131\u015fma dizini belirledik. <code>COPY package*.json .\/<\/code> ile ba\u011f\u0131ml\u0131l\u0131k dosyas\u0131n\u0131 kopyalad\u0131k ve <code>RUN npm install<\/code> ile ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckledik. Daha sonra t\u00fcm uygulama kodumuzu kopyalad\u0131k. <code>EXPOSE 3000<\/code> ile uygulaman\u0131n 3000 numaral\u0131 portu dinleyece\u011fini bildirdik ve <code>CMD [\"npm\", \"start\"]<\/code> ile konteyner ba\u015flad\u0131\u011f\u0131nda \u00e7al\u0131\u015facak komutu belirledik.<\/p>\n<p>Uygulaman\u0131z\u0131n Docker imaj\u0131n\u0131 olu\u015fturmak i\u00e7in, Dockerfile&#8217;\u0131n bulundu\u011fu dizinde terminali a\u00e7\u0131n ve a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<div class=\"code-container\">\n<pre><code>\ndocker build -t benim-ilk-docker-uygulamam:1.0 .\n  <\/code><\/pre>\n<\/div>\n<p>Bu komut, Dockerfile&#8217;daki talimatlar\u0131 s\u0131ras\u0131yla \u00e7al\u0131\u015ft\u0131rarak imaj\u0131 derleyecektir. \u0130\u015flem tamamland\u0131\u011f\u0131nda, <code>docker images<\/code> komutunu kullanarak olu\u015fturdu\u011funuz imaj\u0131 listede g\u00f6rebilirsiniz.<\/p>\n<p>Son ad\u0131m olarak, olu\u015fturdu\u011funuz imajdan bir konteyner \u00e7al\u0131\u015ft\u0131ral\u0131m. Uygulamam\u0131z\u0131n ana bilgisayardan eri\u015filebilir olmas\u0131 i\u00e7in port y\u00f6nlendirme yapmam\u0131z gerekiyor. Uygulama konteyner i\u00e7inde 3000 numaral\u0131 portu dinledi\u011fi i\u00e7in, ana bilgisayar\u0131m\u0131z\u0131n \u00f6rne\u011fin 8080 numaral\u0131 portunu bu 3000 numaral\u0131 porta ba\u011flayabiliriz:<\/p>\n<div class=\"code-container\">\n<pre><code>\ndocker run -p 8080:3000 --name merhaba-sunucu benim-ilk-docker-uygulamam:1.0\n  <\/code><\/pre>\n<\/div>\n<p>Bu komutu \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra, taray\u0131c\u0131n\u0131zdan <code>http:\/\/localhost:8080<\/code> adresine giderek &#8220;Merhaba Docker D\u00fcnyas\u0131!&#8221; mesaj\u0131n\u0131 g\u00f6rmelisiniz. Tebrikler! Kendi Docker uygulaman\u0131z\u0131 ba\u015far\u0131yla olu\u015fturdunuz ve \u00e7al\u0131\u015ft\u0131rd\u0131n\u0131z. Bu basit \u00f6rnek, Docker&#8217;\u0131n temel i\u015f ak\u0131\u015f\u0131n\u0131 anlaman\u0131z i\u00e7in harika bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r. Konteyneri durdurmak i\u00e7in terminalde <code>CTRL+C<\/code> yapabilir veya ba\u015fka bir terminalde <code>docker stop merhaba-sunucu<\/code> komutunu kullanabilirsiniz.<\/p>\n<h2>Veri Y\u00f6netimi ve A\u011f Yap\u0131land\u0131rmas\u0131: Konteynerler Aras\u0131 \u0130leti\u015fim ve Kal\u0131c\u0131 Veri Saklama<\/h2>\n<p>Uygulamalar\u0131 konteynerle\u015ftirmek harika bir ba\u015flang\u0131\u00e7 olsa da, ger\u00e7ek d\u00fcnya senaryolar\u0131nda uygulamalar genellikle veritabanlar\u0131 gibi d\u0131\u015f kaynaklarla etkile\u015fime girer ve verilerin kal\u0131c\u0131 olarak saklanmas\u0131 gerekir. Ayr\u0131ca, birden fazla konteynerin (\u00f6rne\u011fin, bir web sunucusu ve bir veritaban\u0131 konteynerinin) birbiriyle konu\u015fmas\u0131 gerekir. \u0130\u015fte bu noktada Docker Volume&#8217;lar ve Docker Network&#8217;ler devreye girer. Bu kavramlar\u0131 anlamak, daha sa\u011flam, \u00f6l\u00e7eklenebilir ve g\u00fcvenilir konteynerize uygulamalar olu\u015fturmak i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<h3>Docker Volume&#8217;lar: Konteyner Verilerini G\u00fcvende Tutmak<\/h3>\n<p>Varsay\u0131lan olarak, bir Docker konteyneri i\u00e7indeki t\u00fcm veriler, konteynerin \u00f6mr\u00fcyle ili\u015fkilidir. Yani, bir konteyneri sildi\u011finizde, i\u00e7indeki t\u00fcm veriler de silinir. Bu durum, ge\u00e7ici veriler i\u00e7in uygun olsa da, bir veritaban\u0131n\u0131n veya kullan\u0131c\u0131 taraf\u0131ndan y\u00fcklenen dosyalar\u0131n kal\u0131c\u0131 olarak saklanmas\u0131 gereken durumlar i\u00e7in kabul edilemezdir. \u0130\u015fte bu sorunu \u00e7\u00f6zmek i\u00e7in Docker Volume&#8217;lar kullan\u0131l\u0131r. Volume&#8217;lar, konteynerlerin d\u0131\u015f\u0131ndaki ana bilgisayar dosya sisteminde y\u00f6netilen \u00f6zel depolama alanlar\u0131d\u0131r ve konteynerler taraf\u0131ndan kolayca eri\u015filebilirler. Volume&#8217;lar sayesinde veriler, konteynerin ya\u015fam d\u00f6ng\u00fcs\u00fcnden ba\u011f\u0131ms\u0131z olarak kal\u0131c\u0131 hale getirilebilir.<\/p>\n<p>\u0130ki ana volume t\u00fcr\u00fc vard\u0131r:<\/p>\n<ol>\n<li><strong>Bind Mount&#8217;lar (Ba\u011flama Noktalar\u0131):<\/strong> Ana bilgisayar\u0131n dosya sistemindeki belirli bir dizini do\u011frudan konteynerin i\u00e7ine ba\u011flaman\u0131za olanak tan\u0131r. Bu, geli\u015ftirme s\u0131ras\u0131nda kaynak kodunuzu konteynere ba\u011flamak i\u00e7in idealdir, b\u00f6ylece kodda yapt\u0131\u011f\u0131n\u0131z de\u011fi\u015fiklikler an\u0131nda konteyner i\u00e7inde yans\u0131t\u0131l\u0131r. \u00d6rne\u011fin, yerel projenizin kaynak kodunu konteynerin \u00e7al\u0131\u015fma dizinine ba\u011flamak i\u00e7in:\n<div class=\"code-container\">\n<pre><code>\ndocker run -p 8080:3000 -v \/yerel\/proje\/yolu:\/app benim-ilk-docker-uygulamam:1.0\n          <\/code><\/pre>\n<\/p><\/div>\n<p>        Burada <code>-v \/yerel\/proje\/yolu:\/app<\/code> ifadesi, ana bilgisayar\u0131n\u0131zdaki <code>\/yerel\/proje\/yolu<\/code> dizinini konteyner i\u00e7indeki <code>\/app<\/code> dizinine ba\u011flar.\n    <\/li>\n<li><strong>Named Volume&#8217;lar (Adland\u0131r\u0131lm\u0131\u015f Volume&#8217;lar):<\/strong> Docker taraf\u0131ndan y\u00f6netilen bir volume&#8217;dur. Docker, bu volume&#8217;lar\u0131 ana bilgisayar\u0131n dosya sisteminde belirli bir konumda (genellikle <code>\/var\/lib\/docker\/volumes\/<\/code> alt\u0131nda) olu\u015fturur ve y\u00f6netir. Named volume&#8217;lar, veritaban\u0131 verileri gibi kal\u0131c\u0131 verileri saklamak i\u00e7in tercih edilen y\u00f6ntemdir, \u00e7\u00fcnk\u00fc Docker&#8217;\u0131n kendi i\u00e7inde y\u00f6netilmesi daha kolayd\u0131r ve platformlar aras\u0131 uyumluluk sa\u011flar. Bir PostgreSQL veritaban\u0131 konteynerinde veri kal\u0131c\u0131l\u0131\u011f\u0131 sa\u011flamak i\u00e7in \u00f6rnek:\n<div class=\"code-container\">\n<pre><code>\ndocker volume create postgres_data\ndocker run -d --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -v postgres_data:\/var\/lib\/postgresql\/data postgres:13\n          <\/code><\/pre>\n<\/p><\/div>\n<p>        Burada \u00f6nce <code>postgres_data<\/code> ad\u0131nda bir volume olu\u015fturduk ve sonra bu volume&#8217;u PostgreSQL konteynerinin veri dizinine ba\u011flad\u0131k. Konteyner silinse bile <code>postgres_data<\/code> volume&#8217;u varl\u0131\u011f\u0131n\u0131 s\u00fcrd\u00fcrecek ve verileriniz g\u00fcvende kalacakt\u0131r.<\/li>\n<\/ol>\n<h3>Docker Network&#8217;ler: Konteynerlerin Birbiriyle Konu\u015fmas\u0131<\/h3>\n<p>\u00c7o\u011fu modern uygulama, birden fazla servisten olu\u015fur (\u00f6rne\u011fin, bir web uygulamas\u0131, bir veritaban\u0131 ve bir \u00f6nbellek servisi). Bu servislerin her biri kendi konteynerinde \u00e7al\u0131\u015f\u0131rken, birbiriyle ileti\u015fim kurmalar\u0131 gerekir. Docker Network&#8217;ler, bu konteynerler aras\u0131 ileti\u015fimi g\u00fcvenli ve verimli bir \u015fekilde y\u00f6netmek i\u00e7in tasarlanm\u0131\u015ft\u0131r. Docker, varsay\u0131lan olarak \u00e7e\u015fitli a\u011f s\u00fcr\u00fcc\u00fcleri (network drivers) sunar, ancak en yayg\u0131n kullan\u0131lan\u0131 <code>bridge<\/code> a\u011f\u0131d\u0131r.<\/p>\n<p>Varsay\u0131lan <code>bridge<\/code> a\u011f\u0131, ayn\u0131 ana bilgisayardaki konteynerlerin birbirleriyle IP adresleri \u00fczerinden ileti\u015fim kurmas\u0131na izin verir. Ancak, konteynerler yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda IP adresleri de\u011fi\u015febilece\u011fi i\u00e7in, konteynerleri isimleriyle bulmak daha g\u00fcvenilirdir. \u00d6zel (custom) bridge a\u011flar\u0131, bu sorunu \u00e7\u00f6zmek i\u00e7in idealdir. Kendi a\u011f\u0131n\u0131z\u0131 olu\u015fturdu\u011funuzda, bu a\u011fa ba\u011fl\u0131 konteynerler birbirlerini isimleriyle \u00e7\u00f6z\u00fcmleyebilirler (DNS resolution).<\/p>\n<p>\u00d6zel bir a\u011f olu\u015fturma ve iki konteyneri bu a\u011fa ba\u011flama \u00f6rne\u011fi:<\/p>\n<div class=\"code-container\">\n<pre><code>\n# 1. \u00d6zel bir bridge a\u011f\u0131 olu\u015fturun\ndocker network create my-app-network\n\n# 2. PostgreSQL veritaban\u0131 konteynerini bu a\u011fa ba\u011flay\u0131n\ndocker run -d --name my-postgres --network my-app-network -e POSTGRES_PASSWORD=mysecretpassword -v postgres_data:\/var\/lib\/postgresql\/data postgres:13\n\n# 3. Web uygulamas\u0131 konteynerini de ayn\u0131 a\u011fa ba\u011flay\u0131n\ndocker run -d --name my-webapp --network my-app-network -p 80:3000 benim-ilk-docker-uygulamam:1.0\n  <\/code><\/pre>\n<\/div>\n<p>Bu \u00f6rnekte, <code>my-app-network<\/code> ad\u0131nda bir a\u011f olu\u015fturduk. Hem <code>my-postgres<\/code> hem de <code>my-webapp<\/code> konteynerlerini bu a\u011fa ba\u011flad\u0131k. Art\u0131k <code>my-webapp<\/code> konteyneri, veritaban\u0131na ba\u011flanmak i\u00e7in <code>my-postgres<\/code> ad\u0131n\u0131 kullanabilir (\u00f6rne\u011fin, ba\u011flant\u0131 dizesinde <code>host=my-postgres<\/code>). Bu, IP adreslerini bilmek zorunda kalmadan servisler aras\u0131 ileti\u015fimi basitle\u015ftirir ve uygulaman\u0131z\u0131n daha mod\u00fcler olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Docker Volume&#8217;lar ve Docker Network&#8217;ler, konteynerle\u015ftirilmi\u015f uygulamalar\u0131n temelini olu\u015fturan iki kritik kavramd\u0131r. Bu ara\u00e7lar\u0131 do\u011fru bir \u015fekilde kullanarak, uygulamalar\u0131n\u0131z\u0131n verilerini g\u00fcvende tutabilir, servisler aras\u0131 ileti\u015fimi kolayla\u015ft\u0131rabilir ve daha karma\u015f\u0131k, \u00e7oklu konteynerli uygulamalar\u0131 etkili bir \u015fekilde y\u00f6netebilirsiniz. Bu, Docker&#8217;\u0131 sadece kullanmakla kalmay\u0131p, onu ger\u00e7ekten anlaman\u0131n ve g\u00fcc\u00fcnden tam olarak yararlanman\u0131n \u00f6nemli bir ad\u0131m\u0131d\u0131r.<\/p>\n<h2>\u0130leri Seviye Konular ve En \u0130yi Uygulamalar: Docker Deneyiminizi Bir \u00dcst Seviyeye Ta\u015f\u0131y\u0131n<\/h2>\n<p>Docker&#8217;\u0131n temel prensiplerini ve pratik uygulamalar\u0131n\u0131 anlad\u0131ktan sonra, \u015fimdi deneyiminizi daha da geli\u015ftirecek ileri seviye konulara ve en iyi uygulamalara odaklanal\u0131m. Daha verimli imajlar olu\u015fturmak, \u00e7oklu konteyner uygulamalar\u0131n\u0131 y\u00f6netmek ve g\u00fcvenlik \u00f6nlemleri almak, Docker&#8217;\u0131 profesyonel d\u00fczeyde kullanman\u0131n ayr\u0131lmaz par\u00e7alar\u0131d\u0131r. Bu b\u00f6l\u00fcmde ele alaca\u011f\u0131m\u0131z konular, Docker projelerinizin performans\u0131n\u0131, g\u00fcvenli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131rman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>\u00c7ok A\u015famal\u0131 Derleme (Multi-stage Builds): Daha K\u00fc\u00e7\u00fck \u0130majlar \u0130\u00e7in<\/h3>\n<p>Bir uygulaman\u0131n derlenmesi (\u00f6rne\u011fin, bir Java uygulamas\u0131 i\u00e7in Maven veya bir Node.js uygulamas\u0131 i\u00e7in npm install) genellikle \u00e7ok say\u0131da geli\u015ftirme ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 ve ge\u00e7ici dosya gerektirir. Bu ba\u011f\u0131ml\u0131l\u0131klar ve dosyalar, nihai \u00fcretim imaj\u0131nda yer kaplayarak imaj boyutunu gereksiz yere art\u0131r\u0131r. Daha b\u00fcy\u00fck imajlar, daha uzun indirme s\u00fcreleri, daha fazla depolama alan\u0131 ve potansiyel g\u00fcvenlik riskleri anlam\u0131na gelir. \u00c7ok a\u015famal\u0131 derlemeler, bu sorunu zarif bir \u015fekilde \u00e7\u00f6zer.<\/p>\n<p>\u00c7ok a\u015famal\u0131 derleme, bir Dockerfile i\u00e7inde birden fazla <code>FROM<\/code> ifadesi kullan\u0131lmas\u0131na olanak tan\u0131r. Her <code>FROM<\/code> ifadesi yeni bir derleme a\u015famas\u0131n\u0131 ba\u015flat\u0131r. Bu a\u015famalardan birinde uygulaman\u0131z\u0131 derleyebilir, di\u011fer bir a\u015famada ise sadece nihai \u00e7al\u0131\u015ft\u0131r\u0131labilir dosyalar\u0131 veya ba\u011f\u0131ml\u0131l\u0131klar\u0131 kopyalayarak \u00e7ok daha k\u00fc\u00e7\u00fck bir \u00fcretim imaj\u0131 olu\u015fturabilirsiniz. \u00d6rne\u011fin, bir React uygulamas\u0131n\u0131n \u00e7ok a\u015famal\u0131 Dockerfile&#8217;\u0131 \u015f\u00f6yle g\u00f6r\u00fcnebilir:<\/p>\n<div class=\"code-container\">\n<pre><code>\n# A\u015fama 1: Uygulamay\u0131 derle\nFROM node:16-alpine as build-stage\nWORKDIR \/app\nCOPY package*.json .\/\nRUN npm install\nCOPY . .\nRUN npm run build\n\n# A\u015fama 2: Sadece derlenmi\u015f \u00e7\u0131kt\u0131y\u0131 i\u00e7eren nihai \u00fcretim imaj\u0131\nFROM nginx:alpine as production-stage\nCOPY --from=build-stage \/app\/build \/usr\/share\/nginx\/html\nEXPOSE 80\nCMD [\"nginx\", \"-g\", \"daemon off;\"]\n  <\/code><\/pre>\n<\/div>\n<p>Bu \u00f6rnekte, ilk a\u015fama (<code>build-stage<\/code>) Node.js ortam\u0131n\u0131 kullanarak React uygulamas\u0131n\u0131 derler. \u0130kinci a\u015fama (<code>production-stage<\/code>) ise \u00e7ok daha k\u00fc\u00e7\u00fck olan Nginx imaj\u0131n\u0131 temel al\u0131r ve sadece ilk a\u015famada olu\u015fturulan statik \u00e7\u0131kt\u0131 dosyalar\u0131n\u0131 (<code>\/app\/build<\/code> dizininden) Nginx&#8217;in sunum dizinine kopyalar. Bu sayede, nihai imaj\u0131n\u0131zda gereksiz derleme ara\u00e7lar\u0131 veya geli\u015ftirme ba\u011f\u0131ml\u0131l\u0131klar\u0131 bulunmaz, bu da imaj boyutunu \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.<\/p>\n<h3>Docker Compose: \u00c7oklu Konteyner Uygulamalar\u0131n\u0131 Y\u00f6netmek<\/h3>\n<p>Ger\u00e7ek d\u00fcnya uygulamalar\u0131 nadiren tek bir konteynerden olu\u015fur. Genellikle bir web uygulamas\u0131, bir veritaban\u0131, bir \u00f6nbellek ve belki de bir mesaj kuyru\u011fu gibi birden fazla servisi i\u00e7erirler. Bu servislerin her birini ayr\u0131 ayr\u0131 <code>docker run<\/code> komutlar\u0131yla y\u00f6netmek h\u0131zla karma\u015f\u0131k hale gelir. \u0130\u015fte bu noktada Docker Compose devreye girer. Docker Compose, \u00e7oklu konteyner Docker uygulamalar\u0131n\u0131 tan\u0131mlamak ve \u00e7al\u0131\u015ft\u0131rmak i\u00e7in bir ara\u00e7t\u0131r. Tek bir YAML dosyas\u0131 (genellikle <code>docker-compose.yml<\/code>) kullanarak t\u00fcm uygulama servislerinizi, a\u011flar\u0131n\u0131 ve volume&#8217;lar\u0131n\u0131 yap\u0131land\u0131rabilirsiniz. Bu, t\u00fcm uygulama y\u0131\u011f\u0131n\u0131n\u0131z\u0131 tek bir komutla (<code>docker compose up<\/code>) ba\u015flatman\u0131z\u0131, durdurman\u0131z\u0131 ve y\u00f6netmenizi sa\u011flar.<\/p>\n<p>\u00d6rne\u011fin, Node.js web uygulamas\u0131 ve PostgreSQL veritaban\u0131ndan olu\u015fan bir uygulama i\u00e7in <code>docker-compose.yml<\/code> dosyas\u0131 \u015f\u00f6yle olabilir:<\/p>\n<div class=\"code-container\">\n<pre><code>\nversion: '3.8'\nservices:\n  web:\n    build: .\n    ports:\n      - \"80:3000\"\n    environment:\n      DATABASE_URL: postgres:\/\/user:password@db:5432\/mydatabase\n    depends_on:\n      - db\n    networks:\n      - app-network\n\n  db:\n    image: postgres:13\n    environment:\n      POSTGRES_DB: mydatabase\n      POSTGRES_USER: user\n      POSTGRES_PASSWORD: password\n    volumes:\n      - postgres_data:\/var\/lib\/postgresql\/data\n    networks:\n      - app-network\n\nvolumes:\n  postgres_data:\n\nnetworks:\n  app-network:\n  <\/code><\/pre>\n<\/div>\n<p>Bu dosya, iki servis (<code>web<\/code> ve <code>db<\/code>), bir volume (<code>postgres_data<\/code>) ve bir a\u011f (<code>app-network<\/code>) tan\u0131mlar. <code>web<\/code> servisi, mevcut dizindeki Dockerfile&#8217;dan derlenir ve <code>db<\/code> servisine ba\u011f\u0131ml\u0131d\u0131r. <code>db<\/code> servisi ise bir PostgreSQL imaj\u0131n\u0131 kullan\u0131r. Bu yap\u0131land\u0131rma ile, sadece <code>docker compose up -d<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak t\u00fcm uygulaman\u0131z\u0131 arka planda ba\u015flatabilirsiniz. Docker Compose, \u00f6zellikle geli\u015ftirme ortamlar\u0131nda \u00e7oklu servisleri y\u00f6netmek i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r.<\/p>\n<p>Bu ileri seviye konular ve en iyi uygulamalar, Docker bilginizi derinle\u015ftirmenize ve daha verimli, g\u00fcvenli ve y\u00f6netilebilir konteynerize uygulamalar geli\u015ftirmenize olanak tan\u0131r. Docker&#8217;\u0131 sadece temel komutlarla kullanmaktan \u00f6teye ge\u00e7erek, onun ger\u00e7ek potansiyelini ke\u015ffetmek, modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde size \u00f6nemli avantajlar sa\u011flayacakt\u0131r.<\/p>\n<h2>Sonu\u00e7: Docker&#8217;\u0131 Anlamak: Art\u0131k Sadece Kullan\u0131c\u0131 De\u011fil, Bilin\u00e7li Bir Geli\u015ftirici Olmak<\/h2>\n<p>Bu makale boyunca, Docker&#8217;\u0131 &#8220;anlamadan \u00f6nce kullanmak&#8221; gibi yayg\u0131n bir senaryodan ba\u015flayarak, konteynerle\u015ftirme d\u00fcnyas\u0131n\u0131n derinliklerine indik. Docker&#8217;\u0131n ne oldu\u011fundan, sanal makinelerle farklar\u0131na, Dockerfile&#8217;\u0131n g\u00fcc\u00fcnden imajlar\u0131n ve konteynerlerin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131na kadar bir\u00e7ok temel kavram\u0131 ele ald\u0131k. Kendi web uygulaman\u0131z\u0131 Dockerize ederek pratik deneyim kazand\u0131n\u0131z ve veri y\u00f6netimi ile a\u011f yap\u0131land\u0131rmas\u0131n\u0131n \u00f6nemini kavrad\u0131n\u0131z. Son olarak, \u00e7ok a\u015famal\u0131 derlemeler ve Docker Compose gibi ileri seviye konularla Docker bilginizi bir \u00fcst seviyeye ta\u015f\u0131d\u0131k.<\/p>\n<p>Art\u0131k sadece <code>docker run<\/code> veya <code>docker build<\/code> gibi komutlar\u0131 ezbere kullanan bir geli\u015ftirici de\u011fil, bu komutlar\u0131n arkas\u0131ndaki mimariyi, felsefeyi ve en iyi uygulamalar\u0131 bilen bilin\u00e7li bir Docker kullan\u0131c\u0131s\u0131s\u0131n\u0131z. Bu bilgi birikimi, kar\u015f\u0131la\u015ft\u0131\u011f\u0131n\u0131z sorunlar\u0131 daha etkin bir \u015fekilde \u00e7\u00f6zmenizi, daha optimize edilmi\u015f ve g\u00fcvenli imajlar olu\u015fturman\u0131z\u0131 ve \u00e7oklu servis uygulamalar\u0131n\u0131 daha verimli bir \u015fekilde y\u00f6netmenizi sa\u011flayacakt\u0131r. Docker, modern yaz\u0131l\u0131m geli\u015ftirme ve DevOps s\u00fcre\u00e7lerinin temel ta\u015flar\u0131ndan biridir ve onu derinlemesine anlamak, kariyerinizde size \u00f6nemli bir avantaj sa\u011flayacakt\u0131r. Unutmay\u0131n, \u00f6\u011frenme s\u00fcrekli bir yolculuktur ve Docker d\u00fcnyas\u0131 da s\u00fcrekli geli\u015fmektedir. Bu makaleden edindi\u011finiz bilgilerle, kendinizi daha da geli\u015ftirmeye devam etmeniz i\u00e7in sa\u011flam bir temele sahipsiniz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<ol>\n<li><strong>Docker neden bu kadar pop\u00fcler oldu?<\/strong>\n<p>Docker, uygulamalar\u0131n farkl\u0131 ortamlarda (geli\u015ftirme, test, \u00fcretim) tutarl\u0131 bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayarak &#8220;benim makinemde \u00e7al\u0131\u015f\u0131yor&#8221; sorununu \u00e7\u00f6zer. Uygulama ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 izole edilmi\u015f konteynerlerde paketleyerek da\u011f\u0131t\u0131m ve \u00f6l\u00e7eklendirme s\u00fcre\u00e7lerini basitle\u015ftirir, bu da geli\u015ftirme ve operasyon ekipleri i\u00e7in b\u00fcy\u00fck kolayl\u0131k sa\u011flar.<\/p>\n<\/li>\n<li><strong>Docker imaj\u0131 ile Docker konteyneri aras\u0131ndaki fark nedir?<\/strong>\n<p>Docker imaj\u0131, bir uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gereken her \u015feyi (kod, \u00e7al\u0131\u015fma zaman\u0131, k\u00fct\u00fcphaneler vb.) i\u00e7eren statik, okunabilir bir \u015fablondur. Docker konteyneri ise bu imajdan olu\u015fturulmu\u015f, canl\u0131, \u00e7al\u0131\u015fan bir \u00f6rnektir. \u0130maj, bir kal\u0131p gibiyken, konteyner bu kal\u0131ptan \u00fcretilmi\u015f \u00fcr\u00fcnd\u00fcr.<\/p>\n<\/li>\n<li><strong>Dockerfile&#8217;daki <code>EXPOSE<\/code> ve <code>-p<\/code> parametresi ne i\u015fe yarar?<\/strong>\n<p><code>EXPOSE<\/code>, Dockerfile i\u00e7inde uygulaman\u0131n hangi portlar\u0131 dinledi\u011fini bildirmek i\u00e7in kullan\u0131lan bir talimatt\u0131r. Bu, sadece bir dok\u00fcmantasyon ve bilgilendirme ama\u00e7l\u0131d\u0131r, ger\u00e7ek bir port e\u015flemesi yapmaz. Ger\u00e7ek port e\u015flemesi, yani ana bilgisayar\u0131n bir portunu konteynerin bir portuna ba\u011flamak i\u00e7in <code>docker run<\/code> komutundaki <code>-p<\/code> (veya <code>--publish<\/code>) parametresi kullan\u0131l\u0131r (\u00f6rne\u011fin, <code>-p 80:3000<\/code>).<\/p>\n<\/li>\n<li><strong>Docker Volume&#8217;lar neden \u00f6nemlidir?<\/strong>\n<p>Docker konteynerleri varsay\u0131lan olarak ge\u00e7icidir; silindiklerinde i\u00e7lerindeki t\u00fcm veriler de kaybolur. Volume&#8217;lar, verilerin konteynerin ya\u015fam d\u00f6ng\u00fcs\u00fcnden ba\u011f\u0131ms\u0131z olarak kal\u0131c\u0131 olarak saklanmas\u0131n\u0131 sa\u011flar. Bu, veritabanlar\u0131, log dosyalar\u0131 veya kullan\u0131c\u0131 taraf\u0131ndan y\u00fcklenen i\u00e7erikler gibi \u00f6nemli verilerin g\u00fcvenli\u011fini ve s\u00fcreklili\u011fini garanti eder.<\/p>\n<\/li>\n<li><strong>Docker Compose&#8217;u ne zaman kullanmal\u0131y\u0131m?<\/strong>\n<p>Uygulaman\u0131z birden fazla servisten (\u00f6rne\u011fin, bir web uygulamas\u0131, bir veritaban\u0131 ve bir \u00f6nbellek) olu\u015ftu\u011funda Docker Compose kullanmal\u0131s\u0131n\u0131z. Tek bir <code>docker-compose.yml<\/code> dosyas\u0131 ile t\u00fcm bu servisleri, a\u011flar\u0131n\u0131 ve volume&#8217;lar\u0131n\u0131 tan\u0131mlayabilir ve tek bir komutla (<code>docker compose up<\/code>) t\u00fcm uygulama y\u0131\u011f\u0131n\u0131n\u0131z\u0131 kolayca ba\u015flat\u0131p y\u00f6netebilirsiniz. \u00d6zellikle yerel geli\u015ftirme ortamlar\u0131nda \u00e7oklu servisleri y\u00f6netmek i\u00e7in vazge\u00e7ilmezdir.<\/p>\n<\/li>\n<\/ol>\n<p>#Docker #Konteyner #WebGeli\u015ftirme #DevOps #Teknoloji<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/docker-simple-flask-app-containerization\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/docker-simple-flask-app-containerization<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"Bir\u00e7o\u011fumuzun teknoloji yolculu\u011funda benzer bir hikayesi vard\u0131r: yeni bir araca veya teknolojiye rastlar\u0131z, temel komutlar\u0131n\u0131 \u00f6\u011freniriz ve sihirli bir \u015fekilde \u00e7al\u0131\u015fmaya ba\u015flad\u0131\u011f\u0131n\u0131 g\u00f6r\u00fcr\u00fcz.","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1407],"tags":[],"class_list":{"0":"post-44574","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-docker","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Docker&#039;\u0131 Anlamadan \u00d6nce Kullanmak: Bir Geli\u015ftiricinin \u0130tiraflar\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Docker&#039;\u0131 Anlamadan \u00d6nce Kullanmak: Bir Geli\u015ftiricinin \u0130tiraflar\u0131\" \/>\n<meta property=\"og:description\" content=\"Bir\u00e7o\u011fumuzun teknoloji yolculu\u011funda benzer bir hikayesi vard\u0131r: yeni bir araca veya teknolojiye rastlar\u0131z, temel komutlar\u0131n\u0131 \u00f6\u011freniriz ve sihirli bir \u015fekilde \u00e7al\u0131\u015fmaya ba\u015flad\u0131\u011f\u0131n\u0131 g\u00f6r\u00fcr\u00fcz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-07T18:04:24+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-07T18:04:53+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"23 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Docker&#8217;\u0131 Anlamadan \u00d6nce Kullanmak: Bir Geli\u015ftiricinin \u0130tiraflar\u0131\",\"datePublished\":\"2026-09-07T18:04:24+00:00\",\"dateModified\":\"2026-09-07T18:04:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/\"},\"wordCount\":4018,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Docker\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/\",\"name\":\"Docker'\u0131 Anlamadan \u00d6nce Kullanmak: Bir Geli\u015ftiricinin \u0130tiraflar\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-09-07T18:04:24+00:00\",\"dateModified\":\"2026-09-07T18:04:53+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Docker&#8217;\u0131 Anlamadan \u00d6nce Kullanmak: Bir Geli\u015ftiricinin \u0130tiraflar\u0131\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Docker'\u0131 Anlamadan \u00d6nce Kullanmak: Bir Geli\u015ftiricinin \u0130tiraflar\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/","og_locale":"tr_TR","og_type":"article","og_title":"Docker'\u0131 Anlamadan \u00d6nce Kullanmak: Bir Geli\u015ftiricinin \u0130tiraflar\u0131","og_description":"Bir\u00e7o\u011fumuzun teknoloji yolculu\u011funda benzer bir hikayesi vard\u0131r: yeni bir araca veya teknolojiye rastlar\u0131z, temel komutlar\u0131n\u0131 \u00f6\u011freniriz ve sihirli bir \u015fekilde \u00e7al\u0131\u015fmaya ba\u015flad\u0131\u011f\u0131n\u0131 g\u00f6r\u00fcr\u00fcz.","og_url":"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-09-07T18:04:24+00:00","article_modified_time":"2026-09-07T18:04:53+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"23 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Docker&#8217;\u0131 Anlamadan \u00d6nce Kullanmak: Bir Geli\u015ftiricinin \u0130tiraflar\u0131","datePublished":"2026-09-07T18:04:24+00:00","dateModified":"2026-09-07T18:04:53+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/"},"wordCount":4018,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Docker"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/","url":"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/","name":"Docker'\u0131 Anlamadan \u00d6nce Kullanmak: Bir Geli\u015ftiricinin \u0130tiraflar\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-09-07T18:04:24+00:00","dateModified":"2026-09-07T18:04:53+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/dockeri-anlamadan-once-kullanmak-bir-gelistiricinin-itiraflari\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Docker&#8217;\u0131 Anlamadan \u00d6nce Kullanmak: Bir Geli\u015ftiricinin \u0130tiraflar\u0131"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/44574","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=44574"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/44574\/revisions"}],"predecessor-version":[{"id":44575,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/44574\/revisions\/44575"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=44574"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=44574"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=44574"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}