{"id":33149,"date":"2025-10-30T08:21:36","date_gmt":"2025-10-30T05:21:36","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/"},"modified":"2025-10-30T08:21:36","modified_gmt":"2025-10-30T05:21:36","slug":"giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/","title":{"rendered":"Giri\u015f: Node.js Uygulamalar\u0131 Neden Docker ile Konteynerle\u015ftirilmeli?"},"content":{"rendered":"<p><title>Node.js Uygulamalar\u0131n\u0131 Docker ile Kolayca Konteynerle\u015ftirme Rehberi<\/title><br \/>\n<body><\/p>\n<p>Node.js uygulamalar\u0131n\u0131z\u0131 Docker ile nas\u0131l konteynerle\u015ftirece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Geli\u015ftirme, test ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi standartla\u015ft\u0131r\u0131n, verimlili\u011fi art\u0131r\u0131n. Bu rehber, Node.js ve Docker entegrasyonuna hakim olman\u0131z\u0131 sa\u011flayacak.<\/p>\n<h2>Giri\u015f: Node.js Uygulamalar\u0131 Neden Docker ile Konteynerle\u015ftirilmeli?<\/h2>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, &#8220;Benim bilgisayar\u0131mda \u00e7al\u0131\u015f\u0131yor ama sunucuda neden \u00e7al\u0131\u015fm\u0131yor?&#8221; c\u00fcmlesi ne yaz\u0131k ki s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan bir sorundur. Bu durum, genellikle farkl\u0131 geli\u015ftirme ortamlar\u0131, ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131 veya i\u015fletim sistemi farkl\u0131l\u0131klar\u0131ndan kaynaklan\u0131r. Node.js uygulamalar\u0131 da bu t\u00fcr sorunlara kar\u015f\u0131 ba\u011f\u0131\u015f\u0131k de\u011fildir. Bir geli\u015ftiricinin makinesinde sorunsuz \u00e7al\u0131\u015fan bir Node.js projesi, test veya \u00fcretim ortam\u0131na ta\u015f\u0131nd\u0131\u011f\u0131nda beklenmedik hatalar verebilir. \u0130\u015fte tam bu noktada, yaz\u0131l\u0131m d\u00fcnyas\u0131n\u0131n kurtar\u0131c\u0131lar\u0131ndan biri olan Docker devreye giriyor.<\/p>\n<p>Docker, uygulamalar\u0131n\u0131z\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 izole edilmi\u015f, ta\u015f\u0131nabilir birimler olan &#8220;konteynerler&#8221; i\u00e7inde paketlemenize olanak tan\u0131r. B\u00f6ylece, uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 ortam\u0131 standartla\u015ft\u0131r\u0131r ve &#8220;benim bilgisayar\u0131mda \u00e7al\u0131\u015f\u0131yor&#8221; sendromuna kesin bir \u00e7\u00f6z\u00fcm getirir. Node.js geli\u015ftiricileri i\u00e7in bu, paha bi\u00e7ilmez bir avantajd\u0131r. \u00c7\u00fcnk\u00fc Node.js projeleri, genellikle \u00e7ok say\u0131da npm paketi ba\u011f\u0131ml\u0131l\u0131\u011f\u0131na sahiptir ve bu ba\u011f\u0131ml\u0131l\u0131klar\u0131n farkl\u0131 sistemlerde tutarl\u0131 bir \u015fekilde y\u00f6netilmesi zor olabilir. Docker, Node.js uygulaman\u0131z\u0131n t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 ve \u00e7al\u0131\u015fma zaman\u0131n\u0131 tek bir pakette toplayarak, her yerde ayn\u0131 \u015fekilde davranmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Peki, Node.js uygulamalar\u0131n\u0131z\u0131 Docker ile konteynerle\u015ftirmenin somut faydalar\u0131 nelerdir? \u00d6ncelikle, <strong>ortam tutarl\u0131l\u0131\u011f\u0131<\/strong> sa\u011flar. Geli\u015ftirme ekibinizin her \u00fcyesi, ayn\u0131 Docker imaj\u0131n\u0131 kullanarak ayn\u0131 ortamda \u00e7al\u0131\u015f\u0131r. Bu, hatalar\u0131n erken a\u015famada tespit edilmesini ve \u00e7\u00f6z\u00fclmesini kolayla\u015ft\u0131r\u0131r. \u0130kincisi, <strong>h\u0131zl\u0131 ve g\u00fcvenilir da\u011f\u0131t\u0131m<\/strong> imkan\u0131 sunar. Konteynerler, herhangi bir Docker uyumlu sunucuda an\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131labilir, bu da da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini h\u0131zland\u0131r\u0131r ve hatalar\u0131 azalt\u0131r. \u00dc\u00e7\u00fcnc\u00fcs\u00fc, <strong>kaynak izolasyonu ve verimlilik<\/strong> art\u0131\u015f\u0131 sa\u011flar. Her konteyner kendi ba\u011f\u0131ms\u0131z kaynaklar\u0131na sahip oldu\u011fundan, bir uygulaman\u0131n \u00e7\u00f6kmesi di\u011ferlerini etkilemez ve sunucu kaynaklar\u0131 daha verimli kullan\u0131l\u0131r. Son olarak, <strong>\u00f6l\u00e7eklenebilirlik<\/strong> a\u00e7\u0131s\u0131ndan b\u00fcy\u00fck kolayl\u0131klar sunar. Artan talebi kar\u015f\u0131lamak i\u00e7in Node.js uygulaman\u0131z\u0131n birden fazla kopyas\u0131n\u0131 h\u0131zla \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/p>\n<p>Bu makalede, Node.js uygulamalar\u0131n\u0131z\u0131 Docker ile nas\u0131l konteynerle\u015ftirece\u011finizi ad\u0131m ad\u0131m \u00f6\u011freneceksiniz. Basit bir Node.js uygulamas\u0131n\u0131 Dockerize etmekten, \u00e7oklu servisleri Docker Compose ile y\u00f6netmeye ve hatta ileri d\u00fczey optimizasyon tekniklerine kadar geni\u015f bir yelpazede bilgi edineceksiniz. Amac\u0131m\u0131z, sizi bu g\u00fc\u00e7l\u00fc teknolojileri kendi projelerinizde ba\u015far\u0131yla kullanabilecek bilgi ve beceriyle donatmakt\u0131r. Haz\u0131rsan\u0131z, bu heyecan verici yolculu\u011fa ba\u015flayal\u0131m!<\/p>\n<h2>Temel Kavramlar: Docker ve Node.js Entegrasyonu \u0130\u00e7in Bilmeniz Gerekenler Nelerdir?<\/h2>\n<p>Node.js uygulamalar\u0131n\u0131z\u0131 Docker ile etkili bir \u015fekilde y\u00f6netebilmek i\u00e7in, \u00f6ncelikle her iki teknolojinin temel ta\u015flar\u0131n\u0131 iyi anlamak \u00f6nemlidir. Bu b\u00f6l\u00fcmde, Docker&#8217;\u0131n ne oldu\u011funu, Node.js&#8217;in rol\u00fcn\u00fc ve bu ikilinin neden bu kadar g\u00fc\u00e7l\u00fc bir kombinasyon olu\u015fturdu\u011funu detayl\u0131ca inceleyece\u011fiz. Ayr\u0131ca, ba\u015flamak i\u00e7in gerekli \u00f6nko\u015fullara da de\u011finece\u011fiz.<\/p>\n<p>\u00d6ncelikle, <strong>Docker nedir?<\/strong> Docker, yaz\u0131l\u0131mlar\u0131 &#8220;konteyner&#8221; ad\u0131 verilen standartla\u015ft\u0131r\u0131lm\u0131\u015f birimler i\u00e7inde paketlemeyi, da\u011f\u0131tmay\u0131 ve \u00e7al\u0131\u015ft\u0131rmay\u0131 kolayla\u015ft\u0131ran a\u00e7\u0131k kaynakl\u0131 bir platformdur. Bir konteyner, uygulaman\u0131z\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gereken her \u015feyi (kod, \u00e7al\u0131\u015fma zaman\u0131, sistem ara\u00e7lar\u0131, k\u00fct\u00fcphaneler ve ayarlar) i\u00e7eren hafif, ta\u015f\u0131nabilir ve kendi kendine yeten bir pakettir. Sanal makinelerden farkl\u0131 olarak, konteynerler i\u015fletim sisteminin \u00e7ekirde\u011fini payla\u015f\u0131r, bu da onlar\u0131 daha hafif ve daha h\u0131zl\u0131 ba\u015flat\u0131labilir hale getirir. Docker ekosistemi birka\u00e7 ana bile\u015fenden olu\u015fur:<\/p>\n<ul>\n<li><strong>Docker \u0130maj\u0131 (Image):<\/strong> Bir konteyneri olu\u015fturmak i\u00e7in kullan\u0131lan \u015fablon veya blueprint&#8217;tir. Uygulaman\u0131z\u0131n ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n anl\u0131k g\u00f6r\u00fcnt\u00fcs\u00fcd\u00fcr.<\/li>\n<li><strong>Docker Konteyneri (Container):<\/strong> Docker imaj\u0131n\u0131n \u00e7al\u0131\u015ft\u0131r\u0131labilir bir \u00f6rne\u011fidir. \u0130zolasyonlu bir ortamda \u00e7al\u0131\u015fan canl\u0131 bir uygulamad\u0131r.<\/li>\n<li><strong>Docker Engine:<\/strong> Konteynerleri olu\u015fturan ve \u00e7al\u0131\u015ft\u0131ran temel teknolojidir.<\/li>\n<li><strong>Docker Hub:<\/strong> Docker imajlar\u0131n\u0131 depolamak ve payla\u015fmak i\u00e7in kullan\u0131lan bulut tabanl\u0131 bir kay\u0131t defteridir (repository).<\/li>\n<\/ul>\n<p>Di\u011fer yandan, <strong>Node.js nedir?<\/strong> Node.js, Google Chrome&#8217;un V8 JavaScript motoru \u00fczerine kurulu, sunucu taraf\u0131 ve a\u011f uygulamalar\u0131 geli\u015ftirmek i\u00e7in kullan\u0131lan a\u00e7\u0131k kaynakl\u0131, \u00e7apraz platformlu bir \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131d\u0131r. Asenkron, olay g\u00fcd\u00fcml\u00fc mimarisi sayesinde y\u00fcksek performansl\u0131 ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirmek i\u00e7in idealdir. Node.js ekosisteminin kalbinde, paket y\u00f6neticisi olan npm (Node Package Manager) bulunur. npm, binlerce a\u00e7\u0131k kaynakl\u0131 k\u00fct\u00fcphane ve arac\u0131 bar\u0131nd\u0131rarak geli\u015ftirme s\u00fcrecini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r.<\/p>\n<p>Peki, <strong>Node.js ve Docker neden birlikte kullan\u0131l\u0131rlar?<\/strong> Bu ikili, modern web geli\u015ftirme pratiklerinde adeta bir r\u00fcya tak\u0131m\u0131 olu\u015fturur. Node.js&#8217;in esnekli\u011fi ve h\u0131z\u0131, Docker&#8217;\u0131n sundu\u011fu tutarl\u0131l\u0131k ve ta\u015f\u0131nabilirlik ile birle\u015fti\u011finde, geli\u015ftiricilere e\u015fsiz avantajlar sunar. \u00d6rne\u011fin, bir Node.js projesi i\u00e7in belirli bir Node.js s\u00fcr\u00fcm\u00fcne ve npm paketlerine ihtiyac\u0131n\u0131z olabilir. Docker, bu gereksinimleri bir konteyner i\u00e7inde kilitleyerek, farkl\u0131 geli\u015ftiricilerin veya da\u011f\u0131t\u0131m ortamlar\u0131n\u0131n ayn\u0131 ba\u011f\u0131ml\u0131l\u0131k setini kullanmas\u0131n\u0131 sa\u011flar. Bu sayede, &#8220;versiyon uyu\u015fmazl\u0131\u011f\u0131&#8221; gibi sorunlar ortadan kalkar.<\/p>\n<p>Sonu\u00e7 olarak, Node.js ve Docker entegrasyonu, geli\u015ftirme ortam\u0131 tutarl\u0131l\u0131\u011f\u0131, ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimi kolayl\u0131\u011f\u0131 ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinin basitle\u015ftirilmesi gibi kritik faydalar sunar. Uygulaman\u0131z\u0131n her zaman, her yerde bekledi\u011finiz gibi \u00e7al\u0131\u015fmas\u0131n\u0131 garanti eder. Bu g\u00fc\u00e7l\u00fc sinerji sayesinde, geli\u015ftiriciler altyap\u0131 sorunlar\u0131yla u\u011fra\u015fmak yerine, do\u011frudan kod yazmaya ve yenilik\u00e7i \u00e7\u00f6z\u00fcmler \u00fcretmeye odaklanabilirler.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: Docker kullan\u0131rken, imaj boyutunu minimumda tutmak performans\u0131 ve da\u011f\u0131t\u0131m h\u0131z\u0131n\u0131 art\u0131r\u0131r. Gereksiz ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve dosyalar\u0131 imaja eklemekten ka\u00e7\u0131n\u0131n. Multi-stage build (\u00e7ok a\u015famal\u0131 derleme) teknikleri bu konuda size b\u00fcy\u00fck avantaj sa\u011flayacakt\u0131r.\n    <\/div>\n<p>Ba\u015flamak i\u00e7in birka\u00e7 \u00f6nko\u015ful bulunmaktad\u0131r:<\/p>\n<ul>\n<li><strong>Docker Kurulumu:<\/strong> Bilgisayar\u0131n\u0131zda Docker Desktop (Windows\/macOS i\u00e7in) veya Docker Engine (Linux i\u00e7in) kurulu olmal\u0131d\u0131r. Kurulum talimatlar\u0131 i\u00e7in Docker&#8217;\u0131n resmi web sitesini ziyaret edebilirsiniz.<\/li>\n<li><strong>Node.js Bilgisi:<\/strong> Temel d\u00fczeyde Node.js ve npm komutlar\u0131na a\u015fina olman\u0131z gerekmektedir.<\/li>\n<li><strong>Metin D\u00fczenleyici:<\/strong> Tercih etti\u011finiz bir kod d\u00fczenleyici (VS Code gibi) i\u015finizi kolayla\u015ft\u0131racakt\u0131r.<\/li>\n<\/ul>\n<p>Bu temel bilgilere sahip oldu\u011funuzda, Node.js uygulaman\u0131z\u0131 Docker ile konteynerle\u015ftirmeye haz\u0131rs\u0131n\u0131z demektir. Bir sonraki b\u00f6l\u00fcmde, basit bir Node.js uygulamas\u0131 olu\u015fturacak ve bu uygulamay\u0131 Dockerize etmek i\u00e7in ilk Dockerfile&#8217;\u0131m\u0131z\u0131 yazaca\u011f\u0131z.<\/p>\n<h2>Ad\u0131m Ad\u0131m Bir Node.js Uygulamas\u0131 Olu\u015fturma ve Dockerfile Yazma<\/h2>\n<p>\u015eimdi pratik yapma zaman\u0131! Bu b\u00f6l\u00fcmde, Docker ile entegre edece\u011fimiz basit bir Node.js uygulamas\u0131 olu\u015fturacak ve ard\u0131ndan bu uygulamay\u0131 bir Docker imaj\u0131na d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in gerekli olan Dockerfile&#8217;\u0131 ad\u0131m ad\u0131m yazaca\u011f\u0131z. Bu s\u00fcre\u00e7, konteynerle\u015ftirmenin temel mant\u0131\u011f\u0131n\u0131 anlaman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>Node.js Uygulamas\u0131 Nas\u0131l Haz\u0131rlan\u0131r?<\/h3>\n<p>\u00d6ncelikle, konteynerle\u015ftirece\u011fimiz basit bir Node.js uygulamas\u0131na ihtiyac\u0131m\u0131z var. Bir web sunucusu g\u00f6revi g\u00f6recek ve basit bir mesaj d\u00f6nd\u00fcrecek bir Express.js uygulamas\u0131 olu\u015ftural\u0131m. Bunun i\u00e7in, projeniz i\u00e7in yeni bir dizin olu\u015fturun ve i\u00e7ine girin:<\/p>\n<pre><code>\nmkdir my-docker-node-app\ncd my-docker-node-app\n    <\/code><\/pre>\n<p>Ard\u0131ndan, npm kullanarak yeni bir Node.js projesi ba\u015flat\u0131n ve Express.js ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 ekleyin:<\/p>\n<pre><code>\nnpm init -y\nnpm install express\n    <\/code><\/pre>\n<p>Bu komutlar, projenizin temel yap\u0131land\u0131rmas\u0131n\u0131 ve Express.js k\u00fct\u00fcphanesini <code class=\"language-\">node_modules<\/code> dizinine kuracakt\u0131r. \u015eimdi, uygulaman\u0131z\u0131n ana dosyas\u0131 olacak <code class=\"language-\">index.js<\/code> dosyas\u0131n\u0131 olu\u015fturun ve a\u015fa\u011f\u0131daki i\u00e7eri\u011fi ekleyin:<\/p>\n<pre><code>\nconst express = require('express');\nconst app = express();\nconst port = 3000; \/\/ Uygulaman\u0131n \u00e7al\u0131\u015faca\u011f\u0131 port\n\napp.get('\/', (req, res) => {\n  res.send('Merhaba Docker! Node.js uygulamam konteynerde \u00e7al\u0131\u015f\u0131yor!');\n});\n\napp.listen(port, () => {\n  console.log(<code class=\"language-\">Uygulama http:\/\/localhost:${port} adresinde \u00e7al\u0131\u015f\u0131yor.<\/code>);\n});\n    <\/code><\/pre>\n<p>Bu kod, gelen isteklere &#8220;Merhaba Docker!&#8221; mesaj\u0131yla yan\u0131t veren basit bir web sunucusu olu\u015fturur. Uygulaman\u0131z\u0131 yerel olarak \u00e7al\u0131\u015ft\u0131rmak i\u00e7in terminalinizde \u015fu komutu kullanabilirsiniz:<\/p>\n<pre><code>\nnode index.js\n    <\/code><\/pre>\n<p>Taray\u0131c\u0131n\u0131zda <code class=\"language-\">http:\/\/localhost:3000<\/code> adresine giderek uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulayabilirsiniz. Harika, art\u0131k Dockerize etmeye haz\u0131r bir Node.js uygulamam\u0131z var!<\/p>\n<h3>Dockerfile Nedir ve Nas\u0131l Yaz\u0131l\u0131r?<\/h3>\n<p>Dockerfile, Docker&#8217;\u0131n bir imaj olu\u015fturmak i\u00e7in ad\u0131m ad\u0131m talimatlar\u0131 okudu\u011fu metin tabanl\u0131 bir dosyad\u0131r. Her talimat, imajda yeni bir katman olu\u015fturur ve bu katmanlar, imaj\u0131n nihai halini olu\u015fturur. Proje dizininizin k\u00f6k\u00fcnde, <code class=\"language-\">Dockerfile<\/code> ad\u0131nda (uzant\u0131s\u0131z) bir dosya olu\u015fturun ve a\u015fa\u011f\u0131daki i\u00e7eri\u011fi ekleyin:<\/p>\n<pre><code>\n# 1. Temel \u0130maj\u0131 Belirle: Node.js \u00e7al\u0131\u015fma zaman\u0131n\u0131 i\u00e7eren bir temel imaj kullan\u0131yoruz.\n# Alpine Linux tabanl\u0131 imajlar daha k\u00fc\u00e7\u00fckt\u00fcr ve \u00fcretim ortamlar\u0131 i\u00e7in idealdir.\nFROM node:18-alpine\n\n# 2. \u00c7al\u0131\u015fma Dizini Belirle: Konteyner i\u00e7inde uygulama dosyalar\u0131m\u0131z\u0131n bulunaca\u011f\u0131 dizin.\nWORKDIR \/app\n\n# 3. Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Kopyala: package.json ve package-lock.json dosyalar\u0131n\u0131 \u00e7al\u0131\u015fma dizinine kopyala.\n# Bu ad\u0131m, node_modules'in olu\u015fmas\u0131 i\u00e7in gereklidir.\nCOPY package*.json .\/\n\n# 4. Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Kur: Uygulaman\u0131n t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kur.\n# --only=production flag'i sadece \u00fcretim ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kurar, imaj boyutunu k\u00fc\u00e7\u00fclt\u00fcr.\nRUN npm install --only=production\n\n# 5. Uygulama Kodunu Kopyala: Kalan t\u00fcm uygulama dosyalar\u0131n\u0131 \u00e7al\u0131\u015fma dizinine kopyala.\nCOPY . .\n\n# 6. Portu A\u00e7\u0131\u011fa \u00c7\u0131kar: Uygulaman\u0131n dinledi\u011fi portu Docker'a bildir. (Bu bir bildirimdir, ger\u00e7ek port e\u015flemesi de\u011fildir)\nEXPOSE 3000\n\n# 7. Uygulamay\u0131 Ba\u015flat: Konteyner ba\u015flat\u0131ld\u0131\u011f\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131lacak komut.\nCMD [\"node\", \"index.js\"]\n    <\/code><\/pre>\n<p>Her bir komutun ne anlama geldi\u011fini a\u00e7\u0131klayal\u0131m:<\/p>\n<ul>\n<li><strong><code>FROM node:18-alpine<\/code>:<\/strong> Konteyner imaj\u0131m\u0131z\u0131n temelini olu\u015fturacak olan Node.js 18 s\u00fcr\u00fcm\u00fcn\u00fc i\u00e7eren Alpine Linux tabanl\u0131 imaj\u0131 belirtir. Alpine imajlar\u0131, boyut olarak \u00e7ok daha k\u00fc\u00e7\u00fckt\u00fcr.<\/li>\n<li><strong><code>WORKDIR \/app<\/code>:<\/strong> Konteyner i\u00e7inde t\u00fcm komutlar\u0131m\u0131z\u0131n \u00e7al\u0131\u015faca\u011f\u0131 ve uygulama dosyalar\u0131m\u0131z\u0131n bulunaca\u011f\u0131 dizini <code class=\"language-\">\/app<\/code> olarak belirler.<\/li>\n<li><strong><code>COPY package*.json .\/<\/code>:<\/strong> Yerel makinenizdeki <code class=\"language-\">package.json<\/code> ve <code class=\"language-\">package-lock.json<\/code> dosyalar\u0131n\u0131 konteyner i\u00e7indeki <code class=\"language-\">\/app<\/code> dizinine kopyalar. Ba\u011f\u0131ml\u0131l\u0131k kurulumu i\u00e7in bu dosyalar gereklidir.<\/li>\n<li><strong><code>RUN npm install --only=production<\/code>:<\/strong> Konteyner i\u00e7inde <code class=\"language-\">npm install<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak uygulaman\u0131n t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kurar. <code class=\"language-\">--only=production<\/code> bayra\u011f\u0131, sadece \u00fcretim i\u00e7in gerekli olan ba\u011f\u0131ml\u0131l\u0131klar\u0131n kurulmas\u0131n\u0131 sa\u011flayarak imaj boyutunu optimize eder.<\/li>\n<li><strong><code>COPY . .<\/code>:<\/strong> Mevcut dizindeki (<code>.<\/code>) t\u00fcm di\u011fer uygulama dosyalar\u0131n\u0131 (<code>index.js<\/code> gibi) konteyner i\u00e7indeki <code class=\"language-\">\/app<\/code> dizinine (<code>.<\/code>) kopyalar.<\/li>\n<li><strong><code>EXPOSE 3000<\/code>:<\/strong> Uygulaman\u0131n 3000 numaral\u0131 port \u00fczerinden hizmet verece\u011fini Docker&#8217;a bildirir. Bu, bir d\u00f6k\u00fcmantasyon gibidir; ger\u00e7ek port e\u015flemesi <code class=\"language-\">docker run<\/code> komutuyla yap\u0131l\u0131r.<\/li>\n<li><strong><code>CMD [\"node\", \"index.js\"]<\/code>:<\/strong> Konteyner ba\u015flat\u0131ld\u0131\u011f\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131lacak varsay\u0131lan komutu belirler. Bu komut, Node.js uygulaman\u0131z\u0131 ba\u015flatacakt\u0131r.<\/li>\n<\/ul>\n<p>Bu Dockerfile, Node.js uygulaman\u0131z\u0131 konteynerle\u015ftirmek i\u00e7in gerekli t\u00fcm ad\u0131mlar\u0131 i\u00e7erir. Dosyay\u0131 kaydettikten sonra, bir sonraki ad\u0131mda bu Dockerfile&#8217;\u0131 kullanarak bir Docker imaj\u0131 olu\u015fturaca\u011f\u0131z ve uygulamam\u0131z\u0131 bir konteyner i\u00e7inde \u00e7al\u0131\u015ft\u0131raca\u011f\u0131z. Bu yap\u0131, Node.js uygulamalar\u0131n\u0131z\u0131n farkl\u0131 ortamlarda tutarl\u0131 bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 garanti etmenin ilk ve en \u00f6nemli ad\u0131m\u0131d\u0131r.<\/p>\n<h2>Uygulaman\u0131z\u0131 Docker \u0130maj\u0131na D\u00f6n\u00fc\u015ft\u00fcrme ve \u00c7al\u0131\u015ft\u0131rma S\u00fcreci Nas\u0131l \u0130\u015fler?<\/h2>\n<p>\u00d6nceki b\u00f6l\u00fcmde Node.js uygulamam\u0131z\u0131 haz\u0131rlad\u0131k ve Dockerfile&#8217;\u0131m\u0131z\u0131 yazd\u0131k. \u015eimdi s\u0131ra, bu Dockerfile&#8217;\u0131 kullanarak uygulaman\u0131zdan bir Docker imaj\u0131 olu\u015fturmaya ve bu imaj\u0131 bir konteyner olarak \u00e7al\u0131\u015ft\u0131rmaya geldi. Bu ad\u0131mlar, uygulaman\u0131z\u0131n Docker ekosistemine entegrasyonunun temelini olu\u015fturur ve konteynerle\u015ftirmenin g\u00fcc\u00fcn\u00fc somut bir \u015fekilde deneyimlemenizi sa\u011flar.<\/p>\n<h3>Docker \u0130maj\u0131 Nas\u0131l Olu\u015fturulur?<\/h3>\n<p>Docker imaj\u0131 olu\u015fturmak i\u00e7in, terminalinizde Node.js uygulaman\u0131z\u0131n ve Dockerfile&#8217;\u0131n\u0131z\u0131n bulundu\u011fu dizinde olman\u0131z gerekir. \u0130maj olu\u015fturma i\u015flemi i\u00e7in <code class=\"language-\">docker build<\/code> komutunu kullan\u0131r\u0131z. Bu komut, Dockerfile&#8217;daki talimatlar\u0131 s\u0131ras\u0131yla uygulayarak bir imaj katmanlar\u0131 seti olu\u015fturur.<\/p>\n<p>A\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code>\ndocker build -t my-node-app:1.0 .\n    <\/code><\/pre>\n<p>Bu komuttaki parametreleri a\u00e7\u0131klayal\u0131m:<\/p>\n<ul>\n<li><strong><code class=\"language-\">docker build<\/code>:<\/strong> Docker&#8217;a bir imaj olu\u015fturma komutunu verir.<\/li>\n<li><strong><code class=\"language-\">-t my-node-app:1.0<\/code>:<\/strong> Olu\u015fturulan imaja bir etiket (tag) atar. Burada <code class=\"language-\">my-node-app<\/code> imaj\u0131n ad\u0131, <code class=\"language-\">1.0<\/code> ise s\u00fcr\u00fcm\u00fcd\u00fcr. Bu etiket, imaj\u0131n\u0131z\u0131 daha sonra kolayca bulman\u0131z\u0131 ve y\u00f6netmenizi sa\u011flar.<\/li>\n<li><strong><code class=\"language-\">.<\/code>:<\/strong> Dockerfile&#8217;\u0131n bulundu\u011fu ba\u011flam (context) yolunu belirtir. <code class=\"language-\">.<\/code> mevcut dizini ifade eder. Docker, bu dizindeki dosyalar\u0131 imaj olu\u015fturma s\u00fcrecinde kullanabilir (\u00f6rne\u011fin <code class=\"language-\">COPY<\/code> komutu i\u00e7in).<\/li>\n<\/ul>\n<p>Komutu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, Dockerfile&#8217;daki her bir ad\u0131m\u0131n ayr\u0131 bir katman olarak nas\u0131l i\u015flendi\u011fini g\u00f6receksiniz. \u00d6zellikle <code class=\"language-\">npm install<\/code> ad\u0131m\u0131 biraz zaman alabilir. \u0130\u015flem tamamland\u0131\u011f\u0131nda, Docker imaj\u0131n\u0131z ba\u015far\u0131yla olu\u015fturulmu\u015f olacakt\u0131r. Olu\u015fturulan imajlar\u0131 listelemek i\u00e7in \u015fu komutu kullanabilirsiniz:<\/p>\n<pre><code>\ndocker images\n    <\/code><\/pre>\n<p>Bu komutun \u00e7\u0131kt\u0131s\u0131nda <code class=\"language-\">my-node-app<\/code> imaj\u0131n\u0131z\u0131 ve belirtti\u011finiz <code class=\"language-\">1.0<\/code> etiketini g\u00f6rmelisiniz. Bu, Node.js uygulaman\u0131z\u0131n art\u0131k ta\u015f\u0131nabilir bir Docker imaj\u0131 olarak haz\u0131r oldu\u011fu anlam\u0131na gelir. \u0130maj katmanlar\u0131, Docker&#8217;\u0131n verimli depolama ve \u00f6nbellekleme mekanizmas\u0131n\u0131n bir par\u00e7as\u0131d\u0131r. Her komut yeni bir katman olu\u015fturur ve de\u011fi\u015fen katmanlar yeniden olu\u015fturulur, de\u011fi\u015fmeyenler ise \u00f6nbellekten al\u0131n\u0131r. Bu, \u00f6zellikle geli\u015ftirme s\u00fcrecinde h\u0131zl\u0131 iterasyonlar yapman\u0131z\u0131 sa\u011flar.<\/p>\n<h3>Docker Konteyneri Nas\u0131l \u00c7al\u0131\u015ft\u0131r\u0131l\u0131r?<\/h3>\n<p>Docker imaj\u0131m\u0131z\u0131 olu\u015fturduktan sonra, bu imajdan bir konteyner ba\u015flatarak Node.js uygulamam\u0131z\u0131 \u00e7al\u0131\u015ft\u0131rabiliriz. Konteyner \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code class=\"language-\">docker run<\/code> komutunu kullan\u0131r\u0131z.<\/p>\n<pre><code>\ndocker run -p 3000:3000 -d --name my-running-node-app my-node-app:1.0\n    <\/code><\/pre>\n<p>Bu komuttaki parametreleri inceleyelim:<\/p>\n<ul>\n<li><strong><code class=\"language-\">docker run<\/code>:<\/strong> Docker&#8217;a bir konteyner \u00e7al\u0131\u015ft\u0131rma komutunu verir.<\/li>\n<li><strong><code class=\"language-\">-p 3000:3000<\/code>:<\/strong> Port e\u015flemesi yapar. \u0130lk 3000, yerel makinenizdeki portu; ikinci 3000 ise konteyner i\u00e7indeki portu (Dockerfile&#8217;da <code class=\"language-\">EXPOSE 3000<\/code> ile belirtti\u011fimiz port) temsil eder. Bu sayede, yerel makinenizden <code class=\"language-\">localhost:3000<\/code> adresine yap\u0131lan istekler konteynerdeki Node.js uygulaman\u0131za y\u00f6nlendirilir.<\/li>\n<li><strong><code class=\"language-\">-d<\/code>:<\/strong> Konteyneri &#8220;detached&#8221; (ayr\u0131k) modda \u00e7al\u0131\u015ft\u0131r\u0131r. Yani, konteyner arka planda \u00e7al\u0131\u015fmaya devam ederken terminaliniz serbest kal\u0131r.<\/li>\n<li><strong><code class=\"language-\">--name my-running-node-app<\/code>:<\/strong> \u00c7al\u0131\u015fan konteynere okunabilir bir isim atar. Bu isim, konteyneri daha sonra kolayca y\u00f6netmenizi sa\u011flar.<\/li>\n<li><strong><code class=\"language-\">my-node-app:1.0<\/code>:<\/strong> \u00c7al\u0131\u015ft\u0131rmak istedi\u011fimiz imaj\u0131n ad\u0131n\u0131 ve etiketini belirtiriz.<\/li>\n<\/ul>\n<p>Komutu \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra, Docker size \u00e7al\u0131\u015fan konteynerin ID&#8217;sini d\u00f6nd\u00fcrecektir. Konteynerin ger\u00e7ekten \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in \u015fu komutu kullanabilirsiniz:<\/p>\n<pre><code>\ndocker ps\n    <\/code><\/pre>\n<p>Bu komut, \u00e7al\u0131\u015fan t\u00fcm Docker konteynerlerini listeler. Listede <code class=\"language-\">my-running-node-app<\/code> adl\u0131 konteynerinizi g\u00f6rmelisiniz. \u015eimdi taray\u0131c\u0131n\u0131z\u0131 a\u00e7\u0131n ve <code class=\"language-\">http:\/\/localhost:3000<\/code> adresine gidin. Node.js uygulaman\u0131z\u0131n konteyner i\u00e7inde ba\u015far\u0131yla \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve &#8220;Merhaba Docker! Node.js uygulamam konteynerde \u00e7al\u0131\u015f\u0131yor!&#8221; mesaj\u0131n\u0131 g\u00f6rd\u00fc\u011f\u00fcn\u00fcz\u00fc fark edeceksiniz. Bu, uygulaman\u0131z\u0131n art\u0131k kendi izole ortam\u0131nda, t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131yla birlikte \u00e7al\u0131\u015ft\u0131\u011f\u0131 anlam\u0131na gelir.<\/p>\n<p>Konteynerin loglar\u0131n\u0131 (g\u00fcnl\u00fcklerini) g\u00f6rmek i\u00e7in ise \u015fu komutu kullanabilirsiniz:<\/p>\n<pre><code>\ndocker logs my-running-node-app\n    <\/code><\/pre>\n<p>Bu komut, <code class=\"language-\">console.log<\/code> ile yazd\u0131rd\u0131\u011f\u0131n\u0131z mesajlar\u0131 g\u00f6sterecektir. Konteyneri durdurmak ve kald\u0131rmak i\u00e7in ise s\u0131ras\u0131yla \u015fu komutlar\u0131 kullanabilirsiniz:<\/p>\n<pre><code>\ndocker stop my-running-node-app\ndocker rm my-running-node-app\n    <\/code><\/pre>\n<p>Tebrikler! Node.js uygulaman\u0131z\u0131 ba\u015far\u0131yla Dockerize ettiniz ve bir konteyner i\u00e7inde \u00e7al\u0131\u015ft\u0131rd\u0131n\u0131z. Bu temel beceri, daha karma\u015f\u0131k Docker ve Node.js entegrasyonlar\u0131na kap\u0131 aralayacakt\u0131r. Bir sonraki b\u00f6l\u00fcmde, birden fazla servisi (\u00f6rne\u011fin bir veritaban\u0131 ile Node.js uygulamas\u0131n\u0131) Docker Compose kullanarak nas\u0131l y\u00f6netece\u011finizi \u00f6\u011frenece\u011fiz.<\/p>\n<h2>Geli\u015ftirme Ortam\u0131nda Verimlilik: Docker Compose ile \u00c7oklu Konteyner Y\u00f6netimi<\/h2>\n<p>Tek bir Node.js uygulamas\u0131n\u0131 Dockerize etmek harika bir ba\u015flang\u0131\u00e7t\u0131r, ancak ger\u00e7ek d\u00fcnya uygulamalar\u0131 genellikle birden fazla servisten olu\u015fur. \u00d6rne\u011fin, bir Node.js API&#8217;si genellikle bir veritaban\u0131na (MongoDB, PostgreSQL vb.) ihtiya\u00e7 duyar. Bu durumda, her bir servisi ayr\u0131 ayr\u0131 <code class=\"language-\">docker run<\/code> komutlar\u0131yla y\u00f6netmek karma\u015f\u0131k ve zaman al\u0131c\u0131 hale gelebilir. \u0130\u015fte tam bu noktada Docker Compose devreye girer.<\/p>\n<h3>Docker Compose Neden Kullan\u0131l\u0131r?<\/h3>\n<p>Docker Compose, birden fazla Docker konteynerini i\u00e7eren uygulamalar\u0131 tan\u0131mlamak ve \u00e7al\u0131\u015ft\u0131rmak i\u00e7in bir ara\u00e7t\u0131r. Tek bir YAML dosyas\u0131 kullanarak, uygulaman\u0131z\u0131n t\u00fcm servislerini, a\u011flar\u0131n\u0131 ve birimlerini (volumes) yap\u0131land\u0131rabilirsiniz. Bu sayede, tek bir komutla t\u00fcm uygulaman\u0131z\u0131 (Node.js API&#8217;niz, veritaban\u0131n\u0131z, \u00f6nbellek sunucunuz vb.) ba\u015flatabilir, durdurabilir ve y\u00f6netebilirsiniz. Docker Compose&#8217;un temel faydalar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Tek Dosya Tan\u0131m\u0131:<\/strong> T\u00fcm servislerinizin yap\u0131land\u0131rmas\u0131n\u0131 tek bir <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131nda merkezi olarak y\u00f6netirsiniz.<\/li>\n<li><strong>Kolay Ba\u015flatma ve Durdurma:<\/strong> Tek bir komutla t\u00fcm uygulamay\u0131 aya\u011fa kald\u0131rabilir veya kapatabilirsiniz.<\/li>\n<li><strong>Servis \u0130leti\u015fimi:<\/strong> Varsay\u0131lan olarak, Compose taraf\u0131ndan olu\u015fturulan servisler birbirleriyle a\u011f \u00fczerinden isimleriyle ileti\u015fim kurabilirler.<\/li>\n<li><strong>Ta\u015f\u0131nabilirlik:<\/strong> <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131n\u0131 ba\u015fka bir geli\u015ftiriciye veya sunucuya ta\u015f\u0131yarak ayn\u0131 \u00e7oklu konteyner ortam\u0131n\u0131 kolayca yeniden olu\u015fturabilirsiniz.<\/li>\n<\/ul>\n<p>Bir <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131 genellikle \u015fu ana b\u00f6l\u00fcmleri i\u00e7erir:<\/p>\n<ul>\n<li><strong><code class=\"language-\">version<\/code>:<\/strong> Compose dosyas\u0131n\u0131n s\u00fcr\u00fcm\u00fcn\u00fc belirtir.<\/li>\n<li><strong><code class=\"language-\">services<\/code>:<\/strong> Uygulaman\u0131zdaki her bir servisi tan\u0131mlar (\u00f6rne\u011fin, <code class=\"language-\">web<\/code> servisi Node.js uygulaman\u0131z, <code class=\"language-\">db<\/code> servisi veritaban\u0131n\u0131z).<\/li>\n<li><strong><code class=\"language-\">ports<\/code>:<\/strong> Servislerin d\u0131\u015f d\u00fcnyaya a\u00e7\u0131lacak portlar\u0131n\u0131 e\u015fler.<\/li>\n<li><strong><code class=\"language-\">volumes<\/code>:<\/strong> Veri kal\u0131c\u0131l\u0131\u011f\u0131 sa\u011flamak i\u00e7in konteynerler ve ana makine aras\u0131nda veri payla\u015f\u0131m\u0131n\u0131 y\u00f6netir.<\/li>\n<li><strong><code class=\"language-\">networks<\/code>:<\/strong> Servisler aras\u0131ndaki a\u011f ileti\u015fimini yap\u0131land\u0131r\u0131r.<\/li>\n<\/ul>\n<h3>Node.js ve MongoDB ile \u00d6rnek Bir Docker Compose Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>\u015eimdi, Node.js uygulamam\u0131z\u0131 bir MongoDB veritaban\u0131yla birlikte \u00e7al\u0131\u015ft\u0131racak bir <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131 olu\u015ftural\u0131m. Bunun i\u00e7in, mevcut Node.js projenizin k\u00f6k dizininde <code class=\"language-\">docker-compose.yml<\/code> ad\u0131nda bir dosya olu\u015fturun ve a\u015fa\u011f\u0131daki i\u00e7eri\u011fi ekleyin:<\/p>\n<pre><code>\nversion: '3.8'\n\nservices:\n  web:\n    build:\n      context: .\n      dockerfile: Dockerfile\n    ports:\n      - \"3000:3000\"\n    environment:\n      NODE_ENV: development\n      MONGO_URI: mongodb:\/\/db:27017\/mydatabase # db, servis ad\u0131d\u0131r\n    depends_on:\n      - db\n    volumes:\n      - .:\/app # Geli\u015ftirme i\u00e7in kod de\u011fi\u015fikliklerini an\u0131nda yans\u0131tmak \u00fczere\n      - \/app\/node_modules # node_modules'in ana makineye kopyalanmas\u0131n\u0131 engelle\n\n  db:\n    image: mongo:4.4\n    ports:\n      - \"27017:27017\" # Opsiyonel: Veritaban\u0131na d\u0131\u015far\u0131dan eri\u015fim i\u00e7in\n    volumes:\n      - mongo-data:\/data\/db # Veri kal\u0131c\u0131l\u0131\u011f\u0131 i\u00e7in volume kullan\n\nvolumes:\n  mongo-data: # mongo-data ad\u0131nda bir volume tan\u0131mla\n    driver: local\n    <\/code><\/pre>\n<p>Bu <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131n\u0131 a\u00e7\u0131klayal\u0131m:<\/p>\n<ul>\n<li><strong><code class=\"language-\">web<\/code> servisi:<\/strong>\n<ul>\n<li><code class=\"language-\">build<\/code>: Node.js uygulamam\u0131z i\u00e7in Docker imaj\u0131n\u0131 mevcut dizindeki (<code class=\"language-\">.<\/code>) <code class=\"language-\">Dockerfile<\/code> kullanarak olu\u015fturmas\u0131n\u0131 s\u00f6yler.<\/li>\n<li><code class=\"language-\">ports<\/code>: Yerel makinenin 3000 portunu konteynerin 3000 portuna e\u015fler.<\/li>\n<li><code class=\"language-\">environment<\/code>: Konteyner i\u00e7inde kullan\u0131lacak ortam de\u011fi\u015fkenlerini tan\u0131mlar. Burada <code class=\"language-\">MONGO_URI<\/code> de\u011fi\u015fkeni, Node.js uygulamas\u0131n\u0131n <code class=\"language-\">db<\/code> servisindeki MongoDB&#8217;ye nas\u0131l ba\u011flanaca\u011f\u0131n\u0131 belirtir. <code class=\"language-\">db<\/code> burada, Docker Compose taraf\u0131ndan olu\u015fturulan a\u011fdaki MongoDB servisinin ad\u0131d\u0131r.<\/li>\n<li><code class=\"language-\">depends_on<\/code>: <code class=\"language-\">web<\/code> servisinin <code class=\"language-\">db<\/code> servisi ba\u015flamadan \u00f6nce ba\u015flamamas\u0131n\u0131 sa\u011flar.<\/li>\n<li><code class=\"language-\">volumes<\/code>: Geli\u015ftirme ortam\u0131nda \u00e7ok \u00f6nemli olan iki volume tan\u0131m\u0131 var. Birincisi, mevcut proje dizinimizi (<code class=\"language-\">.<\/code>) konteyner i\u00e7indeki <code class=\"language-\">\/app<\/code> dizinine e\u015fler. Bu sayede, yerel makinenizde yapt\u0131\u011f\u0131n\u0131z kod de\u011fi\u015fiklikleri an\u0131nda konteyner i\u00e7inde yans\u0131r (Node.js uygulamas\u0131 otomatik yeniden ba\u015flat\u0131l\u0131yorsa). \u0130kincisi, <code class=\"language-\">\/app\/node_modules<\/code> dizininin ana makineye kopyalanmas\u0131n\u0131 engeller, \u00e7\u00fcnk\u00fc <code class=\"language-\">node_modules<\/code> zaten konteyner i\u00e7inde kurulmu\u015ftur.<\/li>\n<\/ul>\n<\/li>\n<li><strong><code class=\"language-\">db<\/code> servisi:<\/strong>\n<ul>\n<li><code class=\"language-\">image<\/code>: MongoDB i\u00e7in <code class=\"language-\">mongo:4.4<\/code> imaj\u0131n\u0131 kullan\u0131r.<\/li>\n<li><code class=\"language-\">ports<\/code>: Opsiyonel olarak, yerel makinenin 27017 portunu MongoDB&#8217;nin 27017 portuna e\u015fler. Bu, d\u0131\u015far\u0131dan MongoDB&#8217;ye eri\u015fmek isterseniz kullan\u0131\u015fl\u0131d\u0131r (\u00f6rne\u011fin bir GUI arac\u0131yla).<\/li>\n<li><code class=\"language-\">volumes<\/code>: <code class=\"language-\">mongo-data<\/code> ad\u0131nda bir isimlendirilmi\u015f volume kullanarak MongoDB verilerinin kal\u0131c\u0131 olmas\u0131n\u0131 sa\u011flar. Konteyner silinse bile veriler bu volume&#8217;da kal\u0131r.<\/li>\n<\/ul>\n<\/li>\n<li><strong><code class=\"language-\">volumes<\/code>:<\/strong> <code class=\"language-\">mongo-data<\/code> ad\u0131nda bir isimlendirilmi\u015f volume tan\u0131mlar. Bu volume, Docker taraf\u0131ndan y\u00f6netilir ve verilerinizi konteynerden ba\u011f\u0131ms\u0131z olarak saklar.<\/li>\n<\/ul>\n<p>Bu yap\u0131land\u0131rmay\u0131 kullanabilmek i\u00e7in, Node.js uygulaman\u0131z\u0131n MongoDB ba\u011flant\u0131 dizesini ortam de\u011fi\u015fkeninden okuyacak \u015fekilde g\u00fcncellenmesi gerekir. \u00d6rne\u011fin, <code class=\"language-\">index.js<\/code> dosyan\u0131za basit bir MongoDB ba\u011flant\u0131s\u0131 ekleyebilirsiniz (<code>mongoose<\/code> gibi bir k\u00fct\u00fcphane kullanarak). \u015eimdilik, sadece <code class=\"language-\">process.env.MONGO_URI<\/code> de\u011fi\u015fkeninin mevcut oldu\u011funu varsayal\u0131m.<\/p>\n<p>T\u00fcm bu servisleri ba\u015flatmak i\u00e7in terminalinizde <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131n\u0131n bulundu\u011fu dizinde \u015fu komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code>\ndocker compose up -d\n    <\/code><\/pre>\n<p>Bu komut, Docker Compose&#8217;u kullanarak t\u00fcm servislerinizi (Node.js uygulaman\u0131z ve MongoDB) arka planda (<code class=\"language-\">-d<\/code> detached modu) ba\u015flat\u0131r. Konteynerlerin durumunu kontrol etmek i\u00e7in:<\/p>\n<pre><code>\ndocker compose ps\n    <\/code><\/pre>\n<p>Uygulaman\u0131z\u0131 durdurmak ve olu\u015fturulan t\u00fcm konteynerleri, a\u011flar\u0131 ve isimsiz volume&#8217;lar\u0131 kald\u0131rmak i\u00e7in:<\/p>\n<pre><code>\ndocker compose down\n    <\/code><\/pre>\n<p>Ancak, isimlendirilmi\u015f volume&#8217;lar\u0131 (\u00f6rne\u011fin <code class=\"language-\">mongo-data<\/code>) kald\u0131rmak i\u00e7in <code class=\"language-\">docker compose down -v<\/code> komutunu kullanman\u0131z gerekir. Bu, veritaban\u0131 verilerinizin kal\u0131c\u0131l\u0131\u011f\u0131n\u0131 sa\u011flarken dikkat edilmesi gereken \u00f6nemli bir noktad\u0131r. Docker Compose, \u00f6zellikle geli\u015ftirme ve test ortamlar\u0131nda \u00e7oklu servisleri y\u00f6netmek i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r. Bu sayede, karma\u015f\u0131k uygulamalar\u0131n kurulumu ve y\u00f6netimi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015fir.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131 ve \u0130leri D\u00fczey \u0130pu\u00e7lar\u0131: Node.js Docker Optimizasyonlar\u0131<\/h2>\n<p>Node.js uygulamalar\u0131n\u0131z\u0131 Docker ile konteynerle\u015ftirme ve Docker Compose ile y\u00f6netme temelini att\u0131ktan sonra, \u015fimdi s\u0131ra ger\u00e7ek d\u00fcnya senaryolar\u0131na ve daha ileri d\u00fczey optimizasyonlara geliyor. Bu b\u00f6l\u00fcmde, Docker imajlar\u0131n\u0131z\u0131n boyutunu k\u00fc\u00e7\u00fcltmek, g\u00fcvenli\u011fi art\u0131rmak, geli\u015ftirme s\u00fcrecini h\u0131zland\u0131rmak ve hata ay\u0131klama tekniklerini ele alaca\u011f\u0131z. Ayr\u0131ca, mobil uyumlu HTML geli\u015ftirirken Docker&#8217;\u0131n dolayl\u0131 faydalar\u0131na da de\u011finece\u011fiz.<\/p>\n<h3>Performans ve G\u00fcvenlik \u0130\u00e7in Dockerfile Optimizasyonlar\u0131<\/h3>\n<p>Docker imajlar\u0131n\u0131n boyutu, da\u011f\u0131t\u0131m s\u00fcresi, depolama maliyetleri ve hatta g\u00fcvenlik \u00fczerinde do\u011frudan etkiye sahiptir. Daha k\u00fc\u00e7\u00fck imajlar, daha h\u0131zl\u0131 \u00e7ekilir, daha az yer kaplar ve genellikle daha az sald\u0131r\u0131 y\u00fczeyine sahiptir. Node.js uygulamalar\u0131 i\u00e7in imaj boyutunu optimize etmenin en etkili yollar\u0131ndan biri <strong>Multi-stage build (\u00e7ok a\u015famal\u0131 derleme)<\/strong> kullanmakt\u0131r.<\/p>\n<p>Multi-stage build, Dockerfile&#8217;da birden fazla <code class=\"language-\">FROM<\/code> ifadesi kullanarak imaj olu\u015fturma s\u00fcrecini farkl\u0131 a\u015famalara ay\u0131rman\u0131za olanak tan\u0131r. Her a\u015fama kendi temel imaj\u0131n\u0131 kullanabilir ve bir a\u015famadan di\u011ferine sadece gerekli \u00e7\u0131kt\u0131lar kopyalan\u0131r. Bu, \u00f6zellikle derleme ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n (\u00f6rne\u011fin TypeScript derleyicileri, test ara\u00e7lar\u0131) nihai \u00fcretim imaj\u0131na dahil edilmesini \u00f6nlemek i\u00e7in idealdir.<\/p>\n<p>\u0130\u015fte Node.js i\u00e7in multi-stage build kullanan optimize edilmi\u015f bir Dockerfile \u00f6rne\u011fi:<\/p>\n<pre><code>\n# 1. A\u015fama: Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Kurma ve Uygulamay\u0131 Derleme\nFROM node:18-alpine AS builder\nWORKDIR \/app\nCOPY package*.json .\/\nRUN npm install --omit=dev # Sadece \u00fcretim ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kur\nCOPY . .\nRUN npm run build || true # E\u011fer build script'iniz varsa \u00e7al\u0131\u015ft\u0131r\u0131n, yoksa hata vermez\n\n# 2. A\u015fama: \u00dcretim \u0130maj\u0131 Olu\u015fturma\nFROM node:18-alpine\nWORKDIR \/app\nCOPY --from=builder \/app\/node_modules .\/node_modules # Sadece kurulu ba\u011f\u0131ml\u0131l\u0131klar\u0131 kopyala\nCOPY --from=builder \/app\/dist .\/dist # E\u011fer bir build \u00e7\u0131kt\u0131s\u0131 varsa kopyala (\u00f6rne\u011fin TypeScript projeleri i\u00e7in)\nCOPY package.json .\/ # Sadece package.json'\u0131 kopyala (ba\u015flatma komutu i\u00e7in gerekebilir)\nCOPY index.js .\/ # Ana uygulama dosyas\u0131n\u0131 kopyala\n\nEXPOSE 3000\nCMD [\"node\", \"index.js\"]\n    <\/code><\/pre>\n<p>Bu \u00f6rnekte, ilk a\u015famada t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar kurulur ve uygulama derlenir. \u0130kinci a\u015famada ise, sadece nihai uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gerekli olan dosyalar (<code>node_modules<\/code>, derlenmi\u015f kod ve ana uygulama dosyas\u0131) kopyalan\u0131r. Bu, genellikle son imaj boyutunu \u00f6nemli \u00f6l\u00e7\u00fcde k\u00fc\u00e7\u00fclt\u00fcr.<\/p>\n<p>Bir di\u011fer \u00f6nemli optimizasyon arac\u0131 ise <strong><code class=\"language-\">.dockerignore<\/code><\/strong> dosyas\u0131d\u0131r. T\u0131pk\u0131 <code class=\"language-\">.gitignore<\/code> gibi, <code class=\"language-\">.dockerignore<\/code> da Docker&#8217;\u0131n imaj olu\u015fturma ba\u011flam\u0131na hangi dosyalar\u0131n dahil edilece\u011fini kontrol etmenizi sa\u011flar. <code class=\"language-\">node_modules<\/code>, <code class=\"language-\">.git<\/code>, <code class=\"language-\">tmp<\/code> gibi gereksiz dosyalar\u0131 ve dizinleri bu dosyaya ekleyerek imaj boyutunu k\u00fc\u00e7\u00fcltebilir ve derleme s\u00fcresini h\u0131zland\u0131rabilirsiniz. \u00d6rne\u011fin:<\/p>\n<pre><code>\nnode_modules\n.git\n.gitignore\nnpm-debug.log\nDockerfile\ndocker-compose.yml\nREADME.md\n.env\n    <\/code><\/pre>\n<p>G\u00fcvenlik a\u00e7\u0131s\u0131ndan ise, konteynerleri <strong>root kullan\u0131c\u0131s\u0131 olarak \u00e7al\u0131\u015ft\u0131rmaktan ka\u00e7\u0131nmak<\/strong> \u00f6nemlidir. <code class=\"language-\">USER<\/code> komutunu kullanarak, daha az yetkiye sahip bir kullan\u0131c\u0131 olu\u015fturup konteyneri onunla \u00e7al\u0131\u015ft\u0131rabilirsiniz. Ayr\u0131ca, ba\u011f\u0131ml\u0131l\u0131k tarama ara\u00e7lar\u0131 (\u00f6rne\u011fin Snyk) kullanarak bilinen g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 tespit etmek ve gidermek de kritik \u00f6neme sahiptir.<\/p>\n<h3>Konteyner \u0130zleme ve Hata Ay\u0131klama (Debugging) Teknikleri<\/h3>\n<p>Uygulamalar\u0131n\u0131z konteyner i\u00e7inde \u00e7al\u0131\u015f\u0131rken, onlar\u0131n durumunu izlemek ve gerekti\u011finde hata ay\u0131klamak hayati \u00f6nem ta\u015f\u0131r. Docker, bu konuda size birka\u00e7 g\u00fc\u00e7l\u00fc ara\u00e7 sunar:<\/p>\n<ul>\n<li><strong><code class=\"language-\">docker logs [konteyner_ad\u0131_veya_id]<\/code><\/strong>: \u00c7al\u0131\u015fan bir konteynerin standart \u00e7\u0131kt\u0131 (stdout) ve standart hata (stderr) ak\u0131\u015flar\u0131n\u0131 g\u00f6sterir. Uygulaman\u0131z\u0131n <code class=\"language-\">console.log<\/code> veya <code class=\"language-\">console.error<\/code> ile yazd\u0131\u011f\u0131 her \u015feyi burada g\u00f6rebilirsiniz.<\/li>\n<li><strong><code class=\"language-\">docker exec -it [konteyner_ad\u0131_veya_id] bash<\/code><\/strong>: \u00c7al\u0131\u015fan bir konteyner i\u00e7ine interaktif bir kabuk (shell) a\u00e7man\u0131z\u0131 sa\u011flar. Bu sayede, konteyner i\u00e7indeki dosya sistemini ke\u015ffedebilir, komutlar\u0131 \u00e7al\u0131\u015ft\u0131rabilir ve sorunlar\u0131 giderebilirsiniz.<\/li>\n<\/ul>\n<p>Node.js uygulamalar\u0131 i\u00e7in hata ay\u0131klama (debugging) yaparken, Node.js&#8217;in dahili inspector&#8217;\u0131n\u0131 Docker ile birlikte kullanabilirsiniz. Dockerfile&#8217;\u0131n\u0131zda veya <code class=\"language-\">docker run<\/code> komutunuzda Node.js uygulamas\u0131n\u0131 <code class=\"language-\">node --inspect=0.0.0.0:9229 index.js<\/code> gibi bir komutla ba\u015flatarak, yerel makinenizdeki bir hata ay\u0131klay\u0131c\u0131 (\u00f6rne\u011fin VS Code) ile konteynerdeki Node.js s\u00fcrecine ba\u011flanabilirsiniz. <code class=\"language-\">docker run -p 9229:9229 ...<\/code> ile port e\u015flemesi yapmay\u0131 unutmay\u0131n.<\/p>\n<h3>Mobil Uyumlu HTML ve Responsive Tasar\u0131mda Docker&#8217;\u0131n Rol\u00fc<\/h3>\n<p>Docker, do\u011frudan HTML veya CSS ile ilgili bir ara\u00e7 de\u011fildir; ancak web uygulamalar\u0131n\u0131n da\u011f\u0131t\u0131m ve geli\u015ftirme s\u00fcre\u00e7lerini standartla\u015ft\u0131rarak, mobil uyumlu ve responsive tasar\u0131m\u0131n dolayl\u0131 olarak daha kolay y\u00f6netilmesine katk\u0131da bulunur. Bir frontend geli\u015ftiricisi, responsive tasar\u0131m i\u00e7in <code class=\"language-\">media query<\/code>&#8216;ler (\u00f6rne\u011fin: <code class=\"language-\">@media (max-width: 768px) { ... }<\/code>) kullanarak farkl\u0131 cihaz boyutlar\u0131na uyum sa\u011flayan CSS kurallar\u0131 yazar. Docker, bu frontend kodunun (HTML, CSS, JavaScript) Node.js sunucusuyla birlikte veya ayr\u0131 bir web sunucusu (Nginx gibi) konteynerinde tutarl\u0131 bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Docker&#8217;\u0131n burada sundu\u011fu avantaj, geli\u015ftirme ortam\u0131ndan \u00fcretim ortam\u0131na kadar t\u00fcm ortamlar\u0131n ayn\u0131 web sunucusu yap\u0131land\u0131rmas\u0131na, Node.js s\u00fcr\u00fcm\u00fcne ve ba\u011f\u0131ml\u0131l\u0131klar\u0131na sahip olmas\u0131n\u0131 garantilemesidir. Bu tutarl\u0131l\u0131k, responsive tasar\u0131m\u0131n farkl\u0131 ortamlarda beklenen gibi \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar ve &#8220;benim lokalimde responsive g\u00f6r\u00fcn\u00fcyor ama canl\u0131da bozuk&#8221; gibi sorunlar\u0131n \u00f6n\u00fcne ge\u00e7er. Ayr\u0131ca, Docker Compose ile bir frontend servisini (\u00f6rne\u011fin React uygulamas\u0131), bir Node.js API servisini ve bir veritaban\u0131n\u0131 tek bir komutla aya\u011fa kald\u0131rarak, tam te\u015fekk\u00fcll\u00fc bir geli\u015ftirme ortam\u0131n\u0131 h\u0131zl\u0131ca kurabilirsiniz. Bu, frontend ve backend ekiplerinin entegrasyon testlerini daha verimli yapmalar\u0131n\u0131 sa\u011flar.<\/p>\n<p>\u00d6zetle, Docker do\u011frudan responsive tasar\u0131m kodunu yazmasa da, bu kodun g\u00fcvenilir ve tutarl\u0131 bir \u015fekilde \u00e7al\u0131\u015faca\u011f\u0131 bir altyap\u0131 sa\u011flayarak, modern web geli\u015ftirme s\u00fcre\u00e7lerinin ayr\u0131lmaz bir par\u00e7as\u0131 haline gelmi\u015ftir. Bu sayede, geli\u015ftiriciler daha \u00e7ok uygulaman\u0131n kendisine ve kullan\u0131c\u0131 deneyimine odaklanabilirler.<\/p>\n<h2>Sonu\u00e7: Node.js ve Docker ile Gelece\u011fe Y\u00f6nelik Geli\u015ftirme<\/h2>\n<p>Bu kapsaml\u0131 rehber boyunca, Node.js uygulamalar\u0131n\u0131z\u0131 Docker ile nas\u0131l konteynerle\u015ftirece\u011finizi, basit bir uygulamadan ba\u015flayarak \u00e7oklu servis y\u00f6netimine ve ileri d\u00fczey optimizasyon tekniklerine kadar ad\u0131m ad\u0131m \u00f6\u011frendik. G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, Docker, &#8220;benim bilgisayar\u0131mda \u00e7al\u0131\u015f\u0131yor&#8221; sendromunu ortadan kald\u0131rarak, yaz\u0131l\u0131m geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerine paha bi\u00e7ilmez bir tutarl\u0131l\u0131k, ta\u015f\u0131nabilirlik ve verimlilik kat\u0131yor.<\/p>\n<p>Node.js&#8217;in h\u0131zl\u0131 ve \u00f6l\u00e7eklenebilir yap\u0131s\u0131, Docker&#8217;\u0131n izolasyon ve standartla\u015ft\u0131rma yetenekleriyle birle\u015fti\u011finde, geli\u015ftiricilere ve DevOps ekiplerine g\u00fc\u00e7l\u00fc bir ara\u00e7 seti sunar. Art\u0131k Node.js projelerinizin ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimi, farkl\u0131 ortamlar aras\u0131ndaki tutarl\u0131l\u0131k veya da\u011f\u0131t\u0131m zorluklar\u0131 hakk\u0131nda endi\u015felenmenize gerek kalmayacak. Dockerfile&#8217;lar ve Docker Compose dosyalar\u0131 sayesinde, karma\u015f\u0131k uygulamalar\u0131 bile tek bir komutla aya\u011fa kald\u0131rabilir, test edebilir ve \u00fcretime da\u011f\u0131tabilirsiniz.<\/p>\n<p>\u00d6zellikle multi-stage build gibi optimizasyon teknikleri sayesinde, \u00fcretim ortamlar\u0131 i\u00e7in daha k\u00fc\u00e7\u00fck, daha h\u0131zl\u0131 ve daha g\u00fcvenli imajlar olu\u015fturman\u0131n yollar\u0131n\u0131 ke\u015ffettik. Ayr\u0131ca, konteyner izleme ve hata ay\u0131klama teknikleri ile uygulamalar\u0131n\u0131z\u0131n sa\u011fl\u0131\u011f\u0131n\u0131 ve performans\u0131n\u0131 nas\u0131l y\u00f6netece\u011finizi de ele ald\u0131k. Mobil uyumlu web uygulamalar\u0131n\u0131n da\u011f\u0131t\u0131m\u0131nda Docker&#8217;\u0131n dolayl\u0131 ancak kritik rol\u00fcn\u00fc de vurgulayarak, bu teknolojinin modern geli\u015ftirme ekosistemindeki yerini peki\u015ftirdik.<\/p>\n<p>Gelecekte, konteyner orkestrasyon ara\u00e7lar\u0131 (\u00f6rne\u011fin Kubernetes) ile Docker&#8217;\u0131n yeteneklerini daha da geni\u015fletebilirsiniz. Bu ara\u00e7lar, binlerce konteyneri y\u00f6netmenize, otomatik \u00f6l\u00e7eklendirme yapman\u0131za ve y\u00fcksek eri\u015filebilirlik sa\u011flaman\u0131za olanak tan\u0131r. Node.js ve Docker entegrasyonuna hakim olmak, sizi bu t\u00fcr ileri d\u00fczey bulut teknolojilerine haz\u0131rlayan \u00f6nemli bir ad\u0131md\u0131r. Bu bilgilerle donanm\u0131\u015f olarak, Node.js projelerinizi daha verimli, g\u00fcvenilir ve \u00f6l\u00e7eklenebilir bir \u015fekilde geli\u015ftirmeye haz\u0131rs\u0131n\u0131z. Unutmay\u0131n, pratik yapmak ve farkl\u0131 senaryolar\u0131 denemek, bu teknolojilere olan hakimiyetinizi art\u0131rman\u0131n en iyi yoludur. Ba\u015far\u0131lar dileriz!<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<dl>\n<dt>Docker konteynerleri neden hafif olmal\u0131?<\/dt>\n<dd>Hafif konteynerler, daha h\u0131zl\u0131 ba\u015flat\u0131l\u0131r, daha az disk alan\u0131 ve bellek kullan\u0131r. Bu da da\u011f\u0131t\u0131m s\u00fcrelerini k\u0131salt\u0131r, sunucu maliyetlerini d\u00fc\u015f\u00fcr\u00fcr ve \u00f6l\u00e7eklenebilirli\u011fi art\u0131r\u0131r. Ayr\u0131ca, daha az bile\u015fen i\u00e7eren imajlar genellikle daha az g\u00fcvenlik a\u00e7\u0131\u011f\u0131na sahiptir.<\/dd>\n<dt><code>npm install<\/code> komutunu Dockerfile&#8217;da nerede \u00e7al\u0131\u015ft\u0131rmal\u0131y\u0131z?<\/dt>\n<dd><code>npm install<\/code> komutunu, <code>package.json<\/code> ve <code>package-lock.json<\/code> dosyalar\u0131n\u0131 kopyalad\u0131ktan hemen sonra \u00e7al\u0131\u015ft\u0131rmal\u0131s\u0131n\u0131z. Bu sayede, bu dosyalar de\u011fi\u015fmedi\u011fi s\u00fcrece Docker, <code>npm install<\/code> katman\u0131n\u0131 \u00f6nbellekten kullanabilir ve imaj olu\u015fturma s\u00fcresini h\u0131zland\u0131r\u0131r. Multi-stage build kullan\u0131yorsan\u0131z, genellikle ilk a\u015famada (builder a\u015famas\u0131) \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r.<\/dd>\n<dt>Docker Compose&#8217;u \u00fcretim ortam\u0131nda kullanmak do\u011fru mu?<\/dt>\n<dd>Docker Compose, genellikle geli\u015ftirme ve test ortamlar\u0131 i\u00e7in tasarlanm\u0131\u015ft\u0131r. \u00dcretim ortamlar\u0131nda, genellikle Kubernetes gibi daha sa\u011flam ve \u00f6l\u00e7eklenebilir konteyner orkestrasyon ara\u00e7lar\u0131 tercih edilir. Ancak, k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli uygulamalar veya basit tek sunuculu da\u011f\u0131t\u0131mlar i\u00e7in Docker Compose da kullan\u0131labilir, ancak s\u0131n\u0131rlamalar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurulmal\u0131d\u0131r.<\/dd>\n<dt>Docker imaj boyutunu k\u00fc\u00e7\u00fcltmek i\u00e7in ne yapabilirim?<\/dt>\n<dd>\u0130maj boyutunu k\u00fc\u00e7\u00fcltmek i\u00e7in \u015funlar\u0131 yapabilirsiniz:<\/p>\n<ul>\n<li>Alpine tabanl\u0131 daha k\u00fc\u00e7\u00fck temel imajlar kullan\u0131n (\u00f6rne\u011fin <code class=\"language-\">node:18-alpine<\/code>).<\/li>\n<li>Multi-stage build kullanarak sadece nihai uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gerekli olan dosyalar\u0131 son imaja dahil edin.<\/li>\n<li><code class=\"language-\">.dockerignore<\/code> dosyas\u0131 ile gereksiz dosyalar\u0131 (<code>node_modules<\/code>, <code>.git<\/code>, test dosyalar\u0131) imaj ba\u011flam\u0131na dahil etmeyin.<\/li>\n<li><code>npm install --only=production<\/code> komutunu kullanarak sadece \u00fcretim ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kurun.<\/li>\n<li>Gereksiz sistem paketlerini kald\u0131rmak i\u00e7in <code>apk del<\/code> gibi komutlar kullan\u0131n.<\/li>\n<\/ul>\n<\/dd>\n<dt>Veritaban\u0131 verilerini Docker konteynerleri silindi\u011finde kaybetmemek i\u00e7in ne yapmal\u0131y\u0131m?<\/dt>\n<dd>Veritaban\u0131 verilerinin kal\u0131c\u0131l\u0131\u011f\u0131n\u0131 sa\u011flamak i\u00e7in <strong>Docker Volumes<\/strong> kullanmal\u0131s\u0131n\u0131z. \u0130simlendirilmi\u015f volume&#8217;lar (named volumes) veya bind mount&#8217;lar kullanarak, veritaban\u0131 konteyneriniz silinse bile verilerinizin ana makinede veya Docker taraf\u0131ndan y\u00f6netilen bir alanda kalmas\u0131n\u0131 sa\u011flayabilirsiniz. Docker Compose dosyas\u0131nda <code class=\"language-\">volumes<\/code> anahtar kelimesini kullanarak bu yap\u0131land\u0131rmay\u0131 kolayca yapabilirsiniz, t\u0131pk\u0131 bu makaledeki MongoDB \u00f6rne\u011finde oldu\u011fu gibi.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Node.js Uygulamalar\u0131n\u0131 Docker ile Kolayca Konteynerle\u015ftirme Rehberi Node.js uygulamalar\u0131n\u0131z\u0131 Docker ile nas\u0131l konteynerle\u015ftirece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Geli\u015ftirme, test&hellip;","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-33149","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>Giri\u015f: Node.js Uygulamalar\u0131 Neden Docker ile Konteynerle\u015ftirilmeli?<\/title>\n<meta name=\"description\" content=\"Node.js uygulamalar\u0131n\u0131z\u0131 Docker ile nas\u0131l konteynerle\u015ftirece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Geli\u015ftirme, test ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi standartla\u015ft\u0131r\u0131n, verimlili\u011fi art\u0131r\u0131n. Bu rehber, Node.js ve Docker entegrasyonuna hakim olman\u0131z\u0131 sa\u011flayacak.\" \/>\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\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Giri\u015f: Node.js Uygulamalar\u0131 Neden Docker ile Konteynerle\u015ftirilmeli?\" \/>\n<meta property=\"og:description\" content=\"Node.js uygulamalar\u0131n\u0131z\u0131 Docker ile nas\u0131l konteynerle\u015ftirece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Geli\u015ftirme, test ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi standartla\u015ft\u0131r\u0131n, verimlili\u011fi art\u0131r\u0131n. Bu rehber, Node.js ve Docker entegrasyonuna hakim olman\u0131z\u0131 sa\u011flayacak.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-30T05:21:36+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=\"28 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Giri\u015f: Node.js Uygulamalar\u0131 Neden Docker ile Konteynerle\u015ftirilmeli?\",\"datePublished\":\"2025-10-30T05:21:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/\"},\"wordCount\":4908,\"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\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/\",\"name\":\"Giri\u015f: Node.js Uygulamalar\u0131 Neden Docker ile Konteynerle\u015ftirilmeli?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-30T05:21:36+00:00\",\"description\":\"Node.js uygulamalar\u0131n\u0131z\u0131 Docker ile nas\u0131l konteynerle\u015ftirece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Geli\u015ftirme, test ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi standartla\u015ft\u0131r\u0131n, verimlili\u011fi art\u0131r\u0131n. Bu rehber, Node.js ve Docker entegrasyonuna hakim olman\u0131z\u0131 sa\u011flayacak.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Giri\u015f: Node.js Uygulamalar\u0131 Neden Docker ile Konteynerle\u015ftirilmeli?\"}]},{\"@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":"Giri\u015f: Node.js Uygulamalar\u0131 Neden Docker ile Konteynerle\u015ftirilmeli?","description":"Node.js uygulamalar\u0131n\u0131z\u0131 Docker ile nas\u0131l konteynerle\u015ftirece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Geli\u015ftirme, test ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi standartla\u015ft\u0131r\u0131n, verimlili\u011fi art\u0131r\u0131n. Bu rehber, Node.js ve Docker entegrasyonuna hakim olman\u0131z\u0131 sa\u011flayacak.","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\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/","og_locale":"tr_TR","og_type":"article","og_title":"Giri\u015f: Node.js Uygulamalar\u0131 Neden Docker ile Konteynerle\u015ftirilmeli?","og_description":"Node.js uygulamalar\u0131n\u0131z\u0131 Docker ile nas\u0131l konteynerle\u015ftirece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Geli\u015ftirme, test ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi standartla\u015ft\u0131r\u0131n, verimlili\u011fi art\u0131r\u0131n. Bu rehber, Node.js ve Docker entegrasyonuna hakim olman\u0131z\u0131 sa\u011flayacak.","og_url":"https:\/\/fatihsoysal.com\/blog\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-30T05:21:36+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"28 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Giri\u015f: Node.js Uygulamalar\u0131 Neden Docker ile Konteynerle\u015ftirilmeli?","datePublished":"2025-10-30T05:21:36+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/"},"wordCount":4908,"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\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/","url":"https:\/\/fatihsoysal.com\/blog\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/","name":"Giri\u015f: Node.js Uygulamalar\u0131 Neden Docker ile Konteynerle\u015ftirilmeli?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-30T05:21:36+00:00","description":"Node.js uygulamalar\u0131n\u0131z\u0131 Docker ile nas\u0131l konteynerle\u015ftirece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin. Geli\u015ftirme, test ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi standartla\u015ft\u0131r\u0131n, verimlili\u011fi art\u0131r\u0131n. Bu rehber, Node.js ve Docker entegrasyonuna hakim olman\u0131z\u0131 sa\u011flayacak.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/giris-node-js-uygulamalari-neden-docker-ile-konteynerlestirilmeli\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Giri\u015f: Node.js Uygulamalar\u0131 Neden Docker ile Konteynerle\u015ftirilmeli?"}]},{"@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\/33149","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=33149"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33149\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33149"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33149"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33149"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}