{"id":33565,"date":"2025-11-04T12:31:49","date_gmt":"2025-11-04T09:31:49","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/"},"modified":"2025-11-04T12:31:49","modified_gmt":"2025-11-04T09:31:49","slug":"full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/","title":{"rendered":"Full-Stack Projelerde Docker A\u011f \u0130leti\u015fimi: Kapsay\u0131c\u0131 Ba\u011flant\u0131lar\u0131"},"content":{"rendered":"<p><body><\/p>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, full-stack uygulamalar\u0131 da\u011f\u0131tmak ve y\u00f6netmek, \u00f6zellikle mikroservis mimarileri yayg\u0131nla\u015ft\u0131k\u00e7a, karma\u015f\u0131k bir hale gelebiliyor. Bu karma\u015f\u0131kl\u0131\u011f\u0131n merkezinde ise farkl\u0131 uygulama bile\u015fenlerinin (\u00f6n y\u00fcz, arka y\u00fcz, veritaban\u0131, \u00f6nbellek gibi) birbiriyle nas\u0131l ileti\u015fim kuraca\u011f\u0131 sorunu yat\u0131yor. Docker, kapsay\u0131c\u0131la\u015ft\u0131rma teknolojisiyle bu s\u00fcreci b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirse de, kapsay\u0131c\u0131lar aras\u0131 a\u011f ileti\u015fimi bir\u00e7ok geli\u015ftirici i\u00e7in h\u00e2l\u00e2 bir soru i\u015fareti olabiliyor. Peki, Docker ile bir full-stack projesinin t\u00fcm par\u00e7alar\u0131n\u0131 sorunsuz bir \u015fekilde nas\u0131l ba\u011flar\u0131z ve uygulamalar\u0131m\u0131z\u0131n birbiriyle konu\u015fmas\u0131n\u0131 nas\u0131l sa\u011flar\u0131z?<\/p>\n<p>Docker, uygulamalar\u0131n\u0131z\u0131 izole edilmi\u015f, ta\u015f\u0131nabilir ve tutarl\u0131 ortamlarda \u00e7al\u0131\u015ft\u0131rman\u0131z\u0131 sa\u011flayan devrim niteli\u011finde bir platformdur. Her bir uygulama bile\u015feni (\u00f6rne\u011fin, bir Node.js API&#8217;si, bir React \u00f6n y\u00fcz\u00fc veya bir PostgreSQL veritaban\u0131) kendi ba\u011f\u0131ms\u0131z kapsay\u0131c\u0131s\u0131 i\u00e7inde \u00e7al\u0131\u015f\u0131r. Bu kapsay\u0131c\u0131lar, i\u015fletim sistemi seviyesinde izole edilmi\u015ftir; yani, bir kapsay\u0131c\u0131daki de\u011fi\u015fiklikler veya ba\u011f\u0131ml\u0131l\u0131klar, di\u011ferini do\u011frudan etkilemez. Ancak, bir full-stack uygulaman\u0131n par\u00e7alar\u0131 birbirinden tamamen izole ya\u015fayamaz; tam tersine, s\u00fcrekli olarak bilgi al\u0131\u015fveri\u015finde bulunmalar\u0131 gerekir. \u00d6rne\u011fin, bir \u00f6n y\u00fcz uygulamas\u0131n\u0131n arka y\u00fcz API&#8217;sine istek g\u00f6ndermesi, arka y\u00fcz\u00fcn ise bir veritaban\u0131na veri yazmas\u0131 veya okumas\u0131 gerekir. Bu noktada devreye Docker&#8217;\u0131n g\u00fc\u00e7l\u00fc a\u011f yetenekleri girer.<\/p>\n<p>Docker, her kapsay\u0131c\u0131ya sanal bir a\u011f aray\u00fcz\u00fc atar ve bu sayede kapsay\u0131c\u0131lar\u0131n birbirleriyle ve d\u0131\u015f d\u00fcnya ile ileti\u015fim kurmas\u0131n\u0131 sa\u011flar. Varsay\u0131lan olarak, Docker bir &#8220;bridge&#8221; a\u011f\u0131 olu\u015fturur ve yeni olu\u015fturulan kapsay\u0131c\u0131lar\u0131n \u00e7o\u011fu bu a\u011fa ba\u011flan\u0131r. Bu k\u00f6pr\u00fc a\u011f\u0131, kapsay\u0131c\u0131lar i\u00e7in \u00f6zel bir i\u00e7 a\u011f g\u00f6revi g\u00f6r\u00fcr. Her kapsay\u0131c\u0131 bu a\u011fda benzersiz bir IP adresi al\u0131r ve birbiriyle IP adresleri veya kapsay\u0131c\u0131 isimleri \u00fczerinden ileti\u015fim kurabilir. Ancak, sadece IP adresleriyle \u00e7al\u0131\u015fmak pratik de\u011fildir, \u00f6zellikle de kapsay\u0131c\u0131lar yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda IP adreslerinin de\u011fi\u015febilece\u011fi d\u00fc\u015f\u00fcn\u00fcl\u00fcrse. \u0130\u015fte bu y\u00fczden Docker, DNS servis ke\u015ffi mekanizmalar\u0131yla kapsay\u0131c\u0131 isimlerini IP adreslerine \u00e7evirme yetene\u011fi sunar, bu da uygulamalar aras\u0131 ileti\u015fimi \u00e7ok daha y\u00f6netilebilir hale getirir. Kapsay\u0131c\u0131lar\u0131n izole edilmi\u015f ortamlar\u0131, g\u00fcvenlik a\u00e7\u0131s\u0131ndan da \u00f6nemli avantajlar sunar; her servis yaln\u0131zca ihtiya\u00e7 duydu\u011fu a\u011f kaynaklar\u0131na eri\u015febilir ve potansiyel g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131n yay\u0131lmas\u0131n\u0131 engeller. Bu temel prensipler, Docker a\u011f\u0131n\u0131n karma\u015f\u0131k full-stack projelerde nas\u0131l bir omurga g\u00f6revi g\u00f6rd\u00fc\u011f\u00fcn\u00fc anlamak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h3>Docker A\u011f Modlar\u0131 Nelerdir?<\/h3>\n<p>Docker, farkl\u0131 ihtiya\u00e7lara y\u00f6nelik \u00e7e\u015fitli a\u011f s\u00fcr\u00fcc\u00fcleri (network drivers) sunar. Bu s\u00fcr\u00fcc\u00fcler, kapsay\u0131c\u0131lar\u0131n\u0131z\u0131n a\u011f davran\u0131\u015f\u0131n\u0131 ve izolasyon seviyesini belirler. Do\u011fru a\u011f modunu se\u00e7mek, uygulaman\u0131z\u0131n performans\u0131, g\u00fcvenli\u011fi ve \u00f6l\u00e7eklenebilirli\u011fi a\u00e7\u0131s\u0131ndan b\u00fcy\u00fck fark yaratabilir. Gelin, en yayg\u0131n kullan\u0131lan a\u011f modlar\u0131na daha yak\u0131ndan bakal\u0131m:<\/p>\n<ul>\n<li><strong>Bridge A\u011f\u0131 (Varsay\u0131lan):<\/strong> \u00c7o\u011fu tek sunuculu Docker uygulamas\u0131 i\u00e7in varsay\u0131lan ve en s\u0131k kullan\u0131lan a\u011f modudur. Docker, host \u00fczerinde sanal bir k\u00f6pr\u00fc (<code>docker0<\/code>) olu\u015fturur ve kapsay\u0131c\u0131lara bu k\u00f6pr\u00fc \u00fczerinden IP adresleri atar. Kapsay\u0131c\u0131lar, birbirleriyle isimleri (DNS \u00fczerinden) veya IP adresleri arac\u0131l\u0131\u011f\u0131yla ileti\u015fim kurabilir. D\u0131\u015f d\u00fcnyaya eri\u015fim i\u00e7in port y\u00f6nlendirme (port mapping) kullan\u0131l\u0131r. Kolay kurulumu ve iyi izolasyonu sayesinde k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli full-stack projeler i\u00e7in idealdir.<\/li>\n<li><strong>Host A\u011f\u0131:<\/strong> Bu modda kapsay\u0131c\u0131, kendi a\u011f y\u0131\u011f\u0131n\u0131 yerine Docker host&#8217;unun a\u011f y\u0131\u011f\u0131n\u0131n\u0131 do\u011frudan kullan\u0131r. Bu, kapsay\u0131c\u0131n\u0131n host ile ayn\u0131 a\u011f aray\u00fczlerini ve IP adresini payla\u015fmas\u0131 anlam\u0131na gelir. En y\u00fcksek a\u011f performans\u0131n\u0131 sunar \u00e7\u00fcnk\u00fc sanalla\u015ft\u0131rma katman\u0131 atlan\u0131r. Ancak, izolasyon seviyesi en d\u00fc\u015f\u00fckt\u00fcr ve ayn\u0131 port numaralar\u0131n\u0131 kullanan birden fazla kapsay\u0131c\u0131 \u00e7al\u0131\u015ft\u0131ramazs\u0131n\u0131z. Genellikle \u00e7ok y\u00fcksek performans gerektiren veya a\u011f yap\u0131land\u0131rmas\u0131n\u0131n \u00e7ok basit oldu\u011fu durumlarda tercih edilir.<\/li>\n<li><strong>None A\u011f\u0131:<\/strong> Kapsay\u0131c\u0131ya hi\u00e7bir a\u011f aray\u00fcz\u00fc atanmaz. Kapsay\u0131c\u0131 tamamen a\u011fdan izole olur ve d\u0131\u015f d\u00fcnya ile veya di\u011fer kapsay\u0131c\u0131larla ileti\u015fim kuramaz. Bu, genellikle g\u00fcvenlik testleri veya belirli bir g\u00f6revi internet eri\u015fimi olmadan yapmas\u0131 gereken kapsay\u0131c\u0131lar i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><strong>Overlay A\u011f\u0131:<\/strong> Birden fazla Docker host&#8217;u (makine) aras\u0131nda \u00e7al\u0131\u015fan kapsay\u0131c\u0131lar\u0131n birbiriyle ileti\u015fim kurmas\u0131n\u0131 sa\u011flayan bir a\u011f s\u00fcr\u00fcc\u00fcs\u00fcd\u00fcr. Docker Swarm veya Kubernetes gibi orkestrasyon ara\u00e7lar\u0131yla da\u011f\u0131t\u0131lm\u0131\u015f uygulamalar i\u00e7in vazge\u00e7ilmezdir. Overlay a\u011f\u0131, birden fazla sunucu \u00fczerindeki kapsay\u0131c\u0131lar\u0131 tek bir sanal a\u011fda birle\u015ftirir, b\u00f6ylece servis ke\u015ffi ve ileti\u015fim sorunsuz bir \u015fekilde ger\u00e7ekle\u015fir. B\u00fcy\u00fck \u00f6l\u00e7ekli, mikroservis tabanl\u0131 projelerde bu a\u011f modu hayati bir rol oynar.<\/li>\n<li><strong>Macvlan A\u011f\u0131:<\/strong> Kapsay\u0131c\u0131lara do\u011frudan fiziksel a\u011f aray\u00fcz\u00fc \u00fczerinden bir MAC adresi atar. Bu, kapsay\u0131c\u0131lar\u0131n fiziksel a\u011f \u00fczerinde ba\u011f\u0131ms\u0131z bir cihaz gibi g\u00f6r\u00fcnmesini sa\u011flar. Genellikle eski sistemlerle uyumluluk veya a\u011f y\u00f6neticilerinin belirli a\u011f yap\u0131land\u0131rmalar\u0131 istedi\u011fi senaryolarda kullan\u0131l\u0131r. Her kapsay\u0131c\u0131 kendi benzersiz IP adresine sahip olur ve a\u011fdaki di\u011fer fiziksel cihazlar taraf\u0131ndan g\u00f6r\u00fclebilir.<\/li>\n<\/ul>\n<p>Do\u011fru a\u011f s\u00fcr\u00fcc\u00fcs\u00fcn\u00fc se\u00e7mek, uygulaman\u0131z\u0131n gereksinimlerine ba\u011fl\u0131d\u0131r. Tek bir host \u00fczerinde \u00e7al\u0131\u015fan \u00e7o\u011fu full-stack proje i\u00e7in <code>bridge<\/code> a\u011f\u0131 yeterli ve \u00f6nerilen \u00e7\u00f6z\u00fcmd\u00fcr. Ancak da\u011f\u0131t\u0131k sistemlere ge\u00e7ildi\u011finde veya \u00f6zel a\u011f gereksinimleri oldu\u011funda <code>overlay<\/code> veya <code>macvlan<\/code> gibi di\u011fer s\u00fcr\u00fcc\u00fcler devreye girer. Her bir modun kendi avantajlar\u0131 ve dezavantajlar\u0131 vard\u0131r, bu y\u00fczden projenizin \u00f6l\u00e7e\u011fini, g\u00fcvenlik ihtiya\u00e7lar\u0131n\u0131 ve performans beklentilerini g\u00f6z \u00f6n\u00fcnde bulundurarak ak\u0131ll\u0131ca bir se\u00e7im yapmak \u00f6nemlidir.<\/p>\n<h2>Bridge A\u011f\u0131 ve Port Y\u00f6nlendirme: Geleneksel Yakla\u015f\u0131m<\/h2>\n<p>Docker&#8217;da kapsay\u0131c\u0131lar aras\u0131 ileti\u015fimin en temel ve yayg\u0131n yollar\u0131ndan biri, varsay\u0131lan <code>bridge<\/code> a\u011f\u0131n\u0131 kullanmak ve d\u0131\u015f d\u00fcnyaya a\u00e7\u0131lmas\u0131 gereken servisler i\u00e7in port y\u00f6nlendirme yapmakt\u0131r. Bu yakla\u015f\u0131m, \u00f6zellikle tek bir sunucu \u00fczerinde \u00e7al\u0131\u015fan full-stack uygulamalar i\u00e7in olduk\u00e7a etkilidir ve kurulumu kolayd\u0131r. <code>bridge<\/code> a\u011f\u0131, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, host i\u015fletim sistemi ile kapsay\u0131c\u0131lar aras\u0131nda bir k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr. Docker, her yeni kapsay\u0131c\u0131ya bu k\u00f6pr\u00fc a\u011f\u0131 i\u00e7inde benzersiz bir IP adresi atar. Kapsay\u0131c\u0131lar bu IP adresleri \u00fczerinden birbirleriyle do\u011frudan ileti\u015fim kurabilirler. Ancak, genellikle kapsay\u0131c\u0131lar\u0131n IP adreslerini ezberlemek veya y\u00f6netmek yerine, kapsay\u0131c\u0131 isimleri \u00fczerinden ileti\u015fim kurmak \u00e7ok daha pratiktir. Docker&#8217;\u0131n dahili DNS mekanizmas\u0131 sayesinde, ayn\u0131 <code>bridge<\/code> a\u011f\u0131na ba\u011fl\u0131 kapsay\u0131c\u0131lar birbirlerini isimleriyle \u00e7\u00f6z\u00fcmleyebilirler. \u00d6rne\u011fin, bir &#8220;veritaban\u0131&#8221; kapsay\u0131c\u0131s\u0131na &#8220;veritaban\u0131&#8221; ismiyle ba\u011flanabilirsiniz, IP adresini bilmenize gerek kalmaz.<\/p>\n<p>D\u0131\u015f d\u00fcnyadan kapsay\u0131c\u0131lara eri\u015fim sa\u011flamak i\u00e7in ise &#8220;port y\u00f6nlendirme&#8221; (port mapping) kullan\u0131l\u0131r. Bu, host makinedeki belirli bir portun, kapsay\u0131c\u0131 i\u00e7indeki belirli bir porta y\u00f6nlendirilmesi i\u015flemidir. \u00d6rne\u011fin, web sunucusu olarak \u00e7al\u0131\u015fan bir Nginx kapsay\u0131c\u0131s\u0131n\u0131n 80 portunu, host&#8217;un 8080 portuna y\u00f6nlendirebilirsiniz. B\u00f6ylece d\u0131\u015far\u0131dan <code>http:\/\/host-ip:8080<\/code> adresine yap\u0131lan istekler, asl\u0131nda kapsay\u0131c\u0131 i\u00e7indeki Nginx&#8217;in 80 portuna ula\u015f\u0131r. Bu, uygulaman\u0131z\u0131n \u00f6n y\u00fcz\u00fcne kullan\u0131c\u0131lar\u0131n eri\u015fmesini sa\u011flarken, arka y\u00fcz ve veritaban\u0131 gibi di\u011fer servislerin portlar\u0131n\u0131 do\u011frudan d\u0131\u015f d\u00fcnyaya a\u00e7madan g\u00fcvenli bir i\u00e7 ileti\u015fim a\u011f\u0131 kurman\u0131za olanak tan\u0131r. Bridge a\u011f\u0131, kapsay\u0131c\u0131lar\u0131n birbirinden izole \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flarken, ayn\u0131 zamanda kontroll\u00fc ve g\u00fcvenli bir ileti\u015fim kanal\u0131 olu\u015fturur. Bu mekanizma, bir full-stack projesinin farkl\u0131 bile\u015fenlerini bir araya getirirken hem esneklik hem de g\u00fcvenlik sa\u011flar.<\/p>\n<h3>Pratik Senaryo: Nginx, Node.js ve MongoDB Ba\u011flant\u0131s\u0131<\/h3>\n<p>\u015eimdi bu kavramlar\u0131 basit bir full-stack uygulamas\u0131 \u00fczerinden uygulamal\u0131 olarak g\u00f6relim. Senaryomuzda, bir Nginx web sunucusu (\u00f6n y\u00fcz statik dosyalar\u0131n\u0131 sunacak), bir Node.js API&#8217;si (arka y\u00fcz) ve bir MongoDB veritaban\u0131 bulunuyor. Bu \u00fc\u00e7 bile\u015feni ayr\u0131 Docker kapsay\u0131c\u0131lar\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131p, birbirleriyle ileti\u015fim kurmalar\u0131n\u0131 sa\u011flayaca\u011f\u0131z.<\/p>\n<p><strong>Ad\u0131m 1: MongoDB Kapsay\u0131c\u0131s\u0131n\u0131 Ba\u015flatma<\/strong><\/p>\n<p>\u00d6ncelikle veritaban\u0131 kapsay\u0131c\u0131m\u0131z\u0131 ba\u015flatal\u0131m. Bu kapsay\u0131c\u0131ya <code>mongodb<\/code> ad\u0131n\u0131 verece\u011fiz. Arka y\u00fcz uygulamam\u0131z bu isimle ona eri\u015febilecek.<\/p>\n<pre><code>\ndocker run -d --name mongodb -p 27017:27017 mongo:latest\n<\/pre>\n<p><\/code><\/p>\n<ul>\n<li><code>-d<\/code>: Kapsay\u0131c\u0131y\u0131 arka planda (detached mode) \u00e7al\u0131\u015ft\u0131r\u0131r.<\/li>\n<li><code>--name mongodb<\/code>: Kapsay\u0131c\u0131ya <code>mongodb<\/code> ad\u0131n\u0131 verir.<\/li>\n<li><code>-p 27017:27017<\/code>: Host'un 27017 portunu, kapsay\u0131c\u0131n\u0131n 27017 portuna y\u00f6nlendirir. Bu, d\u0131\u015far\u0131dan (\u00f6rne\u011fin bir GUI arac\u0131yla) veritaban\u0131na eri\u015fmek isterseniz kullan\u0131\u015fl\u0131d\u0131r. Node.js uygulamam\u0131z i\u00e7eriden eri\u015fece\u011fi i\u00e7in bu y\u00f6nlendirme do\u011frudan zorunlu de\u011fildir, ancak genellikle geli\u015ftirme ortamlar\u0131nda faydal\u0131d\u0131r.<\/li>\n<li><code>mongo:latest<\/code>: Kullan\u0131lacak Docker imaj\u0131n\u0131n ad\u0131d\u0131r.<\/li>\n<\/ul>\n<p><strong>Ad\u0131m 2: Node.js API Kapsay\u0131c\u0131s\u0131n\u0131 Ba\u015flatma<\/strong><\/p>\n<p>\u015eimdi Node.js arka y\u00fcz uygulamam\u0131z\u0131 \u00e7al\u0131\u015ft\u0131ral\u0131m. Bu uygulama MongoDB'ye ba\u011flanacak ve d\u0131\u015f d\u00fcnyaya (Nginx'e) hizmet verecek. Kapsay\u0131c\u0131m\u0131za <code>backend<\/code> ad\u0131n\u0131 verelim ve <code>mongodb<\/code> kapsay\u0131c\u0131s\u0131yla ayn\u0131 a\u011fda oldu\u011fundan emin olal\u0131m.<\/p>\n<pre><code>\ndocker run -d --name backend --network bridge -p 3000:3000 my-node-app:latest\n<\/pre>\n<p><\/code><\/p>\n<p>Node.js uygulaman\u0131z\u0131n kodunda MongoDB'ye ba\u011flan\u0131rken <code>mongodb:\/\/mongodb:27017\/my-database<\/code> gibi bir ba\u011flant\u0131 dizesi kullanman\u0131z gerekecektir. Docker, <code>mongodb<\/code> ad\u0131n\u0131 otomatik olarak MongoDB kapsay\u0131c\u0131s\u0131n\u0131n IP adresine \u00e7\u00f6z\u00fcmleyecektir. Burada <code>my-node-app:latest<\/code> yerine kendi Node.js uygulaman\u0131z\u0131n Docker imaj ad\u0131n\u0131 kullanmal\u0131s\u0131n\u0131z. \u0130maj\u0131 daha \u00f6nce build etti\u011finizi varsay\u0131yoruz.<\/p>\n<pre><code>\n\/\/ \u00d6rnek Node.js ba\u011flant\u0131 kodu (MongoDB i\u00e7in)\nconst mongoose = require('mongoose');\n\nmongoose.connect('mongodb:\/\/mongodb:27017\/my-database', {\n  useNewUrlParser: true,\n  useUnifiedTopology: true\n})\n.then(() => console.log('MongoDB\\'ye ba\u015far\u0131yla ba\u011fland\u0131!'))\n.catch(err => console.error('MongoDB ba\u011flant\u0131 hatas\u0131:', err));\n<\/pre>\n<p><\/code><\/p>\n<ul>\n<li><code>--network bridge<\/code>: Kapsay\u0131c\u0131y\u0131 varsay\u0131lan <code>bridge<\/code> a\u011f\u0131na ba\u011flar. (Zaten varsay\u0131lan oldu\u011fu i\u00e7in bu parametreyi kullanmasan\u0131z da ayn\u0131 etkiyi yarat\u0131r.)<\/li>\n<li><code>-p 3000:3000<\/code>: Host'un 3000 portunu, kapsay\u0131c\u0131n\u0131n 3000 portuna y\u00f6nlendirir. Bu sayede Nginx veya do\u011frudan taray\u0131c\u0131 \u00fczerinden Node.js API'sine eri\u015filebilir.<\/li>\n<\/ul>\n<p><strong>Ad\u0131m 3: Nginx Kapsay\u0131c\u0131s\u0131n\u0131 Ba\u015flatma (\u00d6n Y\u00fcz \u0130\u00e7in)<\/strong><\/p>\n<p>Son olarak, Nginx web sunucumuzu \u00e7al\u0131\u015ft\u0131r\u0131p statik React \u00f6n y\u00fcz dosyalar\u0131m\u0131z\u0131 sunal\u0131m. Nginx, Node.js API'sine istekleri y\u00f6nlendirmek i\u00e7in bir proxy g\u00f6revi g\u00f6recektir.<\/p>\n<pre><code>\ndocker run -d --name frontend -p 80:80 -v \/path\/to\/your\/react\/build:\/usr\/share\/nginx\/html:ro nginx:latest\n<\/pre>\n<p><\/code><\/p>\n<p>Nginx yap\u0131land\u0131rma dosyan\u0131zda (nginx.conf), Node.js arka y\u00fcz\u00fcne istekleri y\u00f6nlendirmek i\u00e7in a\u015fa\u011f\u0131daki gibi bir proxy ayar\u0131 yapman\u0131z gerekecektir:<\/p>\n<pre><code>\n# nginx.conf i\u00e7inden bir b\u00f6l\u00fcm\nserver {\n    listen 80;\n\n    location \/ {\n        root \/usr\/share\/nginx\/html;\n        try_files $uri $uri\/ \/index.html;\n    }\n\n    location \/api\/ {\n        proxy_pass http:\/\/backend:3000; # Node.js kapsay\u0131c\u0131s\u0131n\u0131n ismi\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<ul>\n<li><code>-v \/path\/to\/your\/react\/build:\/usr\/share\/nginx\/html:ro<\/code>: Kendi React uygulaman\u0131z\u0131n build edilmi\u015f dosyalar\u0131n\u0131n bulundu\u011fu host dizinini Nginx kapsay\u0131c\u0131s\u0131n\u0131n web k\u00f6k dizinine ba\u011flar. <code>ro<\/code> (read-only) sadece okuma izni verir.<\/li>\n<li><code>-p 80:80<\/code>: Host'un 80 portunu, kapsay\u0131c\u0131n\u0131n 80 portuna y\u00f6nlendirir. B\u00f6ylece taray\u0131c\u0131n\u0131zdan do\u011frudan host IP adresinize eri\u015ferek \u00f6n y\u00fcz uygulaman\u0131z\u0131 g\u00f6rebilirsiniz.<\/li>\n<\/ul>\n<p>Bu ad\u0131mlarla, her bir uygulaman\u0131z\u0131 ayr\u0131 kapsay\u0131c\u0131larda \u00e7al\u0131\u015ft\u0131rd\u0131n\u0131z ve Docker'\u0131n varsay\u0131lan <code>bridge<\/code> a\u011f\u0131 ile port y\u00f6nlendirmeyi kullanarak ba\u015far\u0131l\u0131 bir \u015fekilde birbirleriyle ileti\u015fim kurmalar\u0131n\u0131 sa\u011flad\u0131n\u0131z. Bu y\u00f6ntem, Docker a\u011f ileti\u015fiminin temelini olu\u015fturur ve bir\u00e7ok basit full-stack proje i\u00e7in yeterlidir. Ancak daha karma\u015f\u0131k veya \u00e7ok bile\u015fenli projelerde <code>docker-compose<\/code> gibi ara\u00e7lar devreye girerek bu s\u00fcreci \u00e7ok daha kolay ve y\u00f6netilebilir hale getirir.<\/p>\n<h2>Docker Compose ile Full-Stack A\u011f Yap\u0131land\u0131rmas\u0131: Orkestrasyonun G\u00fcc\u00fc<\/h2>\n<p>\u00d6nceki b\u00f6l\u00fcmde <code>docker run<\/code> komutlar\u0131yla tek tek kapsay\u0131c\u0131lar\u0131 nas\u0131l ba\u015flat\u0131p ba\u011flad\u0131\u011f\u0131m\u0131z\u0131 g\u00f6rd\u00fck. Bu y\u00f6ntem, birka\u00e7 kapsay\u0131c\u0131 i\u00e7in i\u015fe yarasa da, daha karma\u015f\u0131k full-stack projelerde onlarca kapsay\u0131c\u0131y\u0131 y\u00f6netmek, her birinin port y\u00f6nlendirmesini, a\u011f ayarlar\u0131n\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 manuel olarak belirtmek olduk\u00e7a yorucu ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7tir. \u0130\u015fte tam da bu noktada <code>Docker Compose<\/code> devreye giriyor. <code>Docker Compose<\/code>, \u00e7ok kapsay\u0131c\u0131l\u0131 Docker uygulamalar\u0131n\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\u0131rabilir, ard\u0131ndan tek bir komutla (<code>docker-compose up<\/code>) t\u00fcm uygulamay\u0131 ba\u015flatabilirsiniz. Bu, bir full-stack projenin t\u00fcm bile\u015fenlerini bir orkestra gibi y\u00f6netmenizi sa\u011flar.<\/p>\n<p><code>docker-compose.yml<\/code> dosyas\u0131, uygulaman\u0131z\u0131n blueprint'i gibidir. Bu dosya i\u00e7inde her bir servis i\u00e7in kullan\u0131lacak Docker imaj\u0131n\u0131, hangi portlar\u0131n a\u00e7\u0131laca\u011f\u0131n\u0131, hangi a\u011flara ba\u011flanaca\u011f\u0131n\u0131, hangi ortam de\u011fi\u015fkenlerinin ayarlanaca\u011f\u0131n\u0131 ve di\u011fer servislerle olan ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 tan\u0131mlars\u0131n\u0131z. <code>Docker Compose<\/code>'un en b\u00fcy\u00fck avantajlar\u0131ndan biri, varsay\u0131lan olarak t\u00fcm servisleri \u00f6zel bir bridge a\u011f\u0131na ba\u011flamas\u0131d\u0131r. Bu sayede servisler, birbirlerini isimleriyle \u00e7\u00f6z\u00fcmleyebilirler. \u00d6rne\u011fin, bir \"web\" servisi, \"api\" servisine <code>http:\/\/api:3000<\/code> adresi \u00fczerinden do\u011frudan eri\u015febilir. Bu DNS tabanl\u0131 servis ke\u015ffi, manuel IP y\u00f6netimi sorununu tamamen ortadan kald\u0131r\u0131r ve uygulaman\u0131z\u0131n bile\u015fenleri aras\u0131nda esnek bir ileti\u015fim ortam\u0131 yarat\u0131r.<\/p>\n<p><code>docker-compose<\/code> ayr\u0131ca servislerin ba\u015flang\u0131\u00e7 s\u0131ralamas\u0131n\u0131 y\u00f6netmek i\u00e7in <code>depends_on<\/code> gibi mekanizmalar sunar (ancak bu sadece ba\u015flang\u0131\u00e7 s\u0131ras\u0131n\u0131 garanti eder, servisin tamamen haz\u0131r olmas\u0131n\u0131 de\u011fil). Daha sa\u011flam ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimi i\u00e7in uygulamalar\u0131n servislerin haz\u0131r olmas\u0131n\u0131 beklemesi gereken \"sa\u011fl\u0131k kontrolleri\" (health checks) tan\u0131mlamak \u00f6nemlidir. K\u0131sacas\u0131, <code>Docker Compose<\/code>, full-stack projeler i\u00e7in kapsay\u0131c\u0131la\u015ft\u0131rmay\u0131 bir sonraki seviyeye ta\u015f\u0131yan, geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftiren g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Onunla, karma\u015f\u0131k uygulamalar\u0131n\u0131z\u0131 tek bir \u00e7at\u0131 alt\u0131nda tan\u0131mlay\u0131p, tutarl\u0131 ve tekrarlanabilir bir \u015fekilde y\u00f6netebilirsiniz.<\/p>\n<h3>Uygulamal\u0131 \u00d6rnek: Docker Compose ile Full-Stack Uygulama<\/h3>\n<p>\u00d6nceki \u00f6rne\u011fimizdeki Nginx, Node.js ve MongoDB uygulamas\u0131n\u0131 \u015fimdi <code>docker-compose.yml<\/code> kullanarak yap\u0131land\u0131ral\u0131m. Bu, uygulaman\u0131z\u0131n t\u00fcm par\u00e7alar\u0131n\u0131 tek bir yerde tan\u0131mlaman\u0131n ve y\u00f6netmenin ne kadar kolay oldu\u011funu g\u00f6sterecek.<\/p>\n<p>Proje dizininizde bir <code>docker-compose.yml<\/code> dosyas\u0131 olu\u015fturun:<\/p>\n<pre><code>\nversion: '3.8'\n\nservices:\n  mongodb:\n    image: mongo:latest\n    container_name: mongodb_container\n    ports:\n      - \"27017:27017\" # Sadece d\u0131\u015far\u0131dan eri\u015fim i\u00e7in, Node.js i\u00e7eriden eri\u015fecek\n    volumes:\n      - mongodb_data:\/data\/db\n    networks:\n      - my_app_network\n\n  backend:\n    build: .\/backend # Node.js uygulaman\u0131z\u0131n Dockerfile'\u0131n\u0131n oldu\u011fu dizin\n    container_name: backend_container\n    ports:\n      - \"3000:3000\"\n    environment:\n      MONGO_URI: \"mongodb:\/\/mongodb:27017\/my-database\" # Hostname olarak servis ad\u0131 kullan\u0131l\u0131r\n    depends_on:\n      - mongodb # mongodb servisi ba\u015flamadan backend ba\u015flamaz\n    networks:\n      - my_app_network\n\n  frontend:\n    build: .\/frontend # Nginx ve React uygulaman\u0131z\u0131n Dockerfile'\u0131n\u0131n oldu\u011fu dizin\n    container_name: frontend_container\n    ports:\n      - \"80:80\"\n    depends_on:\n      - backend # backend servisi ba\u015flamadan frontend ba\u015flamaz (proxy i\u00e7in)\n    networks:\n      - my_app_network\n\nnetworks:\n  my_app_network:\n    driver: bridge # \u00d6zel bir bridge a\u011f\u0131 tan\u0131mlar\u0131z\n\nvolumes:\n  mongodb_data: # MongoDB verilerinin kal\u0131c\u0131 depolanmas\u0131 i\u00e7in volume\n<\/pre>\n<p><\/code><\/p>\n<p><strong>A\u00e7\u0131klamalar:<\/strong><\/p>\n<ul>\n<li><code>version: '3.8'<\/code>: Compose dosyas\u0131n\u0131n versiyonunu belirtir.<\/li>\n<li><code>services<\/code>: Uygulaman\u0131zdaki her bir bile\u015feni (kapsay\u0131c\u0131y\u0131) tan\u0131mlad\u0131\u011f\u0131n\u0131z ana b\u00f6l\u00fcmd\u00fcr.<\/li>\n<li><strong>mongodb:<\/strong>\n<ul>\n<li><code>image: mongo:latest<\/code>: MongoDB i\u00e7in Docker Hub'daki resmi imaj\u0131 kullan\u0131r.<\/li>\n<li><code>container_name: mongodb_container<\/code>: Kapsay\u0131c\u0131ya okunabilir bir isim verir.<\/li>\n<li><code>ports: - \"27017:27017\"<\/code>: Host'un 27017 portunu kapsay\u0131c\u0131n\u0131n 27017 portuna y\u00f6nlendirir.<\/li>\n<li><code>volumes: - mongodb_data:\/data\/db<\/code>: MongoDB verilerini kal\u0131c\u0131 olarak saklamak i\u00e7in bir Docker volume'u kullan\u0131r. Bu sayede kapsay\u0131c\u0131 silinse bile verileriniz kaybolmaz.<\/li>\n<li><code>networks: - my_app_network<\/code>: Bu servisi \u00f6zel olarak tan\u0131mlad\u0131\u011f\u0131m\u0131z <code>my_app_network<\/code> a\u011f\u0131na ba\u011flar.<\/li>\n<\/ul>\n<\/li>\n<li><strong>backend:<\/strong>\n<ul>\n<li><code>build: .\/backend<\/code>: Mevcut dizindeki <code>backend<\/code> klas\u00f6r\u00fcnde bulunan <code>Dockerfile<\/code>'\u0131 kullanarak bir imaj olu\u015fturur. Bu, Node.js uygulaman\u0131z\u0131n Docker imaj\u0131n\u0131 sizin olu\u015fturaca\u011f\u0131n\u0131z anlam\u0131na gelir.<\/li>\n<li><code>environment: MONGO_URI: \"mongodb:\/\/mongodb:27017\/my-database\"<\/code>: Ortam de\u011fi\u015fkeni ayarlar. Node.js uygulaman\u0131zda bu de\u011fi\u015fkeni okuyarak MongoDB'ye ba\u011flanabilirsiniz. Dikkat edin, host olarak <code>mongodb<\/code> servis ad\u0131n\u0131 kullan\u0131yoruz. Docker Compose, bu ad\u0131 otomatik olarak MongoDB kapsay\u0131c\u0131s\u0131n\u0131n IP adresine \u00e7\u00f6z\u00fcmleyecektir.<\/li>\n<li><code>depends_on: - mongodb<\/code>: <code>backend<\/code> servisi ba\u015flamadan \u00f6nce <code>mongodb<\/code> servisinin ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flar. Bu sadece ba\u015flang\u0131\u00e7 s\u0131ras\u0131n\u0131 garanti eder.<\/li>\n<li><code>networks: - my_app_network<\/code>: Backend servisini de ayn\u0131 \u00f6zel a\u011fa ba\u011flar.<\/li>\n<\/ul>\n<\/li>\n<li><strong>frontend:<\/strong>\n<ul>\n<li><code>build: .\/frontend<\/code>: <code>frontend<\/code> klas\u00f6r\u00fcndeki <code>Dockerfile<\/code>'\u0131 kullanarak bir Nginx\/React imaj\u0131 olu\u015fturur.<\/li>\n<li><code>ports: - \"80:80\"<\/code>: \u00d6n y\u00fcz uygulaman\u0131z\u0131n d\u0131\u015far\u0131dan eri\u015filebilir olmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><code>depends_on: - backend<\/code>: Frontend'in backend'e ba\u011f\u0131ml\u0131 oldu\u011funu belirtir.<\/li>\n<li><code>networks: - my_app_network<\/code>: Frontend servisini de ayn\u0131 \u00f6zel a\u011fa ba\u011flar.<\/li>\n<\/ul>\n<\/li>\n<li><code>networks: my_app_network: driver: bridge<\/code>: Uygulamam\u0131z i\u00e7in \u00f6zel bir <code>bridge<\/code> a\u011f\u0131 tan\u0131mlar. Bu, t\u00fcm servislerin birbiriyle izole ve isimleriyle ileti\u015fim kurmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><code>volumes: mongodb_data:<\/code>: Kullan\u0131lacak Docker volume'unu tan\u0131mlar.<\/li>\n<\/ul>\n<div class=\"uzman-ipucu\">\n  Uzman \u0130pucu: <code>depends_on<\/code> sadece kapsay\u0131c\u0131lar\u0131n ba\u015flat\u0131lma s\u0131ras\u0131n\u0131 garanti eder, servisin ger\u00e7ekten \"haz\u0131r\" oldu\u011fu anlam\u0131na gelmez. \u00d6zellikle veritabanlar\u0131 veya API'ler i\u00e7in, uygulaman\u0131z\u0131n i\u00e7erisinde servislerin haz\u0131r olup olmad\u0131\u011f\u0131n\u0131 kontrol eden mekanizmalar (\u00f6rne\u011fin, bir ba\u011flant\u0131 d\u00f6ng\u00fcs\u00fc veya sa\u011fl\u0131k kontrol\u00fc) bulundurmak, daha sa\u011flam bir ba\u015flang\u0131\u00e7 s\u00fcreci sa\u011flar. Docker Compose ayr\u0131ca <code>healthcheck<\/code> direktifi ile servislerin sa\u011fl\u0131k durumunu izlemenize olanak tan\u0131r.\n<\/div>\n<p><strong>\u00c7al\u0131\u015ft\u0131rma:<\/strong><\/p>\n<p><code>docker-compose.yml<\/code> dosyas\u0131n\u0131 kaydettikten sonra, ayn\u0131 dizinde terminali a\u00e7\u0131n ve a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code>\ndocker-compose up -d\n<\/pre>\n<p><\/code><\/p>\n<ul>\n<li><code>up<\/code>: <code>docker-compose.yml<\/code> dosyas\u0131nda tan\u0131mlanan t\u00fcm servisleri olu\u015fturur ve ba\u015flat\u0131r.<\/li>\n<li><code>-d<\/code>: Servisleri arka planda \u00e7al\u0131\u015ft\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Uygulaman\u0131z art\u0131k \u00e7al\u0131\u015f\u0131yor olmal\u0131! Taray\u0131c\u0131n\u0131zdan <code>http:\/\/localhost<\/code> adresine giderek \u00f6n y\u00fcz uygulaman\u0131z\u0131 g\u00f6rebilirsiniz. T\u00fcm servisler kendi \u00f6zel a\u011flar\u0131nda birbiriyle konu\u015fuyor olacak.<\/p>\n<p><strong>Durdurma ve Temizleme:<\/strong><\/p>\n<p>Uygulamay\u0131 durdurmak ve olu\u015fturulan t\u00fcm kapsay\u0131c\u0131lar\u0131, a\u011flar\u0131 ve (varsay\u0131lan olarak) volume'leri kald\u0131rmak i\u00e7in:<\/p>\n<pre><code>\ndocker-compose down\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komut, full-stack uygulaman\u0131z\u0131n t\u00fcm bile\u015fenlerini temiz bir \u015fekilde kapat\u0131r. <code>Docker Compose<\/code> ile bu kadar kolayl\u0131kla karma\u015f\u0131k uygulamalar\u0131 y\u00f6netebilirsiniz. Bu, geli\u015ftirme, test ve hatta k\u00fc\u00e7\u00fck \u00f6l\u00e7ekli \u00fcretim ortamlar\u0131nda inan\u0131lmaz bir kolayl\u0131k sa\u011flar.<\/p>\n<h2>\u0130leri D\u00fczey A\u011f Konfig\u00fcrasyonlar\u0131 ve G\u00fcvenlik \u0130pu\u00e7lar\u0131<\/h2>\n<p>Docker a\u011f ileti\u015fimi sadece varsay\u0131lan <code>bridge<\/code> a\u011f\u0131 ve <code>docker-compose<\/code> ile s\u0131n\u0131rl\u0131 de\u011fildir. Daha karma\u015f\u0131k senaryolar, daha fazla kontrol ve g\u00fcvenlik gerektiren durumlar i\u00e7in Docker geli\u015fmi\u015f konfig\u00fcrasyon se\u00e7enekleri sunar. Bu b\u00f6l\u00fcmde, \u00f6zel a\u011flar\u0131n olu\u015fturulmas\u0131ndan, a\u011f g\u00fcvenli\u011fine ve performans ipu\u00e7lar\u0131na kadar baz\u0131 ileri d\u00fczey konulara de\u011finece\u011fiz.<\/p>\n<h3>\u00d6zel Bridge A\u011flar\u0131 Olu\u015fturma ve Y\u00f6netme<\/h3>\n<p>Yukar\u0131daki <code>docker-compose<\/code> \u00f6rne\u011finde g\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, kendi \u00f6zel <code>bridge<\/code> a\u011flar\u0131n\u0131z\u0131 olu\u015fturmak, kapsay\u0131c\u0131lar\u0131n\u0131z i\u00e7in daha iyi bir izolasyon ve organizasyon sa\u011flar. Her bir uygulama y\u0131\u011f\u0131n\u0131 (\u00f6rne\u011fin, bir microservice grubu) i\u00e7in ayr\u0131 bir a\u011f tan\u0131mlayabilirsiniz. Bu, bir a\u011fdaki trafik ve olas\u0131 g\u00fcvenlik sorunlar\u0131n\u0131n di\u011fer a\u011flara s\u0131\u00e7ramas\u0131n\u0131 engeller. Manuel olarak bir \u00f6zel a\u011f olu\u015fturmak i\u00e7in:<\/p>\n<pre><code>\ndocker network create --driver bridge my_custom_network\n<\/pre>\n<p><\/code><\/p>\n<p>Ard\u0131ndan, kapsay\u0131c\u0131lar\u0131 bu a\u011fa ba\u011flayabilirsiniz:<\/p>\n<pre><code>\ndocker run -d --name my_app_container --network my_custom_network my_app_image:latest\n<\/pre>\n<p><\/code><\/p>\n<p>Bu, <code>docker-compose<\/code> dosyas\u0131nda <code>networks<\/code> anahtar\u0131n\u0131 kullanarak yapt\u0131\u011f\u0131m\u0131z i\u015flemin manuel kar\u015f\u0131l\u0131\u011f\u0131d\u0131r. B\u00fcy\u00fck projelerde, farkl\u0131 microservice gruplar\u0131n\u0131 farkl\u0131 \u00f6zel a\u011flara yerle\u015ftirmek, a\u011f trafi\u011fini daha iyi anlaman\u0131za ve y\u00f6netmenize yard\u0131mc\u0131 olur.<\/p>\n<h3>A\u011f G\u00fcvenli\u011fi: Kapsay\u0131c\u0131 \u0130zolasyonundan Fazlas\u0131<\/h3>\n<p>Docker'\u0131n kapsay\u0131c\u0131 izolasyonu, varsay\u0131lan olarak bir g\u00fcvenlik katman\u0131 sa\u011flar. Ancak, \u00f6zellikle d\u0131\u015f d\u00fcnyaya a\u00e7\u0131k portlar s\u00f6z konusu oldu\u011funda ek g\u00fcvenlik \u00f6nlemleri almak \u00f6nemlidir. Host \u00fczerindeki g\u00fcvenlik duvar\u0131 (firewall) kurallar\u0131n\u0131 kullanarak sadece belirli IP adreslerinden veya belirli portlara eri\u015fime izin vermek kritik bir ad\u0131md\u0131r. \u00d6rne\u011fin, sadece belirli bir IP adresinden uygulaman\u0131z\u0131n 80 portuna eri\u015fime izin verebilirsiniz.<\/p>\n<p>Ayr\u0131ca, kapsay\u0131c\u0131lar\u0131n sadece ihtiya\u00e7 duyduklar\u0131 portlar\u0131 d\u0131\u015f d\u00fcnyaya a\u00e7t\u0131\u011f\u0131ndan emin olun. Geli\u015ftirme s\u0131ras\u0131nda kulland\u0131\u011f\u0131n\u0131z veritaban\u0131 portlar\u0131n\u0131 (\u00f6rne\u011fin 27017 veya 5432) \u00fcretimde d\u0131\u015f d\u00fcnyaya a\u00e7maktan ka\u00e7\u0131n\u0131n. Bu portlar genellikle sadece arka y\u00fcz servisleriniz taraf\u0131ndan i\u00e7 a\u011fdan eri\u015filmelidir. Uygulama i\u00e7i kimlik do\u011frulama, API anahtarlar\u0131 ve HTTPS kullan\u0131m\u0131 gibi standart web g\u00fcvenlik uygulamalar\u0131, Docker a\u011f yap\u0131land\u0131rmas\u0131ndan ba\u011f\u0131ms\u0131z olarak her zaman uygulanmal\u0131d\u0131r.<\/p>\n<p>A\u011f segmentasyonu, \u00f6zellikle mikroservis mimarilerinde, farkl\u0131 servis gruplar\u0131n\u0131 farkl\u0131 a\u011flara yerle\u015ftirerek olas\u0131 sald\u0131r\u0131 y\u00fczeyini k\u00fc\u00e7\u00fcltmenin bir yoludur. \u00d6rne\u011fin, veritaban\u0131 kapsay\u0131c\u0131lar\u0131n\u0131 sadece backend servislerinin eri\u015febilece\u011fi ayr\u0131 bir \"db-network\" a\u011f\u0131na koyabilirsiniz. Bu, frontend veya gateway servislerinin do\u011frudan veritaban\u0131na eri\u015fmesini engeller, b\u00f6ylece potansiyel g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 azalt\u0131r.<\/p>\n<h3>Performans \u0130pu\u00e7lar\u0131 ve Mobil Uyumluluk<\/h3>\n<p>Docker a\u011f performans\u0131n\u0131 optimize etmek i\u00e7in baz\u0131 ipu\u00e7lar\u0131 bulunmaktad\u0131r. \u00d6rne\u011fin, e\u011fer geli\u015ftirme yap\u0131yorsan\u0131z ve kapsay\u0131c\u0131lar aras\u0131ndaki gecikmeler sizi etkiliyorsa, Mac veya Windows \u00fczerinde <code>host.docker.internal<\/code> DNS ad\u0131n\u0131 kullanarak host makinesindeki servislere eri\u015febilirsiniz. Bu, host'unuzun IP adresini otomatik olarak \u00e7\u00f6z\u00fcmleyerek host'taki bir veritaban\u0131na veya ba\u015fka bir servise ba\u011flanman\u0131z\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<pre><code>\n\/\/ Host'taki bir servise ba\u011flan\u0131rken\nconst DB_HOST = process.env.DB_HOST || 'host.docker.internal';\n\/\/ \u00d6rne\u011fin, 'host.docker.internal:5432'\n<\/pre>\n<p><\/code><\/p>\n<p>\u00d6zellikle Windows ve macOS'ta Docker Desktop sanal bir makine \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in a\u011f performans\u0131 Linux host'lar\u0131na g\u00f6re farkl\u0131l\u0131k g\u00f6sterebilir. B\u00fcy\u00fck dosya transferleri veya yo\u011fun a\u011f trafi\u011fi olan uygulamalar i\u00e7in bu durum g\u00f6z \u00f6n\u00fcnde bulundurulmal\u0131d\u0131r.<\/p>\n<p>Mobil uyumluluk ise genellikle front-end geli\u015ftirme alan\u0131na girse de, Docker kapsay\u0131c\u0131n\u0131zda \u00e7al\u0131\u015fan bir web uygulamas\u0131n\u0131n mobil cihazlarda d\u00fczg\u00fcn g\u00f6r\u00fcnt\u00fclenmesi i\u00e7in responsive tasar\u0131m prensiplerini uygulaman\u0131z gerekir. Bu, CSS medya sorgular\u0131 (media queries) kullan\u0131larak farkl\u0131 ekran boyutlar\u0131na g\u00f6re stil de\u011fi\u015fiklikleri yapmay\u0131 i\u00e7erir. Docker burada sadece uygulaman\u0131z\u0131 sunan bir platform g\u00f6revi g\u00f6r\u00fcrken, uygulaman\u0131n kendisi mobil uyumlu olmal\u0131d\u0131r.<\/p>\n<pre><code>\n\/* CSS dosyas\u0131nda medya sorgusu \u00f6rne\u011fi *\/\n\/* Mobil cihazlar i\u00e7in \u00f6zel stil kurallar\u0131 *\/\n@media (max-width: 768px) {\n    .navbar {\n        flex-direction: column; \/* Men\u00fc \u00f6\u011felerini alt alta s\u0131rala *\/\n        align-items: flex-start;\n    }\n    .main-content {\n        padding: 10px;\n    }\n}\n\n\/* K\u00fc\u00e7\u00fck tabletler ve masa\u00fcst\u00fc bilgisayarlar i\u00e7in *\/\n@media (min-width: 769px) and (max-width: 1024px) {\n    .sidebar {\n        width: 200px;\n    }\n}\n\n\/* B\u00fcy\u00fck ekranlar i\u00e7in *\/\n@media (min-width: 1025px) {\n    .container {\n        max-width: 1200px;\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki CSS medya sorgusu \u00f6rne\u011fi, bir web uygulamas\u0131n\u0131n farkl\u0131 cihaz ekran boyutlar\u0131na nas\u0131l uyum sa\u011flayabilece\u011fini g\u00f6sterir. Bu CSS, Nginx kapsay\u0131c\u0131n\u0131z (veya hangi kapsay\u0131c\u0131n\u0131n statik dosyalar\u0131n\u0131z\u0131 sundu\u011fu) taraf\u0131ndan sunulur ve taray\u0131c\u0131 taraf\u0131ndan yorumlanarak uygulaman\u0131z\u0131n mobil uyumlu g\u00f6r\u00fcnmesini sa\u011flar. Docker, bu responsive uygulaman\u0131n kapsay\u0131c\u0131 i\u00e7inde sorunsuz bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 ve kullan\u0131c\u0131lara sunulmas\u0131n\u0131 sa\u011flayan temel altyap\u0131d\u0131r. Geli\u015fmi\u015f Docker a\u011f konfig\u00fcrasyonlar\u0131, projenizin \u00f6zel ihtiya\u00e7lar\u0131na g\u00f6re esneklik ve g\u00fcvenlik sa\u011flarken, performans ipu\u00e7lar\u0131 ve mobil uyumluluk gibi di\u011fer fakt\u00f6rler de tam bir geli\u015ftirme deneyimi i\u00e7in g\u00f6z ard\u0131 edilmemelidir.<\/p>\n<h2>Vaka Analizi: B\u00fcy\u00fck \u00d6l\u00e7ekli Bir Mikroservis Uygulamas\u0131nda Docker A\u011f \u0130leti\u015fimi<\/h2>\n<p>\u015eimdi daha karma\u015f\u0131k, ger\u00e7ek d\u00fcnya bir senaryoya odaklanal\u0131m: b\u00fcy\u00fck \u00f6l\u00e7ekli bir e-ticaret platformu. Bu platform, monolitik bir yap\u0131 yerine mikroservis mimarisini benimsiyor ve her biri kendi Docker kapsay\u0131c\u0131s\u0131nda \u00e7al\u0131\u015fan \u00e7e\u015fitli ba\u011f\u0131ms\u0131z servislerden olu\u015fuyor. Amac\u0131m\u0131z, bu servislerin birbiriyle g\u00fcvenli ve verimli bir \u015fekilde ileti\u015fim kurmas\u0131n\u0131 sa\u011flamak, ayn\u0131 zamanda d\u0131\u015f d\u00fcnyadan gelen isteklere yan\u0131t verebilmesini temin etmek. Bu senaryo, Docker'\u0131n ileri d\u00fczey a\u011f yeteneklerinin ne kadar kritik oldu\u011funu net bir \u015fekilde ortaya koyacakt\u0131r.<\/p>\n<p><strong>Uygulama Mimarisi:<\/strong><\/p>\n<p>E-ticaret platformumuzun temel bile\u015fenleri \u015funlar:<\/p>\n<ul>\n<li><strong>API Gateway:<\/strong> D\u0131\u015f d\u00fcnyadan gelen t\u00fcm istekleri kar\u015f\u0131lar ve ilgili mikroservislere y\u00f6nlendirir.<\/li>\n<li><strong>Kullan\u0131c\u0131 Servisi:<\/strong> Kullan\u0131c\u0131 kayd\u0131, giri\u015fi ve profil y\u00f6netimi gibi i\u015flemlerden sorumlu.<\/li>\n<li><strong>\u00dcr\u00fcn Servisi:<\/strong> \u00dcr\u00fcn katalogu, stok y\u00f6netimi, \u00fcr\u00fcn detaylar\u0131 gibi i\u015flevleri sa\u011flar.<\/li>\n<li><strong>Sipari\u015f Servisi:<\/strong> Sipari\u015f olu\u015fturma, takibi ve y\u00f6netimi.<\/li>\n<li><strong>\u00d6deme Servisi:<\/strong> Kredi kart\u0131 i\u015flemleri, \u00f6deme entegrasyonlar\u0131.<\/li>\n<li><strong>Veritabanlar\u0131 (MongoDB, PostgreSQL):<\/strong> Her servis kendi veritaban\u0131n\u0131 kullanabilir veya payla\u015f\u0131ml\u0131 veritabanlar\u0131 olabilir. Bu senaryoda her servis kendi veritaban\u0131na sahip.<\/li>\n<li><strong>\u00d6nbellek (Redis):<\/strong> H\u0131zl\u0131 veri eri\u015fimi i\u00e7in kullan\u0131l\u0131r.<\/li>\n<\/ul>\n<p><strong>A\u011f Tasar\u0131m\u0131 Kararlar\u0131:<\/strong><\/p>\n<p>Bu karma\u015f\u0131k yap\u0131da t\u00fcm servisleri tek bir varsay\u0131lan bridge a\u011f\u0131na atmak, hem g\u00fcvenlik hem de y\u00f6netilebilirlik a\u00e7\u0131s\u0131ndan uygun de\u011fildir. Bunun yerine, \u00f6zel Docker a\u011flar\u0131 olu\u015fturarak segmentasyon uygulayaca\u011f\u0131z:<\/p>\n<ol>\n<li><strong><code>public-gateway-network<\/code>:<\/strong>\n<ul>\n<li>Bu a\u011fa sadece API Gateway kapsay\u0131c\u0131s\u0131 ba\u011flan\u0131r.<\/li>\n<li>D\u0131\u015f d\u00fcnyaya a\u00e7\u0131k tek port (genellikle 80\/443) bu a\u011f \u00fczerinden API Gateway'e y\u00f6nlendirilir.<\/li>\n<li>Bu, uygulaman\u0131n d\u0131\u015far\u0131ya a\u00e7\u0131k y\u00fczeyini minimumda tutar ve olas\u0131 sald\u0131r\u0131 noktalar\u0131n\u0131 azalt\u0131r.<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>backend-services-network<\/code>:<\/strong>\n<ul>\n<li>Kullan\u0131c\u0131, \u00dcr\u00fcn, Sipari\u015f ve \u00d6deme servisleri gibi t\u00fcm uygulama mikroservisleri bu a\u011fa ba\u011flan\u0131r.<\/li>\n<li>API Gateway de bu a\u011fa ba\u011flan\u0131r, b\u00f6ylece mikroservislere isimleri \u00fczerinden eri\u015febilir (\u00f6rn. <code>http:\/\/user-service:3001\/users<\/code>).<\/li>\n<li>Bu a\u011fdaki servisler birbirleriyle do\u011frudan konu\u015fabilir ancak d\u0131\u015f d\u00fcnyaya a\u00e7\u0131k de\u011fildirler.<\/li>\n<li>\u00d6nbellek servisi (Redis) de performans i\u00e7in bu a\u011fa ba\u011flan\u0131r.<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>database-network<\/code>:<\/strong>\n<ul>\n<li>MongoDB ve PostgreSQL gibi t\u00fcm veritaban\u0131 servisleri bu a\u011fa ba\u011flan\u0131r.<\/li>\n<li>Sadece ilgili mikroservisler (\u00f6rne\u011fin, Kullan\u0131c\u0131 Servisi -> Kullan\u0131c\u0131 Veritaban\u0131) bu a\u011fa ba\u011flanabilir. Di\u011fer servislerin bu a\u011fa eri\u015fimi yoktur.<\/li>\n<li>Bu, veritaban\u0131 katman\u0131na ekstra bir g\u00fcvenlik ve izolasyon katman\u0131 ekler.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><strong><code>docker-compose.yml<\/code> Tasla\u011f\u0131 (Basit \u00d6rnekleme):<\/strong><\/p>\n<p>Bu senaryoyu tam olarak yans\u0131tacak bir <code>docker-compose.yml<\/code> dosyas\u0131 olduk\u00e7a uzun olacakt\u0131r. Ancak temel yap\u0131y\u0131 a\u015fa\u011f\u0131daki gibi hayal edebiliriz:<\/p>\n<pre><code>\nversion: '3.8'\n\nservices:\n  api-gateway:\n    build: .\/api-gateway\n    ports:\n      - \"80:80\"\n    networks:\n      - public-gateway-network\n      - backend-services-network # Backend servislerine eri\u015fmek i\u00e7in\n    depends_on:\n      - user-service\n      - product-service\n      # ... di\u011fer servisler\n\n  user-service:\n    build: .\/user-service\n    environment:\n      DB_HOST: user-db\n    networks:\n      - backend-services-network\n      - database-network # Kendi veritaban\u0131na eri\u015fmek i\u00e7in\n    depends_on:\n      - user-db\n\n  user-db:\n    image: postgres:13\n    volumes:\n      - user_db_data:\/var\/lib\/postgresql\/data\n    networks:\n      - database-network\n\n  product-service:\n    build: .\/product-service\n    environment:\n      DB_HOST: product-db\n    networks:\n      - backend-services-network\n      - database-network\n    depends_on:\n      - product-db\n\n  product-db:\n    image: mongo:latest\n    volumes:\n      - product_db_data:\/data\/db\n    networks:\n      - database-network\n\n  redis-cache:\n    image: redis:latest\n    networks:\n      - backend-services-network\n\nnetworks:\n  public-gateway-network:\n    driver: bridge\n  backend-services-network:\n    driver: bridge\n  database-network:\n    driver: bridge\n\nvolumes:\n  user_db_data:\n  product_db_data:\n<\/pre>\n<p><\/code><\/p>\n<p><strong>Bu Yap\u0131n\u0131n Avantajlar\u0131:<\/strong><\/p>\n<ul>\n<li><strong>G\u00fcvenlik:<\/strong> Veritabanlar\u0131 ve i\u00e7 servisler d\u0131\u015f d\u00fcnyadan tamamen izole edilmi\u015ftir. Sadece API Gateway, belirli bir port \u00fczerinden d\u0131\u015far\u0131ya a\u00e7\u0131kt\u0131r. A\u011f segmentasyonu sayesinde, bir serviste ya\u015fanabilecek g\u00fcvenlik a\u00e7\u0131\u011f\u0131 di\u011fer a\u011flara daha az yay\u0131l\u0131r.<\/li>\n<li><strong>\u0130zolasyon ve Y\u00f6netilebilirlik:<\/strong> Her servis kendi ba\u011f\u0131ms\u0131z a\u011f\u0131nda ve kapsay\u0131c\u0131s\u0131nda \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in, bir serviste yap\u0131lan de\u011fi\u015fiklikler di\u011ferini etkilemez. Her a\u011f\u0131n kendi trafik ak\u0131\u015f\u0131 vard\u0131r, bu da sorun gidermeyi kolayla\u015ft\u0131r\u0131r.<\/li>\n<li><strong>\u00d6l\u00e7eklenebilirlik:<\/strong> Servisler birbirinden ba\u011f\u0131ms\u0131z \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in, yo\u011funlu\u011fa g\u00f6re sadece ihtiya\u00e7 duyulan servisler \u00f6l\u00e7eklendirilebilir (\u00f6rne\u011fin, daha fazla \u00fcr\u00fcn servisi kapsay\u0131c\u0131s\u0131 eklenebilir). Docker Swarm veya Kubernetes gibi orkestrasyon ara\u00e7lar\u0131 ile bu yap\u0131 daha da ileri ta\u015f\u0131nabilir.<\/li>\n<li><strong>Hizmet Ke\u015ffi:<\/strong> Docker'\u0131n DNS tabanl\u0131 hizmet ke\u015ffi sayesinde, servisler birbirlerini do\u011frudan isimleriyle (\u00f6rn. <code>product-service<\/code>, <code>user-db<\/code>) \u00e7\u00f6z\u00fcmleyebilirler. Bu, IP adresleri yerine anlaml\u0131 isimler kullanmay\u0131 m\u00fcmk\u00fcn k\u0131lar ve konfig\u00fcrasyon y\u00f6netimini basitle\u015ftirir.<\/li>\n<\/ul>\n<p>Bu vaka analizi, Docker a\u011f\u0131n\u0131n sadece basit kapsay\u0131c\u0131 ba\u011flant\u0131lar\u0131ndan ibaret olmad\u0131\u011f\u0131n\u0131, ayn\u0131 zamanda karma\u015f\u0131k, b\u00fcy\u00fck \u00f6l\u00e7ekli ve g\u00fcvenli mikroservis mimarileri in\u015fa etmek i\u00e7in nas\u0131l g\u00fc\u00e7l\u00fc bir temel olu\u015fturdu\u011funu g\u00f6stermektedir. Do\u011fru a\u011f tasar\u0131m\u0131, bir full-stack projenin ba\u015far\u0131s\u0131 i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h2>\n<p>Docker, modern full-stack uygulama geli\u015ftirmenin ve da\u011f\u0131t\u0131m\u0131n\u0131n temel ta\u015flar\u0131ndan biri haline gelmi\u015ftir. Bu makale boyunca, Docker kapsay\u0131c\u0131lar\u0131n\u0131n birbiriyle nas\u0131l ileti\u015fim kurdu\u011funu, temel a\u011f modlar\u0131ndan ba\u015flayarak <code>docker run<\/code> ile manuel ba\u011flant\u0131ya, ard\u0131ndan <code>Docker Compose<\/code> ile \u00e7ok kapsay\u0131c\u0131l\u0131 uygulamalar\u0131n kolayca y\u00f6netilmesine kadar bir\u00e7ok konuyu ele ald\u0131k. G\u00f6rd\u00fck ki, ister basit bir \u00fc\u00e7 katmanl\u0131 uygulama ister karma\u015f\u0131k bir mikroservis mimarisi olsun, Docker'\u0131n a\u011f yetenekleri, uygulaman\u0131n farkl\u0131 bile\u015fenlerini izole edilmi\u015f ancak ileti\u015fim kurabilir bir ortamda \u00e7al\u0131\u015ft\u0131rmak i\u00e7in vazge\u00e7ilmezdir. \u00d6zel a\u011flar olu\u015fturarak g\u00fcvenlik, performans ve y\u00f6netilebilirli\u011fi art\u0131rabilir, <code>docker-compose<\/code> gibi ara\u00e7larla da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini otomatikle\u015ftirebilirsiniz. Unutmay\u0131n, Docker a\u011f\u0131n\u0131 iyi anlamak, full-stack projelerinizin sorunsuz, \u00f6l\u00e7eklenebilir ve g\u00fcvenli bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flaman\u0131n anahtar\u0131d\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>1. Docker Compose kullanmadan kapsay\u0131c\u0131lar\u0131 nas\u0131l ba\u011flar\u0131m?<\/strong><\/p>\n<p>Manuel olarak kapsay\u0131c\u0131lar\u0131 ba\u011flamak i\u00e7in <code>docker run<\/code> komutunu kullanabilirsiniz. Ayn\u0131 \u00f6zel <code>bridge<\/code> a\u011f\u0131na <code>--network<\/code> parametresiyle ba\u011flayabilir ve <code>docker run --link<\/code> (eski ve \u00f6nerilmeyen) veya daha iyisi, kapsay\u0131c\u0131 isimleri arac\u0131l\u0131\u011f\u0131yla DNS \u00e7\u00f6z\u00fcmlemesini kullanabilirsiniz. \u00d6rne\u011fin, <code>docker run --name db postgres<\/code> ve sonra <code>docker run --name app --network container:db my-app<\/code> (ayn\u0131 a\u011f y\u0131\u011f\u0131n\u0131) ya da <code>docker run --name app --network bridge --env DB_HOST=db my-app<\/code> (ayn\u0131 bridge a\u011f\u0131nda isimle \u00e7\u00f6z\u00fcmleme) \u015feklinde kullan\u0131labilir. Ancak, \u00e7oklu kapsay\u0131c\u0131lar i\u00e7in <code>docker-compose<\/code> \u00e7ok daha pratiktir.<\/p>\n<p><strong>2. Farkl\u0131 sunuculardaki Docker kapsay\u0131c\u0131lar\u0131n\u0131 nas\u0131l ba\u011flar\u0131m?<\/strong><\/p>\n<p>Farkl\u0131 sunuculardaki kapsay\u0131c\u0131lar\u0131 ba\u011flamak i\u00e7in <code>overlay<\/code> a\u011f s\u00fcr\u00fcc\u00fcs\u00fcn\u00fc kullanman\u0131z gerekir. Bu genellikle Docker Swarm veya Kubernetes gibi konteyner orkestrasyon ara\u00e7lar\u0131 ile birlikte kullan\u0131l\u0131r. Bu ara\u00e7lar, birden fazla sunucu (node) \u00fczerinde \u00e7al\u0131\u015fan kapsay\u0131c\u0131lar aras\u0131nda sorunsuz bir sanal a\u011f olu\u015fturman\u0131za olanak tan\u0131r.<\/p>\n<p><strong>3. Docker a\u011f\u0131nda g\u00fcvenlik ipu\u00e7lar\u0131 nelerdir?<\/strong><\/p>\n<p>\u00d6nemli ipu\u00e7lar\u0131 \u015funlard\u0131r: Yaln\u0131zca kesinlikle gerekli olan portlar\u0131 d\u0131\u015f d\u00fcnyaya a\u00e7\u0131n. Uygulama katman\u0131nda g\u00fc\u00e7l\u00fc kimlik do\u011frulama ve yetkilendirme mekanizmalar\u0131 kullan\u0131n. Host makinenizde bir g\u00fcvenlik duvar\u0131 (firewall) yap\u0131land\u0131rarak Docker taraf\u0131ndan a\u00e7\u0131lan portlar\u0131 k\u0131s\u0131tlay\u0131n. Veritaban\u0131 ve i\u00e7 servisler i\u00e7in \u00f6zel, izole a\u011flar olu\u015fturarak a\u011f segmentasyonu uygulay\u0131n. En d\u00fc\u015f\u00fck yetki prensibini benimseyerek kapsay\u0131c\u0131lara sadece ihtiya\u00e7 duyduklar\u0131 kaynaklara eri\u015fim izni verin.<\/p>\n<p><strong>4. <code>docker-compose restart<\/code> veya <code>up<\/code> komutu kapsay\u0131c\u0131lar\u0131n IP adreslerini de\u011fi\u015ftirir mi?<\/strong><\/p>\n<p>Evet, bir kapsay\u0131c\u0131 yeniden olu\u015fturuldu\u011funda veya <code>docker-compose up<\/code> komutuyla g\u00fcncellendi\u011finde, genellikle yeni bir IP adresi al\u0131r. Ancak bu durum, <code>docker-compose<\/code>'un sundu\u011fu DNS tabanl\u0131 servis ke\u015ffi sayesinde bir sorun te\u015fkil etmez. Servisler, birbirlerine IP adresleri yerine <code>docker-compose.yml<\/code> dosyas\u0131nda tan\u0131mlanan servis adlar\u0131yla (\u00f6rn. <code>backend<\/code> veya <code>mongodb<\/code>) eri\u015fti\u011fi i\u00e7in, IP adresindeki de\u011fi\u015fiklikler uygulamay\u0131 etkilemez.<\/p>\n<p><strong>5. Uygulama kapsay\u0131c\u0131m veritaban\u0131 kapsay\u0131c\u0131s\u0131na neden ba\u011flanam\u0131yor?<\/strong><\/p>\n<p>Bu yayg\u0131n bir sorundur ve birka\u00e7 nedeni olabilir:<\/p>\n<ol>\n<li><strong>Ayn\u0131 a\u011fda de\u011filler:<\/strong> Her iki kapsay\u0131c\u0131n\u0131n da ayn\u0131 Docker a\u011f\u0131na ba\u011fl\u0131 oldu\u011fundan emin olun. <code>docker network ls<\/code> ve <code>docker inspect <container_id><\/code> komutlar\u0131yla kontrol edebilirsiniz.<\/li>\n<li><strong>Yanl\u0131\u015f hostname\/IP:<\/strong> Uygulama kodunuzda veritaban\u0131n\u0131n <code>hostname<\/code>'ini do\u011fru yazd\u0131\u011f\u0131n\u0131zdan emin olun. <code>docker-compose<\/code> kullan\u0131yorsan\u0131z servis ad\u0131n\u0131 (<code>db<\/code>, <code>mongodb<\/code> vb.) kullanmal\u0131s\u0131n\u0131z. Manuel \u00e7al\u0131\u015ft\u0131r\u0131yorsan\u0131z, <code>--link<\/code> veya DNS adlar\u0131n\u0131 (e\u011fer ayn\u0131 \u00f6zel a\u011fda iseler) kullan\u0131n.<\/li>\n<li><strong>Port a\u00e7\u0131k de\u011fil:<\/strong> Veritaban\u0131 kapsay\u0131c\u0131s\u0131n\u0131n do\u011fru portu dinledi\u011finden ve o portun a\u011f i\u00e7inde eri\u015filebilir oldu\u011fundan emin olun.<\/li>\n<li><strong>Veritaban\u0131 haz\u0131r de\u011fil:<\/strong> Veritaban\u0131 kapsay\u0131c\u0131s\u0131 ba\u015flam\u0131\u015f olsa bile, veritaban\u0131 servisinin tam olarak ba\u015flat\u0131lmas\u0131 ve ba\u011flant\u0131lar\u0131 kabul etmeye haz\u0131r olmas\u0131 biraz zaman alabilir. Uygulama kodunuzda veya <code>docker-compose<\/code> dosyas\u0131nda (\u00f6rne\u011fin <code>healthcheck<\/code> veya uygulama i\u00e7i yeniden deneme mant\u0131\u011f\u0131 ile) bu durumu ele alman\u0131z gerekebilir.<\/li>\n<li><strong>G\u00fcvenlik Duvar\u0131:<\/strong> Host makinenizdeki bir g\u00fcvenlik duvar\u0131, kapsay\u0131c\u0131lar aras\u0131 ileti\u015fimi engelliyor olabilir.<\/li>\n<\/ol>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, full-stack uygulamalar\u0131 da\u011f\u0131tmak ve y\u00f6netmek, \u00f6zellikle mikroservis mimarileri yayg\u0131nla\u015ft\u0131k\u00e7a, karma\u015f\u0131k bir hale gelebiliyor. Bu&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-33565","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>Full-Stack Projelerde Docker A\u011f \u0130leti\u015fimi: Kapsay\u0131c\u0131 Ba\u011flant\u0131lar\u0131<\/title>\n<meta name=\"description\" content=\"Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, full-stack uygulamalar\u0131 da\u011f\u0131tmak ve y\u00f6netmek, \u00f6zellikle mikroservis mimarileri yayg\u0131nla\u015ft\u0131k\u00e7a, karma\u015f\u0131k bir hale gelebiliyor. Bu karma\u015f\u0131kl\u0131\u011f\u0131n merkezinde ise farkl\u0131 uygulama bile\u015fenlerinin (\u00f6n y\u00fcz, arka y\u00fcz, veritaban\u0131, \u00f6nbellek gibi) birbiriyle nas\u0131l ileti\u015fim kuraca\u011f\u0131 sorunu yat\u0131yor. Docker, kapsay\u0131c\u0131la\u015ft\u0131rma teknolojisiyle bu s\u00fcreci b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirse de, kapsay\u0131c\u0131lar aras\u0131 a\u011f ileti\u015fimi bir\u00e7ok geli\u015ftirici i\u00e7in h\u00e2l\u00e2 bir soru i\u015fareti olabiliyor. Peki, Docker ile bir full-stack projesinin t\u00fcm par\u00e7alar\u0131n\u0131 sorunsuz bir \u015fekilde nas\u0131l ba\u011flar\u0131z ve uygulamalar\u0131m\u0131z\u0131n birbiriyle konu\u015fmas\u0131n\u0131 nas\u0131l sa\u011flar\u0131z?\" \/>\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\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Full-Stack Projelerde Docker A\u011f \u0130leti\u015fimi: Kapsay\u0131c\u0131 Ba\u011flant\u0131lar\u0131\" \/>\n<meta property=\"og:description\" content=\"Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, full-stack uygulamalar\u0131 da\u011f\u0131tmak ve y\u00f6netmek, \u00f6zellikle mikroservis mimarileri yayg\u0131nla\u015ft\u0131k\u00e7a, karma\u015f\u0131k bir hale gelebiliyor. Bu karma\u015f\u0131kl\u0131\u011f\u0131n merkezinde ise farkl\u0131 uygulama bile\u015fenlerinin (\u00f6n y\u00fcz, arka y\u00fcz, veritaban\u0131, \u00f6nbellek gibi) birbiriyle nas\u0131l ileti\u015fim kuraca\u011f\u0131 sorunu yat\u0131yor. Docker, kapsay\u0131c\u0131la\u015ft\u0131rma teknolojisiyle bu s\u00fcreci b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirse de, kapsay\u0131c\u0131lar aras\u0131 a\u011f ileti\u015fimi bir\u00e7ok geli\u015ftirici i\u00e7in h\u00e2l\u00e2 bir soru i\u015fareti olabiliyor. Peki, Docker ile bir full-stack projesinin t\u00fcm par\u00e7alar\u0131n\u0131 sorunsuz bir \u015fekilde nas\u0131l ba\u011flar\u0131z ve uygulamalar\u0131m\u0131z\u0131n birbiriyle konu\u015fmas\u0131n\u0131 nas\u0131l sa\u011flar\u0131z?\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-04T09:31:49+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=\"29 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Full-Stack Projelerde Docker A\u011f \u0130leti\u015fimi: Kapsay\u0131c\u0131 Ba\u011flant\u0131lar\u0131\",\"datePublished\":\"2025-11-04T09:31:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/\"},\"wordCount\":5142,\"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\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/\",\"name\":\"Full-Stack Projelerde Docker A\u011f \u0130leti\u015fimi: Kapsay\u0131c\u0131 Ba\u011flant\u0131lar\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-04T09:31:49+00:00\",\"description\":\"Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, full-stack uygulamalar\u0131 da\u011f\u0131tmak ve y\u00f6netmek, \u00f6zellikle mikroservis mimarileri yayg\u0131nla\u015ft\u0131k\u00e7a, karma\u015f\u0131k bir hale gelebiliyor. Bu karma\u015f\u0131kl\u0131\u011f\u0131n merkezinde ise farkl\u0131 uygulama bile\u015fenlerinin (\u00f6n y\u00fcz, arka y\u00fcz, veritaban\u0131, \u00f6nbellek gibi) birbiriyle nas\u0131l ileti\u015fim kuraca\u011f\u0131 sorunu yat\u0131yor. Docker, kapsay\u0131c\u0131la\u015ft\u0131rma teknolojisiyle bu s\u00fcreci b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirse de, kapsay\u0131c\u0131lar aras\u0131 a\u011f ileti\u015fimi bir\u00e7ok geli\u015ftirici i\u00e7in h\u00e2l\u00e2 bir soru i\u015fareti olabiliyor. Peki, Docker ile bir full-stack projesinin t\u00fcm par\u00e7alar\u0131n\u0131 sorunsuz bir \u015fekilde nas\u0131l ba\u011flar\u0131z ve uygulamalar\u0131m\u0131z\u0131n birbiriyle konu\u015fmas\u0131n\u0131 nas\u0131l sa\u011flar\u0131z?\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Full-Stack Projelerde Docker A\u011f \u0130leti\u015fimi: Kapsay\u0131c\u0131 Ba\u011flant\u0131lar\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":"Full-Stack Projelerde Docker A\u011f \u0130leti\u015fimi: Kapsay\u0131c\u0131 Ba\u011flant\u0131lar\u0131","description":"Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, full-stack uygulamalar\u0131 da\u011f\u0131tmak ve y\u00f6netmek, \u00f6zellikle mikroservis mimarileri yayg\u0131nla\u015ft\u0131k\u00e7a, karma\u015f\u0131k bir hale gelebiliyor. Bu karma\u015f\u0131kl\u0131\u011f\u0131n merkezinde ise farkl\u0131 uygulama bile\u015fenlerinin (\u00f6n y\u00fcz, arka y\u00fcz, veritaban\u0131, \u00f6nbellek gibi) birbiriyle nas\u0131l ileti\u015fim kuraca\u011f\u0131 sorunu yat\u0131yor. Docker, kapsay\u0131c\u0131la\u015ft\u0131rma teknolojisiyle bu s\u00fcreci b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirse de, kapsay\u0131c\u0131lar aras\u0131 a\u011f ileti\u015fimi bir\u00e7ok geli\u015ftirici i\u00e7in h\u00e2l\u00e2 bir soru i\u015fareti olabiliyor. Peki, Docker ile bir full-stack projesinin t\u00fcm par\u00e7alar\u0131n\u0131 sorunsuz bir \u015fekilde nas\u0131l ba\u011flar\u0131z ve uygulamalar\u0131m\u0131z\u0131n birbiriyle konu\u015fmas\u0131n\u0131 nas\u0131l sa\u011flar\u0131z?","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\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/","og_locale":"tr_TR","og_type":"article","og_title":"Full-Stack Projelerde Docker A\u011f \u0130leti\u015fimi: Kapsay\u0131c\u0131 Ba\u011flant\u0131lar\u0131","og_description":"Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, full-stack uygulamalar\u0131 da\u011f\u0131tmak ve y\u00f6netmek, \u00f6zellikle mikroservis mimarileri yayg\u0131nla\u015ft\u0131k\u00e7a, karma\u015f\u0131k bir hale gelebiliyor. Bu karma\u015f\u0131kl\u0131\u011f\u0131n merkezinde ise farkl\u0131 uygulama bile\u015fenlerinin (\u00f6n y\u00fcz, arka y\u00fcz, veritaban\u0131, \u00f6nbellek gibi) birbiriyle nas\u0131l ileti\u015fim kuraca\u011f\u0131 sorunu yat\u0131yor. Docker, kapsay\u0131c\u0131la\u015ft\u0131rma teknolojisiyle bu s\u00fcreci b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirse de, kapsay\u0131c\u0131lar aras\u0131 a\u011f ileti\u015fimi bir\u00e7ok geli\u015ftirici i\u00e7in h\u00e2l\u00e2 bir soru i\u015fareti olabiliyor. Peki, Docker ile bir full-stack projesinin t\u00fcm par\u00e7alar\u0131n\u0131 sorunsuz bir \u015fekilde nas\u0131l ba\u011flar\u0131z ve uygulamalar\u0131m\u0131z\u0131n birbiriyle konu\u015fmas\u0131n\u0131 nas\u0131l sa\u011flar\u0131z?","og_url":"https:\/\/fatihsoysal.com\/blog\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-04T09:31:49+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"29 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Full-Stack Projelerde Docker A\u011f \u0130leti\u015fimi: Kapsay\u0131c\u0131 Ba\u011flant\u0131lar\u0131","datePublished":"2025-11-04T09:31:49+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/"},"wordCount":5142,"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\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/","url":"https:\/\/fatihsoysal.com\/blog\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/","name":"Full-Stack Projelerde Docker A\u011f \u0130leti\u015fimi: Kapsay\u0131c\u0131 Ba\u011flant\u0131lar\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-04T09:31:49+00:00","description":"Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, full-stack uygulamalar\u0131 da\u011f\u0131tmak ve y\u00f6netmek, \u00f6zellikle mikroservis mimarileri yayg\u0131nla\u015ft\u0131k\u00e7a, karma\u015f\u0131k bir hale gelebiliyor. Bu karma\u015f\u0131kl\u0131\u011f\u0131n merkezinde ise farkl\u0131 uygulama bile\u015fenlerinin (\u00f6n y\u00fcz, arka y\u00fcz, veritaban\u0131, \u00f6nbellek gibi) birbiriyle nas\u0131l ileti\u015fim kuraca\u011f\u0131 sorunu yat\u0131yor. Docker, kapsay\u0131c\u0131la\u015ft\u0131rma teknolojisiyle bu s\u00fcreci b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirse de, kapsay\u0131c\u0131lar aras\u0131 a\u011f ileti\u015fimi bir\u00e7ok geli\u015ftirici i\u00e7in h\u00e2l\u00e2 bir soru i\u015fareti olabiliyor. Peki, Docker ile bir full-stack projesinin t\u00fcm par\u00e7alar\u0131n\u0131 sorunsuz bir \u015fekilde nas\u0131l ba\u011flar\u0131z ve uygulamalar\u0131m\u0131z\u0131n birbiriyle konu\u015fmas\u0131n\u0131 nas\u0131l sa\u011flar\u0131z?","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/full-stack-projelerde-docker-ag-iletisimi-kapsayici-baglantilari\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Full-Stack Projelerde Docker A\u011f \u0130leti\u015fimi: Kapsay\u0131c\u0131 Ba\u011flant\u0131lar\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\/33565","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=33565"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33565\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33565"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33565"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33565"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}