{"id":39821,"date":"2026-02-24T08:21:14","date_gmt":"2026-02-24T05:21:14","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/"},"modified":"2026-02-24T08:21:14","modified_gmt":"2026-02-24T05:21:14","slug":"neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/","title":{"rendered":"Neden Docker Compose ile Laravel, Nginx ve MySQL Kurulumu Yapmal\u0131y\u0131z?"},"content":{"rendered":"<p><title>Docker Compose ile Laravel, Nginx ve MySQL Kurulumu Rehberi<\/title><br \/>\n<body><\/p>\n<h2>Neden Docker Compose ile Laravel, Nginx ve MySQL Kurulumu Yapmal\u0131y\u0131z?<\/h2>\n<p>Modern web geli\u015ftirme d\u00fcnyas\u0131nda, projelerinizi tutarl\u0131 ve izole ortamlarda \u00e7al\u0131\u015ft\u0131rmak her zamankinden daha \u00f6nemli hale geldi. Genellikle, geli\u015ftiriciler farkl\u0131 i\u015fletim sistemleri ve yerel yap\u0131land\u0131rma sorunlar\u0131yla bo\u011fu\u015fmak zorunda kal\u0131r; bu da &#8220;benim bilgisayar\u0131mda \u00e7al\u0131\u015f\u0131yordu&#8221; sendromuna yol a\u00e7ar. Peki, bu karma\u015fay\u0131 ortadan kald\u0131rarak geli\u015ftirme s\u00fcrecinizi nas\u0131l h\u0131zland\u0131rabilir, ekip \u00fcyeleri aras\u0131ndaki tutars\u0131zl\u0131klar\u0131 nas\u0131l giderebilir ve hatta da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi nas\u0131l kolayla\u015ft\u0131rabilirsiniz? \u0130\u015fte tam da bu noktada Docker Compose devreye giriyor. Bu kapsaml\u0131 rehberde, Laravel tabanl\u0131 bir uygulaman\u0131n Nginx web sunucusu ve MySQL veritaban\u0131 ile Docker Compose kullanarak nas\u0131l kurulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Bu sayede, hem yeni ba\u015flayanlar hem de deneyimli geli\u015ftiriciler i\u00e7in g\u00fc\u00e7l\u00fc, esnek ve ta\u015f\u0131nabilir bir geli\u015ftirme ortam\u0131 olu\u015fturman\u0131n t\u00fcm inceliklerini ke\u015ffedece\u011fiz.<\/p>\n<p>Geleneksel geli\u015ftirme yakla\u015f\u0131mlar\u0131nda, bir projenin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 (PHP, Nginx, MySQL gibi) manuel olarak kurmak ve yap\u0131land\u0131rmak zaman al\u0131c\u0131 ve hata yapmaya a\u00e7\u0131k bir s\u00fcre\u00e7tir. \u00d6rne\u011fin, farkl\u0131 projeler farkl\u0131 PHP s\u00fcr\u00fcmleri gerektirebilir veya veritaban\u0131 sunucusu yap\u0131land\u0131rmalar\u0131 \u00e7at\u0131\u015fabilir. Bu durum, \u00f6zellikle b\u00fcy\u00fck ekiplerde veya birden fazla proje \u00fczerinde \u00e7al\u0131\u015fan geli\u015ftiriciler i\u00e7in ciddi verimlilik kay\u0131plar\u0131na neden olabilir. Docker ve Docker Compose, bu t\u00fcr sorunlara k\u00f6kten bir \u00e7\u00f6z\u00fcm sunar. Her hizmeti (Laravel uygulamas\u0131, Nginx, MySQL) kendi izole konteynerinde \u00e7al\u0131\u015ft\u0131rarak, ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131n\u0131 ortadan kald\u0131r\u0131r ve her geli\u015ftiricinin ayn\u0131 ortamda \u00e7al\u0131\u015fmas\u0131n\u0131 garanti eder. Bu yakla\u015f\u0131m, sadece geli\u015ftirme s\u00fcrecini de\u011fil, ayn\u0131 zamanda test ve \u00fcretim ortamlar\u0131na ge\u00e7i\u015fi de b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir. B\u00f6ylece, projenizin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fcn her a\u015famas\u0131nda tutarl\u0131l\u0131k ve g\u00fcvenilirlik sa\u011flars\u0131n\u0131z.<\/p>\n<div class=\"expert-tip\">Uzman \u0130pucu: Docker Compose kullanarak geli\u015ftirme ortam\u0131n\u0131z\u0131 standartla\u015ft\u0131rmak, yeni ekip \u00fcyelerinin projeye adaptasyon s\u00fcresini %50&#8217;ye kadar azaltabilir. T\u00fcm ba\u011f\u0131ml\u0131l\u0131klar tek bir komutla aya\u011fa kalkt\u0131\u011f\u0131 i\u00e7in, kurulum ve yap\u0131land\u0131rma ile u\u011fra\u015fmak yerine do\u011frudan kod yazmaya ba\u015flayabilirler.<\/div>\n<p>Bu rehber boyunca, sadece teknik ad\u0131mlar\u0131 de\u011fil, ayn\u0131 zamanda her bir bile\u015fenin neden bu \u015fekilde yap\u0131land\u0131r\u0131lmas\u0131 gerekti\u011fini de a\u00e7\u0131klayaca\u011f\u0131z. Ger\u00e7ek d\u00fcnya senaryolar\u0131yla desteklenen vaka analizleri sayesinde, \u00f6\u011frendiklerinizi kendi projelerinize nas\u0131l uygulayabilece\u011finizi daha iyi anlayacaks\u0131n\u0131z. Amac\u0131m\u0131z, sizi sadece bir kurulum sihirbaz\u0131 olmaktan \u00e7\u0131kar\u0131p, Docker Compose&#8217;un g\u00fcc\u00fcn\u00fc tam anlam\u0131yla kavrayan ve kendi ihtiya\u00e7lar\u0131n\u0131za g\u00f6re uyarlayabilen bir geli\u015ftiriciye d\u00f6n\u00fc\u015ft\u00fcrmektir. Haz\u0131rsan\u0131z, bu heyecan verici yolculu\u011fa ba\u015flayal\u0131m ve modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olan konteynerizasyon d\u00fcnyas\u0131na ad\u0131m atal\u0131m.<\/p>\n<h2>Temel Kavramlar Nelerdir? Docker ve Docker Compose&#8217;a H\u0131zl\u0131 Bir Bak\u0131\u015f<\/h2>\n<p>Konteynerizasyon d\u00fcnyas\u0131na ad\u0131m atmadan \u00f6nce, bu teknolojinin temelini olu\u015fturan kavramlar\u0131 anlamak \u00f6nemlidir. Docker ve Docker Compose, birbirini tamamlayan iki ara\u00e7t\u0131r ve modern uygulama geli\u015ftirme ile da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini k\u00f6kten de\u011fi\u015ftirmi\u015ftir. Peki, bu ara\u00e7lar tam olarak nedir ve Laravel, Nginx, MySQL \u00fc\u00e7l\u00fcs\u00fcyle nas\u0131l bir araya gelir?<\/p>\n<h3>Docker Nedir ve Konteyner Kavram\u0131 Ne Anlama Gelir?<\/h3>\n<p>Docker, uygulamalar\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 konteyner ad\u0131 verilen izole edilmi\u015f, hafif ve ta\u015f\u0131nabilir paketler i\u00e7inde paketlemeye olanak tan\u0131yan a\u00e7\u0131k kaynakl\u0131 bir platformdur. Bir konteyner, sanal makinelere benzer \u015fekilde uygulaman\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\u00e7erir. Ancak sanal makinelerden farkl\u0131 olarak, konteynerler i\u015fletim sisteminin \u00e7ekirde\u011fini payla\u015f\u0131r ve bu da onlar\u0131 \u00e7ok daha hafif ve h\u0131zl\u0131 yapar. Her konteyner, ana makinenin kaynaklar\u0131n\u0131 daha verimli kullan\u0131r ve saniyeler i\u00e7inde ba\u015flat\u0131labilir. Bu izolasyon sayesinde, bir konteynerde \u00e7al\u0131\u015fan uygulaman\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131 veya yap\u0131land\u0131rmas\u0131, ba\u015fka bir konteynerdeki uygulamay\u0131 etkilemez. Bu, geli\u015ftiriciler i\u00e7in &#8220;benim makinemde \u00e7al\u0131\u015f\u0131yordu&#8221; sorununu ortadan kald\u0131ran en b\u00fcy\u00fck avantajlardan biridir.<\/p>\n<p>\u00d6rne\u011fin, bir Laravel uygulamas\u0131n\u0131n PHP 8.1&#8217;e, ba\u015fka bir uygulaman\u0131n ise PHP 7.4&#8217;e ihtiyac\u0131 oldu\u011funu varsayal\u0131m. Geleneksel yakla\u015f\u0131mlarda bu durum karma\u015f\u0131k versiyon y\u00f6netimi sorunlar\u0131na yol a\u00e7abilir. Ancak Docker ile her iki PHP s\u00fcr\u00fcm\u00fcn\u00fc de ayr\u0131 konteynerlerde \u00e7al\u0131\u015ft\u0131rabilir ve her uygulaman\u0131n kendi \u00f6zel ortam\u0131na sahip olmas\u0131n\u0131 sa\u011flayabilirsiniz. Bu esneklik, \u00f6zellikle birden fazla proje \u00fczerinde \u00e7al\u0131\u015fan geli\u015ftiriciler veya mikroservis mimarileri kullanan ekipler i\u00e7in paha bi\u00e7ilmezdir.<\/p>\n<h3>Docker Compose Nedir ve \u00c7oklu Konteyner Y\u00f6netimi Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Docker Compose, birden fazla Docker konteynerinden olu\u015fan uygulamalar\u0131 tan\u0131mlamak ve \u00e7al\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131lan bir ara\u00e7t\u0131r. Tek bir YAML dosyas\u0131 kullanarak, uygulaman\u0131z\u0131n t\u00fcm hizmetlerini (\u00f6rne\u011fin, Laravel uygulamas\u0131, Nginx web sunucusu, MySQL veritaban\u0131), a\u011flar\u0131n\u0131 ve depolama birimlerini yap\u0131land\u0131rabilirsiniz. Docker Compose, bu hizmetleri tek bir komutla ba\u015flatman\u0131za, durdurman\u0131za ve yeniden olu\u015fturman\u0131za olanak tan\u0131r. Bu sayede, karma\u015f\u0131k \u00e7ok katmanl\u0131 uygulamalar\u0131n y\u00f6netimini inan\u0131lmaz derecede basitle\u015ftirir.<\/p>\n<p>Bizim senaryomuzda, Laravel uygulamas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131ran bir PHP-FPM konteyneri, HTTP isteklerini y\u00f6nlendiren bir Nginx konteyneri ve verileri depolayan bir MySQL konteyneri gibi \u00fc\u00e7 ana hizmetimiz olacak. Docker Compose, bu \u00fc\u00e7 hizmeti birbirine ba\u011flayacak, aralar\u0131ndaki ileti\u015fimi sa\u011flayacak ve hepsini tek bir birim olarak y\u00f6netmemize olanak tan\u0131yacak. Bu entegrasyon, geli\u015ftirme ortam\u0131n\u0131z\u0131 h\u0131zl\u0131ca aya\u011fa kald\u0131rman\u0131n ve t\u00fcm ekibin ayn\u0131, tutarl\u0131 ortamda \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flaman\u0131n anahtar\u0131d\u0131r.<\/p>\n<div class=\"expert-tip\">Uzman \u0130pucu: Docker Compose dosyalar\u0131n\u0131z\u0131 versiyon kontrol sisteminize (Git gibi) dahil ederek, t\u00fcm ekibin geli\u015ftirme ortam\u0131n\u0131n her zaman g\u00fcncel ve senkronize kalmas\u0131n\u0131 sa\u011flay\u0131n. Bu, &#8220;benim makinemde \u00e7al\u0131\u015f\u0131yordu&#8221; sorununu tamamen ortadan kald\u0131r\u0131r.<\/div>\n<h3>Nginx, MySQL ve Laravel&#8217;in Bu Ekosistemdeki Rolleri Nelerdir?<\/h3>\n<ul>\n<li>\n      <strong>Laravel:<\/strong> PHP tabanl\u0131, modern web uygulamalar\u0131 geli\u015ftirmek i\u00e7in pop\u00fcler bir MVC (Model-View-Controller) framework&#8217;\u00fcd\u00fcr. Konteyner i\u00e7inde \u00e7al\u0131\u015facak olan ana uygulamam\u0131zd\u0131r. Biz, Laravel&#8217;i bir PHP-FPM (FastCGI Process Manager) konteyneri i\u00e7inde \u00e7al\u0131\u015ft\u0131raca\u011f\u0131z. PHP-FPM, PHP kodunu i\u015flemekten sorumludur.\n    <\/li>\n<li>\n      <strong>Nginx:<\/strong> Y\u00fcksek performansl\u0131 bir web sunucusu ve ters proxy&#8217;dir. Gelen HTTP isteklerini kar\u015f\u0131layacak, statik dosyalar\u0131 sunacak ve dinamik PHP isteklerini (yani Laravel uygulamam\u0131z\u0131n isteklerini) PHP-FPM konteynerimize y\u00f6nlendirecektir. Bu yap\u0131land\u0131rma, PHP kodunun do\u011frudan web sunucusu taraf\u0131ndan i\u015flenmesi yerine, \u00f6zel bir PHP i\u015flem y\u00f6neticisi taraf\u0131ndan i\u015flenmesini sa\u011flar, bu da performans\u0131 ve g\u00fcvenli\u011fi art\u0131r\u0131r.\n    <\/li>\n<li>\n      <strong>MySQL:<\/strong> A\u00e7\u0131k kaynakl\u0131, ili\u015fkisel bir veritaban\u0131 y\u00f6netim sistemidir. Laravel uygulamam\u0131z\u0131n t\u00fcm verilerini (kullan\u0131c\u0131lar, \u00fcr\u00fcnler, sipari\u015fler vb.) depolayaca\u011f\u0131 yerdir. Ayr\u0131 bir konteynerde \u00e7al\u0131\u015facak ve Laravel uygulamam\u0131z bu konteynere a\u011f \u00fczerinden ba\u011flanacakt\u0131r.\n    <\/li>\n<\/ul>\n<p>Bu \u00fc\u00e7 bile\u015feni Docker Compose ile bir araya getirerek, sadece izole ve tutarl\u0131 bir geli\u015ftirme ortam\u0131 olu\u015fturmakla kalmayacak, ayn\u0131 zamanda uygulaman\u0131z\u0131n da\u011f\u0131t\u0131m\u0131n\u0131 da basitle\u015ftireceksiniz. Her bir bile\u015fen kendi sorumlulu\u011funu \u00fcstlenirken, Docker Compose onlar\u0131 sorunsuz bir \u015fekilde entegre ederek g\u00fc\u00e7l\u00fc bir ekosistem yarat\u0131r. Bu sayede, geli\u015ftiriciler altyap\u0131 detaylar\u0131yla bo\u011fu\u015fmak yerine, do\u011frudan i\u015f mant\u0131\u011f\u0131na odaklanabilirler.<\/p>\n<h2>Geli\u015ftirme Ortam\u0131n\u0131z\u0131 Haz\u0131rlama: Ad\u0131m Ad\u0131m Kurulum S\u00fcreci<\/h2>\n<p>Art\u0131k temel kavramlar\u0131 anlad\u0131\u011f\u0131m\u0131za g\u00f6re, Docker Compose ile Laravel, Nginx ve MySQL ortam\u0131m\u0131z\u0131 kurmaya ba\u015flayabiliriz. Bu b\u00f6l\u00fcmde, gerekli \u00f6nko\u015fullar\u0131 tamamlayacak, proje dizin yap\u0131s\u0131n\u0131 olu\u015fturacak ve temel yap\u0131land\u0131rma dosyalar\u0131n\u0131 haz\u0131rlayaca\u011f\u0131z. Her ad\u0131m\u0131 dikkatlice takip etmek, sorunsuz bir kurulum i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h3>\u00d6nko\u015fullar: Docker ve Docker Compose Kurulumu<\/h3>\n<p>Bu rehbere ba\u015flamadan \u00f6nce, sisteminizde Docker ve Docker Compose&#8217;un kurulu olmas\u0131 gerekmektedir. E\u011fer kurulu de\u011filse, a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izleyerek kurulumu ger\u00e7ekle\u015ftirebilirsiniz:<\/p>\n<ol>\n<li>\n      <strong>Docker Desktop Kurulumu:<\/strong> Windows veya macOS kullan\u0131yorsan\u0131z, <a href=\"https:\/\/www.docker.com\/products\/docker-desktop\" target=\"_blank\">Docker Desktop<\/a>&#8216;\u0131 indirip kurman\u0131z en kolay yoldur. Docker Desktop, hem Docker Engine&#8217;i hem de Docker Compose&#8217;u i\u00e7erir. Linux kullan\u0131yorsan\u0131z, Docker Engine&#8217;i ve Docker Compose&#8217;u <a href=\"https:\/\/docs.docker.com\/engine\/install\/\" target=\"_blank\">Docker&#8217;\u0131n resmi belgelerinden<\/a> y\u00fckleyebilirsiniz.\n    <\/li>\n<li>\n      <strong>Kurulumu Do\u011frulama:<\/strong> Kurulum tamamland\u0131ktan sonra, terminalinizi veya komut istemcinizi a\u00e7\u0131n ve a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131rarak Docker ve Docker Compose&#8217;un do\u011fru \u015fekilde kuruldu\u011funu do\u011frulay\u0131n:<\/p>\n<pre><code>\ndocker --version\ndocker compose version\n      <\/code><\/pre>\n<p>Bu komutlar, kurulu Docker ve Docker Compose s\u00fcr\u00fcmlerini g\u00f6stermelidir. E\u011fer hata al\u0131yorsan\u0131z, kurulum ad\u0131mlar\u0131n\u0131 tekrar kontrol edin.<\/p>\n<\/li>\n<\/ol>\n<h3>Proje Yap\u0131s\u0131n\u0131 Olu\u015fturma<\/h3>\n<p>\u015eimdi projemiz i\u00e7in gerekli dizin yap\u0131s\u0131n\u0131 olu\u015ftural\u0131m. Bu yap\u0131, Laravel uygulamam\u0131z\u0131n kodunu, Nginx yap\u0131land\u0131rmas\u0131n\u0131 ve Docker ile ilgili dosyalar\u0131 d\u00fczenli bir \u015fekilde bar\u0131nd\u0131racakt\u0131r.<\/p>\n<pre><code>\nmkdir laravel-docker-app\ncd laravel-docker-app\n\n# Laravel uygulamas\u0131 i\u00e7in ana dizin\nmkdir app\n\n# Nginx yap\u0131land\u0131rmas\u0131 i\u00e7in dizin\nmkdir nginx\n\n# MySQL verileri i\u00e7in dizin (iste\u011fe ba\u011fl\u0131 ama \u00f6nerilir)\nmkdir db_data\n  <\/code><\/pre>\n<p>Bu komutlar\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra, proje dizininiz a\u015fa\u011f\u0131daki gibi g\u00f6r\u00fcnmelidir:<\/p>\n<pre><code>\nlaravel-docker-app\/\n\u251c\u2500\u2500 app\/\n\u251c\u2500\u2500 nginx\/\n\u251c\u2500\u2500 db_data\/\n\u2514\u2500\u2500 docker-compose.yml (hen\u00fcz olu\u015fturmad\u0131k)\n  <\/code><\/pre>\n<h3>Laravel Uygulamas\u0131n\u0131 Olu\u015fturma (\u0130ste\u011fe Ba\u011fl\u0131, Mevcutsa Atla)<\/h3>\n<p>E\u011fer mevcut bir Laravel projeniz yoksa, <code class=\"language-\">app<\/code> dizini i\u00e7ine yeni bir Laravel projesi olu\u015ftural\u0131m. Bunu Docker konteyneri i\u00e7inde de yapabiliriz, ancak ilk kurulum i\u00e7in yerel olarak yapmak daha pratik olabilir. E\u011fer mevcut bir Laravel projeniz varsa, <code class=\"language-\">app<\/code> dizininin i\u00e7ine kopyalaman\u0131z yeterlidir.<\/p>\n<pre><code>\n# app dizinine ge\u00e7i\u015f yap\u0131n\ncd app\n\n# Laravel kurucusu kuruluysa:\ncomposer create-project laravel\/laravel .\n\n# E\u011fer composer kurulu de\u011filse, Docker \u00fczerinden de kurabilirsiniz:\n# docker run --rm -v $(pwd):\/app composer create-project laravel\/laravel .\n  <\/code><\/pre>\n<p>Laravel projeniz <code class=\"language-\">app<\/code> dizini i\u00e7inde olu\u015ftuktan sonra, <code class=\"language-\">laravel-docker-app<\/code> ana dizinine geri d\u00f6n\u00fcn:<\/p>\n<pre><code>\ncd ..\n  <\/code><\/pre>\n<h3>Nginx Yap\u0131land\u0131rmas\u0131n\u0131 Haz\u0131rlama (<code class=\"language-\">nginx\/default.conf<\/code>)<\/h3>\n<p>Nginx, gelen HTTP isteklerini Laravel uygulamam\u0131za y\u00f6nlendirmekten sorumlu olacakt\u0131r. <code class=\"language-\">nginx<\/code> dizini i\u00e7inde <code class=\"language-\">default.conf<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m ve a\u015fa\u011f\u0131daki i\u00e7eri\u011fi ekleyelim:<\/p>\n<pre><code>\n# nginx\/default.conf\nserver {\n    listen 80;\n    server_name localhost;\n    root \/var\/www\/html\/public; # Laravel'in public dizini\n\n    index index.php index.html;\n\n    charset utf-8;\n\n    location \/ {\n        try_files $uri $uri\/ \/index.php?$query_string;\n    }\n\n    location ~ \\.php$ {\n        fastcgi_pass app:9000; # 'app' hizmetine (PHP-FPM) y\u00f6nlendir\n        fastcgi_index index.php;\n        fastcgi_buffers 16 16k;\n        fastcgi_buffer_size 32k;\n        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n        include fastcgi_params;\n    }\n\n    location ~ \/\\.ht {\n        deny all;\n    }\n}\n  <\/code><\/pre>\n<p>Bu yap\u0131land\u0131rma dosyas\u0131nda dikkat etmeniz gereken \u00f6nemli noktalar:<\/p>\n<ul>\n<li><code class=\"language-\">listen 80;<\/code>: Nginx&#8217;in 80 numaral\u0131 porttan gelen istekleri dinlemesini sa\u011flar.<\/li>\n<li><code class=\"language-\">root \/var\/www\/html\/public;<\/code>: Laravel uygulamas\u0131n\u0131n <code class=\"language-\">public<\/code> dizinini web k\u00f6k dizini olarak ayarlar.<\/li>\n<li><code class=\"language-\">fastcgi_pass app:9000;<\/code>: PHP dosyas\u0131 isteklerini, Docker Compose dosyam\u0131zda tan\u0131mlayaca\u011f\u0131m\u0131z <code class=\"language-\">app<\/code> hizmetinin (PHP-FPM) 9000 numaral\u0131 portuna y\u00f6nlendirir. Docker Compose i\u00e7indeki hizmetler, hizmet adlar\u0131 \u00fczerinden birbirleriyle ileti\u015fim kurabilirler.<\/li>\n<\/ul>\n<h3>PHP i\u00e7in Dockerfile Olu\u015fturma (<code class=\"language-\">app\/Dockerfile<\/code>)<\/h3>\n<p>Laravel uygulamam\u0131z\u0131n \u00e7al\u0131\u015faca\u011f\u0131 PHP-FPM konteynerini tan\u0131mlamak i\u00e7in <code class=\"language-\">app<\/code> dizini i\u00e7inde bir <code class=\"language-\">Dockerfile<\/code> olu\u015ftural\u0131m. Bu dosya, PHP konteynerimizin nas\u0131l in\u015fa edilece\u011fini belirler.<\/p>\n<pre><code>\n# app\/Dockerfile\nFROM php:8.2-fpm-alpine\n\n# Gerekli sistem ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00fckle\nRUN apk add --no-cache \\\n    git \\\n    curl \\\n    libpng-dev \\\n    libjpeg-turbo-dev \\\n    freetype-dev \\\n    libzip-dev \\\n    oniguruma-dev \\\n    libpq \\\n    libwebp-dev \\\n    && docker-php-ext-install -j$(nproc) gd pdo_mysql zip exif pcntl \\\n    && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \\\n    && docker-php-ext-install -j$(nproc) gd \\\n    && rm -rf \/var\/cache\/apk\/*\n\n# Composer'\u0131 kur\nCOPY --from=composer:latest \/usr\/bin\/composer \/usr\/bin\/composer\n\n# \u00c7al\u0131\u015fma dizinini ayarla\nWORKDIR \/var\/www\/html\n\n# Geli\u015ftirme i\u00e7in PHP-FPM yap\u0131land\u0131rmas\u0131n\u0131 kopyala\nCOPY php-fpm.conf \/etc\/php\/8.2\/fpm\/pool.d\/www.conf\n\n# Kullan\u0131c\u0131 ve grup olu\u015ftur\nRUN addgroup -g 1000 laravel && adduser -u 1000 -G laravel -s \/bin\/sh -D laravel\nRUN chown -R laravel:laravel \/var\/www\/html\n\nUSER laravel\n\nEXPOSE 9000\nCMD [\"php-fpm\"]\n  <\/code><\/pre>\n<p>Bu Dockerfile, PHP 8.2 FPM Alpine tabanl\u0131 bir imaj kullan\u0131r, gerekli PHP eklentilerini kurar, Composer&#8217;\u0131 ekler ve Laravel uygulamas\u0131n\u0131n \u00e7al\u0131\u015faca\u011f\u0131 <code class=\"language-\">\/var\/www\/html<\/code> dizinini ayarlar. Ayr\u0131ca, g\u00fcvenlik i\u00e7in bir <code class=\"language-\">laravel<\/code> kullan\u0131c\u0131s\u0131 olu\u015fturup uygulaman\u0131n bu kullan\u0131c\u0131 alt\u0131nda \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar\u0131z.<\/p>\n<p>Ek olarak, <code class=\"language-\">app<\/code> dizini i\u00e7inde <code class=\"language-\">php-fpm.conf<\/code> ad\u0131nda bir dosya olu\u015fturup a\u015fa\u011f\u0131daki i\u00e7eri\u011fi ekleyelim. Bu dosya, PHP-FPM&#8217;in nas\u0131l davranaca\u011f\u0131n\u0131 yap\u0131land\u0131r\u0131r.<\/p>\n<pre><code>\n# app\/php-fpm.conf\n[www]\nuser = laravel\ngroup = laravel\nlisten = 9000\nlisten.owner = laravel\nlisten.group = laravel\npm = dynamic\npm.max_children = 5\npm.start_servers = 2\npm.min_spare_servers = 1\npm.max_spare_servers = 3\ncatch_workers_output = yes\nphp_flag[display_errors] = on\nphp_admin_value[error_log] = \/var\/log\/fpm_error.log\nphp_admin_flag[log_errors] = on\n  <\/code><\/pre>\n<p>Bu yap\u0131land\u0131rma, PHP-FPM&#8217;in 9000 numaral\u0131 porttan dinlemesini, hata g\u00fcnl\u00fcklerini belirtilen dosyaya yazmas\u0131n\u0131 ve geli\u015ftirme ortam\u0131nda hatalar\u0131 g\u00f6stermesini sa\u011flar.<\/p>\n<p>Bu ad\u0131mlar\u0131 tamamlad\u0131ktan sonra, projenizin temel iskeleti haz\u0131r hale gelmi\u015f demektir. Bir sonraki b\u00f6l\u00fcmde, t\u00fcm bu bile\u015fenleri bir araya getirecek olan <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131n\u0131 olu\u015fturaca\u011f\u0131z.<\/p>\n<h2>Docker Compose Dosyas\u0131n\u0131 Olu\u015fturma: Hizmetleri Tan\u0131mlama<\/h2>\n<p>\u015eimdi projemizin kalbi olan <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131n\u0131 olu\u015fturma zaman\u0131 geldi. Bu dosya, Laravel uygulamam\u0131z\u0131n, Nginx web sunucumuzun ve MySQL veritaban\u0131m\u0131z\u0131n Docker konteynerlerini nas\u0131l tan\u0131mlayaca\u011f\u0131m\u0131z\u0131, birbirleriyle nas\u0131l ileti\u015fim kuracaklar\u0131n\u0131 ve hangi kaynaklar\u0131 kullanacaklar\u0131n\u0131 belirler. Ana dizinimizde (<code>laravel-docker-app\/<\/code>) <code>docker-compose.yml<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m ve a\u015fa\u011f\u0131daki i\u00e7eri\u011fi ad\u0131m ad\u0131m inceleyelim.<\/p>\n<pre><code class=\"language-yaml\">\n# docker-compose.yml\nversion: '3.8'\n\nservices:\n  # Laravel Uygulama Hizmeti (PHP-FPM)\n  app:\n    build:\n      context: .\/app\n      dockerfile: Dockerfile\n    container_name: laravel_app\n    restart: unless-stopped\n    volumes:\n      - .\/app:\/var\/www\/html\n    networks:\n      - laravel_network\n    environment:\n      # Laravel .env dosyas\u0131ndaki veritaban\u0131 ba\u011flant\u0131 bilgilerini burada tan\u0131mlayaca\u011f\u0131z\n      DB_CONNECTION: mysql\n      DB_HOST: db # MySQL hizmetinin ad\u0131\n      DB_PORT: 3306\n      DB_DATABASE: laravel_db\n      DB_USERNAME: laravel_user\n      DB_PASSWORD: supersecretpassword\n      APP_ENV: local\n      APP_DEBUG: \"true\"\n      # Di\u011fer Laravel ortam de\u011fi\u015fkenleri buraya eklenebilir\n\n  # Nginx Web Sunucusu Hizmeti\n  nginx:\n    image: nginx:stable-alpine\n    container_name: laravel_nginx\n    restart: unless-stopped\n    ports:\n      - \"80:80\" # Host'un 80. portunu konteynerin 80. portuna y\u00f6nlendir\n    volumes:\n      - .\/nginx:\/etc\/nginx\/conf.d\n      - .\/app:\/var\/www\/html # Laravel uygulamas\u0131n\u0131n kodunu Nginx'e ba\u011fla\n    networks:\n      - laravel_network\n    depends_on:\n      - app # Nginx'in app hizmetine ba\u011f\u0131ml\u0131 oldu\u011funu belirtir\n\n  # MySQL Veritaban\u0131 Hizmeti\n  db:\n    image: mysql:8.0\n    container_name: laravel_db\n    restart: unless-stopped\n    environment:\n      MYSQL_DATABASE: laravel_db\n      MYSQL_USER: laravel_user\n      MYSQL_PASSWORD: supersecretpassword\n      MYSQL_ROOT_PASSWORD: rootpassword\n    volumes:\n      - db_data:\/var\/lib\/mysql # Veritaban\u0131 verilerini kal\u0131c\u0131 hale getir\n    networks:\n      - laravel_network\n\nvolumes:\n  db_data: # MySQL verileri i\u00e7in isimlendirilmi\u015f bir volume tan\u0131mla\n\nnetworks:\n  laravel_network:\n    driver: bridge\n  <\/code><\/pre>\n<p>Bu YAML dosyas\u0131n\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayal\u0131m:<\/p>\n<ol>\n<li>\n      <strong><code>version: '3.8'<\/code>:<\/strong> Docker Compose dosyas\u0131n\u0131n versiyonunu belirtir. Genellikle en yeni stabil s\u00fcr\u00fcm kullan\u0131l\u0131r.\n    <\/li>\n<li>\n      <strong><code>services:<\/code>:<\/strong> Uygulamam\u0131z\u0131n t\u00fcm bile\u015fenlerini (hizmetlerini) burada tan\u0131mlar\u0131z. Her hizmet kendi konteynerinde \u00e7al\u0131\u015facakt\u0131r.<\/p>\n<ul>\n<li>\n          <strong><code>app:<\/code> (Laravel Uygulama Hizmeti):<\/strong><\/p>\n<ul>\n<li><code>build:<\/code>: Bu hizmet i\u00e7in bir Docker imaj\u0131n\u0131n nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131 belirtir.<\/li>\n<li><code>context: .\/app<\/code>: Docker imaj\u0131n\u0131 olu\u015ftururken <code class=\"language-\">app<\/code> dizinini temel al\u0131r.<\/li>\n<li><code>dockerfile: Dockerfile<\/code>: <code class=\"language-\">app<\/code> dizini i\u00e7indeki <code class=\"language-\">Dockerfile<\/code> dosyas\u0131n\u0131 kullan\u0131r.<\/li>\n<li><code>container_name: laravel_app<\/code>: Konteyner i\u00e7in okunabilir bir isim atar.<\/li>\n<li><code>restart: unless-stopped<\/code>: Konteynerin durdurulmad\u0131\u011f\u0131 s\u00fcrece otomatik olarak yeniden ba\u015flamas\u0131n\u0131 sa\u011flar.<\/li>\n<li><code>volumes:<\/code>: Ana makine ile konteyner aras\u0131nda dosya veya dizin payla\u015f\u0131m\u0131 sa\u011flar.\n<ul>\n<li><code>.\/app:\/var\/www\/html<\/code>: Ana makinedeki <code class=\"language-\">app<\/code> dizinini, konteyner i\u00e7indeki Laravel uygulamas\u0131n\u0131n \u00e7al\u0131\u015faca\u011f\u0131 <code class=\"language-\">\/var\/www\/html<\/code> dizinine ba\u011flar. Bu sayede, kod de\u011fi\u015fiklikleri an\u0131nda konteyner i\u00e7inde yans\u0131r ve geli\u015ftirme s\u00fcrecini kolayla\u015ft\u0131r\u0131r.<\/li>\n<\/ul>\n<\/li>\n<li><code>networks:<\/code>: Konteynerin hangi a\u011flara ba\u011fl\u0131 olaca\u011f\u0131n\u0131 belirtir.<\/li>\n<li><code>environment:<\/code>: Konteyner i\u00e7inde kullan\u0131lacak ortam de\u011fi\u015fkenlerini tan\u0131mlar. Burada Laravel&#8217;in veritaban\u0131 ba\u011flant\u0131 bilgileri ve di\u011fer \u00f6nemli ayarlar\u0131 bulunur. <code>DB_HOST: db<\/code> ifadesi, <code>db<\/code> ad\u0131ndaki MySQL hizmetine ba\u011flanaca\u011f\u0131m\u0131z\u0131 g\u00f6sterir.<\/li>\n<\/ul>\n<\/li>\n<li>\n          <strong><code>nginx:<\/code> (Nginx Web Sunucusu Hizmeti):<\/strong><\/p>\n<ul>\n<li><code>image: nginx:stable-alpine<\/code>: Nginx&#8217;in resmi stabil-alpine imaj\u0131n\u0131 kullan\u0131r\u0131z. Alpine tabanl\u0131 imajlar daha k\u00fc\u00e7\u00fckt\u00fcr ve kaynaklar\u0131 daha verimli kullan\u0131r.<\/li>\n<li><code>ports:<\/code>: Ana makine ile konteyner aras\u0131ndaki port e\u015fle\u015ftirmelerini yapar.\n<ul>\n<li><code>\"80:80\"<\/code>: Ana makinenin 80 numaral\u0131 portundan gelen istekleri Nginx konteynerinin 80 numaral\u0131 portuna y\u00f6nlendirir. B\u00f6ylece taray\u0131c\u0131n\u0131zdan <code class=\"language-\">http:\/\/localhost<\/code> adresine eri\u015febilirsiniz.<\/li>\n<\/ul>\n<\/li>\n<li><code>volumes:<\/code>:\n<ul>\n<li><code>.\/nginx:\/etc\/nginx\/conf.d<\/code>: Ana makinedeki <code class=\"language-\">nginx<\/code> dizinini, Nginx&#8217;in yap\u0131land\u0131rma dosyalar\u0131n\u0131 bar\u0131nd\u0131ran konteyner dizinine ba\u011flar. Daha \u00f6nce olu\u015fturdu\u011fumuz <code class=\"language-\">default.conf<\/code> dosyas\u0131 bu sayede okunur.<\/li>\n<li><code>.\/app:\/var\/www\/html<\/code>: Laravel uygulama kodunu Nginx&#8217;e de ba\u011flar, b\u00f6ylece Nginx statik dosyalar\u0131 sunabilir ve PHP-FPM&#8217;e istekleri y\u00f6nlendirebilir.<\/li>\n<\/ul>\n<\/li>\n<li><code>depends_on: - app<\/code>: Nginx&#8217;in <code class=\"language-\">app<\/code> hizmeti ba\u015flamadan \u00f6nce ba\u015flamamas\u0131n\u0131 sa\u011flar. Bu, servisler aras\u0131 ba\u015flatma s\u0131ras\u0131n\u0131 y\u00f6netmeye yard\u0131mc\u0131 olur.<\/li>\n<\/ul>\n<\/li>\n<li>\n          <strong><code>db:<\/code> (MySQL Veritaban\u0131 Hizmeti):<\/strong><\/p>\n<ul>\n<li><code>image: mysql:8.0<\/code>: MySQL veritaban\u0131n\u0131n 8.0 s\u00fcr\u00fcm\u00fcn\u00fc kullan\u0131r\u0131z.<\/li>\n<li><code>environment:<\/code>: MySQL i\u00e7in gerekli ortam de\u011fi\u015fkenlerini ayarlar. Veritaban\u0131 ad\u0131, kullan\u0131c\u0131 ad\u0131, \u015fifre ve root \u015fifresi burada tan\u0131mlan\u0131r. Bu de\u011ferlerin Laravel uygulamas\u0131n\u0131n ortam de\u011fi\u015fkenleriyle e\u015fle\u015fti\u011finden emin olun.<\/li>\n<li><code>volumes:<\/code>:\n<ul>\n<li><code>db_data:\/var\/lib\/mysql<\/code>: Bu, MySQL verilerinin kal\u0131c\u0131 olmas\u0131n\u0131 sa\u011flayan kritik bir ad\u0131md\u0131r. <code class=\"language-\">db_data<\/code> ad\u0131nda bir <a href=\"#named-volumes\">named volume<\/a> tan\u0131mlar\u0131z. Konteyner silinse bile, bu volume i\u00e7indeki veriler korunur ve bir sonraki ba\u015flatmada tekrar kullan\u0131labilir.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n      <strong><code>volumes:<\/code>:<\/strong> Docker Compose dosyas\u0131n\u0131n sonunda, t\u00fcm named volume&#8217;leri tan\u0131mlar\u0131z.<\/p>\n<ul>\n<li><a name=\"named-volumes\"><code>db_data:<\/code><\/a>: MySQL i\u00e7in kulland\u0131\u011f\u0131m\u0131z named volume&#8217;\u00fc burada tan\u0131mlar\u0131z. Docker bu volume&#8217;\u00fc otomatik olarak olu\u015fturur ve y\u00f6netir.<\/li>\n<\/ul>\n<\/li>\n<li>\n      <strong><code>networks:<\/code>:<\/strong> T\u00fcm hizmetlerin ileti\u015fim kurabilece\u011fi \u00f6zel bir Docker a\u011f\u0131 tan\u0131mlar\u0131z.<\/p>\n<ul>\n<li><code>laravel_network:<\/code>: T\u00fcm hizmetlerimiz bu a\u011fa ba\u011flan\u0131r. <code>driver: bridge<\/code> varsay\u0131lan a\u011f s\u00fcr\u00fcc\u00fcs\u00fcd\u00fcr ve hizmetlerin birbirini isimleriyle bulmas\u0131n\u0131 sa\u011flar (\u00f6rne\u011fin, <code class=\"language-\">app<\/code> hizmeti <code class=\"language-\">db<\/code> hizmetine <code class=\"language-\">db<\/code> ad\u0131yla eri\u015febilir).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>Bu <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131, uygulaman\u0131z\u0131n t\u00fcm altyap\u0131s\u0131n\u0131 tek bir dosyada tan\u0131mlaman\u0131za olanak tan\u0131r. Art\u0131k t\u00fcm bile\u015fenler bir araya geldi\u011fine g\u00f6re, bir sonraki ad\u0131mda bu ortam\u0131 nas\u0131l ba\u015flataca\u011f\u0131m\u0131z\u0131 ve Laravel uygulamas\u0131n\u0131 nas\u0131l \u00e7al\u0131\u015ft\u0131raca\u011f\u0131m\u0131z\u0131 g\u00f6rece\u011fiz.<\/p>\n<h2>Laravel Uygulamas\u0131n\u0131 Konteynerize Etme ve Ba\u015flatma<\/h2>\n<p>T\u00fcm yap\u0131land\u0131rma dosyalar\u0131m\u0131z\u0131 haz\u0131rlad\u0131\u011f\u0131m\u0131za g\u00f6re, art\u0131k Laravel uygulamam\u0131z\u0131 Docker Compose ile ba\u015flatmaya haz\u0131r\u0131z. Bu b\u00f6l\u00fcm, Docker Compose ortam\u0131n\u0131 nas\u0131l aya\u011fa kald\u0131raca\u011f\u0131m\u0131z\u0131, Laravel&#8217;in ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 nas\u0131l kuraca\u011f\u0131m\u0131z\u0131 ve veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 nas\u0131l test edece\u011fimizi detayland\u0131racak. Ayr\u0131ca, k\u00fc\u00e7\u00fck bir e-ticaret uygulamas\u0131n\u0131n ba\u015flang\u0131\u00e7 kurulumu \u00fczerinden bir vaka analizi sunaca\u011f\u0131z.<\/p>\n<h3>Ortam\u0131 Ba\u015flatma: Sihirli Komut<\/h3>\n<p>Proje ana dizininizde (<code>laravel-docker-app\/<\/code>) terminali a\u00e7\u0131n ve a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code>\ndocker compose up -d --build\n  <\/code><\/pre>\n<p>Bu komutun ne anlama geldi\u011fini a\u00e7\u0131klayal\u0131m:<\/p>\n<ul>\n<li><code>docker compose up<\/code>: Docker Compose dosyas\u0131nda tan\u0131mlanan t\u00fcm hizmetleri (<code>app<\/code>, <code>nginx<\/code>, <code>db<\/code>) ba\u015flat\u0131r.<\/li>\n<li><code>-d<\/code> (detach): Konteynerleri arka planda \u00e7al\u0131\u015ft\u0131r\u0131r, b\u00f6ylece terminalinizi serbest b\u0131rak\u0131r.<\/li>\n<li><code>--build<\/code>: Hizmetler i\u00e7in Docker imajlar\u0131n\u0131 (\u00f6zellikle <code>app<\/code> hizmeti i\u00e7in <code class=\"language-\">Dockerfile<\/code>&#8216;\u0131 kullanarak) yeniden olu\u015fturur. Bu, ilk \u00e7al\u0131\u015ft\u0131rma veya <code class=\"language-\">Dockerfile<\/code>&#8216;da de\u011fi\u015fiklik yapt\u0131\u011f\u0131n\u0131zda \u00f6nemlidir.<\/li>\n<\/ul>\n<p>Komutu \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra, Docker Compose imajlar\u0131 indirecek (e\u011fer yerel olarak yoksa), <code class=\"language-\">app<\/code> hizmeti i\u00e7in Dockerfile&#8217;\u0131 kullanarak imaj\u0131 olu\u015fturacak ve t\u00fcm konteynerleri ba\u015flatacakt\u0131r. Bu i\u015flem biraz zaman alabilir, \u00f6zellikle ilk \u00e7al\u0131\u015ft\u0131rmada.<\/p>\n<p>Konteynerlerin durumunu kontrol etmek i\u00e7in a\u015fa\u011f\u0131daki komutu kullanabilirsiniz:<\/p>\n<pre><code>\ndocker compose ps\n  <\/code><\/pre>\n<p>T\u00fcm hizmetlerin <code class=\"language-\">Up<\/code> (\u00e7al\u0131\u015f\u0131yor) durumda oldu\u011funu g\u00f6rmelisiniz.<\/p>\n<h3>Laravel Ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 Kurma ve Uygulamay\u0131 Haz\u0131rlama<\/h3>\n<p>Konteynerler \u00e7al\u0131\u015fmaya ba\u015flad\u0131ktan sonra, Laravel uygulamas\u0131n\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 (Composer paketleri) kurmam\u0131z ve di\u011fer ba\u015flang\u0131\u00e7 ayarlar\u0131n\u0131 yapmam\u0131z gerekiyor. Bu i\u015flemleri, Laravel uygulamas\u0131n\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 <code class=\"language-\">app<\/code> konteyneri i\u00e7inde yapaca\u011f\u0131z.<\/p>\n<p>Laravel konteynerine ba\u011flanmak i\u00e7in a\u015fa\u011f\u0131daki komutu kullan\u0131n:<\/p>\n<pre><code>\ndocker compose exec app bash\n  <\/code><\/pre>\n<p>Bu komut, <code class=\"language-\">laravel_app<\/code> adl\u0131 konteynerin i\u00e7ine bir <code class=\"language-\">bash<\/code> oturumu a\u00e7ar. Art\u0131k konteynerin i\u00e7indesiniz ve Laravel projenizin k\u00f6k dizini olan <code class=\"language-\">\/var\/www\/html<\/code> konumundas\u0131n\u0131z.<\/p>\n<p>\u015eimdi Laravel i\u00e7in gerekli ad\u0131mlar\u0131 tamamlayal\u0131m:<\/p>\n<ol>\n<li>\n      <strong>Composer Ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 Kurma:<\/strong><\/p>\n<pre><code>\ncomposer install\n      <\/code><\/pre>\n<p>Bu komut, <code class=\"language-\">composer.json<\/code> dosyas\u0131ndaki t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckleyecektir. E\u011fer daha \u00f6nce <code class=\"language-\">composer create-project<\/code> ile Laravel&#8217;i kurduysan\u0131z bu ad\u0131m zaten yap\u0131lm\u0131\u015f olabilir, ancak yine de \u00e7al\u0131\u015ft\u0131rmak zarar vermez.<\/p>\n<\/li>\n<li>\n      <strong><code class=\"language-\">.env<\/code> Dosyas\u0131n\u0131 Olu\u015fturma:<\/strong><\/p>\n<pre><code>\ncp .env.example .env\n      <\/code><\/pre>\n<p>Laravel&#8217;in ortam de\u011fi\u015fkenleri i\u00e7in <code class=\"language-\">.env<\/code> dosyas\u0131n\u0131 olu\u015fturur. Bu dosya, <code class=\"language-\">docker-compose.yml<\/code> i\u00e7inde tan\u0131mlad\u0131\u011f\u0131m\u0131z <code class=\"language-\">environment<\/code> de\u011fi\u015fkenlerini ge\u00e7ersiz k\u0131labilir. Bu y\u00fczden dikkatli olun.<\/p>\n<\/li>\n<li>\n      <strong>Uygulama Anahtar\u0131n\u0131 Olu\u015fturma:<\/strong><\/p>\n<pre><code>\nphp artisan key:generate\n      <\/code><\/pre>\n<p>Laravel uygulaman\u0131z i\u00e7in benzersiz bir \u015fifreleme anahtar\u0131 olu\u015fturur. Bu ad\u0131m g\u00fcvenlik i\u00e7in zorunludur.<\/p>\n<\/li>\n<li>\n      <strong>Veritaban\u0131 Migrasyonlar\u0131n\u0131 \u00c7al\u0131\u015ft\u0131rma:<\/strong><\/p>\n<pre><code>\nphp artisan migrate\n      <\/code><\/pre>\n<p>Bu komut, Laravel&#8217;in veritaban\u0131 \u015femalar\u0131n\u0131 MySQL veritaban\u0131m\u0131za uygular. E\u011fer bu ad\u0131mda bir hata al\u0131rsan\u0131z, genellikle veritaban\u0131 ba\u011flant\u0131 bilgilerinizde (<code>.env<\/code> dosyas\u0131nda veya <code>docker-compose.yml<\/code>&#8216;deki <code>environment<\/code> k\u0131sm\u0131nda) bir sorun oldu\u011fu anlam\u0131na gelir. <code>DB_HOST<\/code>&#8216;un <code>db<\/code> oldu\u011fundan emin olun.<\/p>\n<\/li>\n<\/ol>\n<p>Bu ad\u0131mlar\u0131 tamamlad\u0131ktan sonra, <code class=\"language-\">exit<\/code> yazarak konteynerden \u00e7\u0131kabilirsiniz.<\/p>\n<h3>Uygulamay\u0131 Taray\u0131c\u0131da G\u00f6r\u00fcnt\u00fcleme<\/h3>\n<p>T\u00fcm ad\u0131mlar\u0131 ba\u015far\u0131yla tamamlad\u0131ysan\u0131z, web taray\u0131c\u0131n\u0131z\u0131 a\u00e7\u0131n ve <code class=\"language-\">http:\/\/localhost<\/code> adresine gidin. Laravel&#8217;in varsay\u0131lan kar\u015f\u0131lama sayfas\u0131n\u0131 g\u00f6rmelisiniz. Bu, Laravel uygulaman\u0131z\u0131n Nginx \u00fczerinden ba\u015far\u0131yla \u00e7al\u0131\u015ft\u0131\u011f\u0131 ve veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131n da do\u011fru oldu\u011fu anlam\u0131na gelir.<\/p>\n<h3>Vaka Analizi: K\u00fc\u00e7\u00fck Bir E-Ticaret Uygulamas\u0131n\u0131n Ba\u015flang\u0131\u00e7 Kurulumu<\/h3>\n<p>Hayal edelim ki, &#8220;ShopEase&#8221; ad\u0131nda yeni bir e-ticaret platformu geli\u015ftiriyorsunuz. Bu platformun \u00fcr\u00fcn listeleme, sepet ve \u00f6deme gibi temel \u00f6zelliklere sahip olmas\u0131 gerekiyor. Geli\u015ftirme ekibiniz \u00fc\u00e7 ki\u015fiden olu\u015fuyor ve herkesin ayn\u0131 ortamda \u00e7al\u0131\u015fmas\u0131 kritik. Geleneksel y\u00f6ntemlerle, her geli\u015ftiricinin kendi makinesinde PHP, Nginx ve MySQL&#8217;i kurmas\u0131, versiyon farkl\u0131l\u0131klar\u0131 ve ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131 nedeniyle zaman kayb\u0131na yol a\u00e7acakt\u0131.<\/p>\n<p>Docker Compose ile bu s\u00fcreci nas\u0131l basitle\u015ftirebiliriz?<\/p>\n<ul>\n<li>\n      <strong>Tutarl\u0131l\u0131k:<\/strong> Yukar\u0131daki <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131n\u0131 ve <code class=\"language-\">Dockerfile<\/code>&#8216;\u0131 kullanarak, t\u00fcm ekip \u00fcyeleri ayn\u0131 PHP s\u00fcr\u00fcm\u00fc, Nginx yap\u0131land\u0131rmas\u0131 ve MySQL versiyonuyla \u00e7al\u0131\u015f\u0131r. <code class=\"language-\">git clone<\/code> ve <code class=\"language-\">docker compose up -d --build<\/code> komutlar\u0131, herkesin saniyeler i\u00e7inde geli\u015ftirme ortam\u0131n\u0131 kurmas\u0131n\u0131 sa\u011flar.\n    <\/li>\n<li>\n      <strong>H\u0131zl\u0131 Geli\u015ftirme:<\/strong> <code class=\"language-\">volumes<\/code> sayesinde, geli\u015ftiriciler ana makinedeki kod dosyalar\u0131n\u0131 d\u00fczenlerken, de\u011fi\u015fiklikler an\u0131nda konteyner i\u00e7inde yans\u0131r. Bu, anl\u0131k geri bildirim sa\u011flar ve geli\u015ftirme d\u00f6ng\u00fcs\u00fcn\u00fc h\u0131zland\u0131r\u0131r.\n    <\/li>\n<li>\n      <strong>Veritaban\u0131 Y\u00f6netimi:<\/strong> <code class=\"language-\">db_data<\/code> volume&#8217;\u00fc sayesinde, veritaban\u0131 verileri kal\u0131c\u0131 hale gelir. Geli\u015ftiriciler konteynerleri durdurup ba\u015flatsa bile verileri kaybolmaz. Ayr\u0131ca, <code class=\"language-\">php artisan migrate<\/code> komutuyla veritaban\u0131 \u015femas\u0131 kolayca y\u00f6netilebilir.\n    <\/li>\n<\/ul>\n<p>ShopEase projesinin ilk a\u015famas\u0131nda, bu kurulum sayesinde ekip, altyap\u0131 sorunlar\u0131yla u\u011fra\u015fmak yerine do\u011frudan \u00fcr\u00fcn kataloglama ve kullan\u0131c\u0131 kimlik do\u011frulama gibi temel e-ticaret \u00f6zelliklerini geli\u015ftirmeye odaklanabilir. Bu, projenin daha h\u0131zl\u0131 ilerlemesini ve pazara daha erken \u00e7\u0131kmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>\u0130leri D\u00fczey \u0130pu\u00e7lar\u0131 ve Optimizasyonlar: Performans ve G\u00fcvenlik<\/h2>\n<p>Docker Compose ile temel Laravel, Nginx ve MySQL kurulumunu ba\u015far\u0131yla tamamlad\u0131k. Ancak, geli\u015ftirme ortam\u0131n\u0131z\u0131 daha verimli, g\u00fcvenli ve ger\u00e7ek d\u00fcnya senaryolar\u0131na daha uygun hale getirmek i\u00e7in yapabilece\u011finiz baz\u0131 ileri d\u00fczey optimizasyonlar ve ipu\u00e7lar\u0131 bulunmaktad\u0131r. Bu b\u00f6l\u00fcmde, performans\u0131 art\u0131rmak, g\u00fcvenli\u011fi sa\u011flamak ve geli\u015ftirme s\u00fcrecinizi daha da kolayla\u015ft\u0131rmak i\u00e7in kullanabilece\u011finiz tekniklere de\u011finece\u011fiz.<\/p>\n<h3>Volume Ba\u011flaman\u0131n \u00d6nemi ve Kal\u0131c\u0131 Veri Y\u00f6netimi<\/h3>\n<p>Daha \u00f6nce MySQL verileri i\u00e7in bir &#8220;named volume&#8221; (<code>db_data<\/code>) tan\u0131mlam\u0131\u015ft\u0131k. Bu, konteynerler silinse bile veritaban\u0131 verilerinizin kaybolmamas\u0131n\u0131 sa\u011flar. Ancak, sadece veritaban\u0131 verileri de\u011fil, uygulaman\u0131z\u0131n di\u011fer kal\u0131c\u0131 verileri (\u00f6rne\u011fin, kullan\u0131c\u0131 taraf\u0131ndan y\u00fcklenen dosyalar, loglar) i\u00e7in de volume kullanmak \u00f6nemlidir.<\/p>\n<p>\u00d6rne\u011fin, Laravel uygulaman\u0131z\u0131n <code class=\"language-\">storage<\/code> dizini i\u00e7ine y\u00fcklenen resimler veya di\u011fer dosyalar varsa, bu dizini de kal\u0131c\u0131 hale getirmek isteyebilirsiniz. <code class=\"language-\">docker-compose.yml<\/code> dosyan\u0131zda <code class=\"language-\">app<\/code> hizmeti alt\u0131na ek bir volume tan\u0131mlayabilirsiniz:<\/p>\n<pre><code class=\"language-yaml\">\n# docker-compose.yml (app hizmeti alt\u0131nda)\n  app:\n    # ... di\u011fer ayarlar ...\n    volumes:\n      - .\/app:\/var\/www\/html\n      - app_storage:\/var\/www\/html\/storage # Yeni volume\n    # ...\n# ...\nvolumes:\n  db_data:\n  app_storage: # Yeni named volume tan\u0131m\u0131\n  <\/code><\/pre>\n<p>Bu \u015fekilde, <code class=\"language-\">app_storage<\/code> ad\u0131nda yeni bir named volume olu\u015fturulur ve Laravel&#8217;in <code class=\"language-\">storage<\/code> dizini bu volume&#8217;e ba\u011flan\u0131r. B\u00f6ylece, kullan\u0131c\u0131lar taraf\u0131ndan y\u00fcklenen dosyalar konteynerin ya\u015fam d\u00f6ng\u00fcs\u00fcnden ba\u011f\u0131ms\u0131z olarak kal\u0131c\u0131 hale gelir.<\/p>\n<h3>\u00d6zel Docker A\u011flar\u0131 ve Hizmetler Aras\u0131 \u0130leti\u015fim<\/h3>\n<p>Docker Compose ile varsay\u0131lan olarak bir k\u00f6pr\u00fc a\u011f\u0131 (bridge network) olu\u015fturulur ve t\u00fcm hizmetler bu a\u011fa ba\u011flan\u0131r. Bu, hizmetlerin birbirini isimleriyle bulmas\u0131n\u0131 sa\u011flar (\u00f6rne\u011fin, <code class=\"language-\">app<\/code> konteyneri <code class=\"language-\">db<\/code> konteynerine <code class=\"language-\">db<\/code> host ad\u0131yla ba\u011flanabilir). Bu yap\u0131land\u0131rma \u00e7o\u011fu geli\u015ftirme ortam\u0131 i\u00e7in yeterlidir.<\/p>\n<p>Ancak, daha karma\u015f\u0131k senaryolarda veya mikroservis mimarilerinde, farkl\u0131 hizmet gruplar\u0131 i\u00e7in \u00f6zel a\u011flar tan\u0131mlamak isteyebilirsiniz. \u00d6rne\u011fin, bir API hizmeti ile bir UI hizmetini farkl\u0131 a\u011flarda izole edebilir ve sadece belirli kap\u0131lar \u00fczerinden ileti\u015fim kurmalar\u0131na izin verebilirsiniz. Bu, a\u011f g\u00fcvenli\u011fini art\u0131r\u0131r.<\/p>\n<p>Mevcut <code class=\"language-\">laravel_network<\/code> tan\u0131m\u0131m\u0131z zaten \u00f6zel bir a\u011fd\u0131r ve hizmetlerin g\u00fcvenli bir \u015fekilde ileti\u015fim kurmas\u0131n\u0131 sa\u011flar. Bu, varsay\u0131lan Docker a\u011f\u0131na g\u00f6re daha iyi bir izolasyon sunar.<\/p>\n<h3>Ortam De\u011fi\u015fkenleri ve .env Dosyas\u0131n\u0131n Etkin Kullan\u0131m\u0131<\/h3>\n<p>Hassas bilgileri (veritaban\u0131 \u015fifreleri, API anahtarlar\u0131) do\u011frudan <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131na yazmak yerine, Laravel&#8217;in kendi <code class=\"language-\">.env<\/code> dosyas\u0131n\u0131 kullanmak daha iyi bir yakla\u015f\u0131md\u0131r. <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131nda <code class=\"language-\">environment<\/code> b\u00f6l\u00fcm\u00fcnde tan\u0131mlad\u0131\u011f\u0131n\u0131z de\u011fi\u015fkenler, Laravel&#8217;in konteynerinde ortam de\u011fi\u015fkenleri olarak ayarlan\u0131r. Laravel, kendi <code class=\"language-\">.env<\/code> dosyas\u0131ndaki de\u011ferleri bu ortam de\u011fi\u015fkenleriyle birle\u015ftirir ve genellikle <code class=\"language-\">.env<\/code> dosyas\u0131ndaki de\u011ferler \u00f6nceliklidir.<\/p>\n<p>\u00dcretim ortamlar\u0131nda ise, hassas bilgileri Docker Secret&#8217;lar veya bulut sa\u011flay\u0131c\u0131s\u0131n\u0131n gizli y\u00f6netim hizmetleri arac\u0131l\u0131\u011f\u0131yla y\u00f6netmek \u00e7ok daha g\u00fcvenlidir. Geli\u015ftirme ortam\u0131nda, <code class=\"language-\">.env<\/code> dosyas\u0131n\u0131 <code class=\"language-\">.gitignore<\/code>&#8216;a ekleyerek hassas bilgilerin versiyon kontrol sistemine girmesini engelleyin ve ekip \u00fcyelerinin kendi yerel <code class=\"language-\">.env<\/code> dosyalar\u0131n\u0131 olu\u015fturmalar\u0131n\u0131 sa\u011flay\u0131n.<\/p>\n<h3>Performans \u0130pu\u00e7lar\u0131: Caching ve OPcache<\/h3>\n<p>Laravel uygulamalar\u0131n\u0131n performans\u0131n\u0131 art\u0131rmak i\u00e7in PHP&#8217;nin OPcache&#8217;ini ve Laravel&#8217;in kendi caching mekanizmalar\u0131n\u0131 kullanmak \u00f6nemlidir. Dockerfile&#8217;\u0131n\u0131zda OPcache&#8217;i etkinle\u015ftirebilirsiniz:<\/p>\n<pre><code class=\"language-dockerfile\">\n# app\/Dockerfile (mevcut RUN komutuna eklenebilir)\n# ...\nRUN apk add --no-cache \\\n    # ... di\u011fer ba\u011f\u0131ml\u0131l\u0131klar ...\n    && docker-php-ext-install opcache \\\n    && { \\\n        echo \"opcache.enable=1\"; \\\n        echo \"opcache.revalidate_freq=0\"; \\\n        echo \"opcache.use_cwd=1\"; \\\n        echo \"opcache.validate_timestamps=1\"; \\\n        echo \"opcache.max_accelerated_files=10000\"; \\\n        echo \"opcache.memory_consumption=128\"; \\\n        echo \"opcache.interned_strings_buffer=8\"; \\\n        echo \"opcache.fast_shutdown=1\"; \\\n    } > \/usr\/local\/etc\/php\/conf.d\/opcache.ini \\\n    && rm -rf \/var\/cache\/apk\/*\n# ...\n  <\/code><\/pre>\n<p>Ayr\u0131ca, Laravel&#8217;in kendi \u00f6nbellekleme komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rarak (konteyner i\u00e7inde):<\/p>\n<pre><code>\nphp artisan config:cache\nphp artisan route:cache\nphp artisan view:cache\n  <\/code><\/pre>\n<p>Uygulaman\u0131z\u0131n daha h\u0131zl\u0131 yan\u0131t vermesini sa\u011flayabilirsiniz. Bu komutlar\u0131 genellikle da\u011f\u0131t\u0131m \u00f6ncesi \u00fcretim ortam\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131rs\u0131n\u0131z. Geli\u015ftirme ortam\u0131nda ise, kod de\u011fi\u015fikliklerinin an\u0131nda g\u00f6r\u00fcnmesi i\u00e7in genellikle \u00f6nbellek devre d\u0131\u015f\u0131 b\u0131rak\u0131l\u0131r veya s\u0131k s\u0131k temizlenir.<\/p>\n<h3>G\u00fcvenlik \u00d6nlemleri: Root Kullan\u0131c\u0131dan Ka\u00e7\u0131nma ve Portlar\u0131 S\u0131n\u0131rlama<\/h3>\n<ul>\n<li>\n      <strong>Root Kullan\u0131c\u0131dan Ka\u00e7\u0131nma:<\/strong> <code class=\"language-\">Dockerfile<\/code>&#8216;da <code class=\"language-\">USER laravel<\/code> komutunu kullanarak, uygulaman\u0131z\u0131n <code class=\"language-\">root<\/code> olmayan bir kullan\u0131c\u0131 alt\u0131nda \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flad\u0131k. Bu, bir g\u00fcvenlik ihlali durumunda sald\u0131rgan\u0131n sistem \u00fczerinde tam yetki elde etmesini zorla\u015ft\u0131r\u0131r. Bu iyi bir uygulamad\u0131r ve her zaman uygulanmal\u0131d\u0131r.\n    <\/li>\n<li>\n      <strong>Portlar\u0131 S\u0131n\u0131rlama:<\/strong> <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131nda sadece gerekli portlar\u0131 d\u0131\u015far\u0131ya a\u00e7t\u0131k (Nginx i\u00e7in 80). Veritaban\u0131 (MySQL 3306) veya PHP-FPM (9000) gibi hizmetlerin portlar\u0131n\u0131 do\u011frudan ana makineye a\u00e7mad\u0131k. Bu, d\u0131\u015far\u0131dan gelebilecek sald\u0131r\u0131lara kar\u015f\u0131 y\u00fczeyi k\u00fc\u00e7\u00fclt\u00fcr ve g\u00fcvenli\u011fi art\u0131r\u0131r. Hizmetler, Docker a\u011flar\u0131 \u00fczerinden kendi i\u00e7lerinde g\u00fcvenli bir \u015fekilde ileti\u015fim kurabilirler.\n    <\/li>\n<\/ul>\n<h3>Vaka Analizi: Y\u00fcksek Trafikli Bir Blog Sitesinin Docker Compose ile Optimize Edilmesi<\/h3>\n<p>Bir haber portal\u0131 olan &#8220;HaberJet&#8221;in binlerce g\u00fcnl\u00fck ziyaret\u00e7isi oldu\u011funu ve Docker Compose ile y\u00f6netildi\u011fini d\u00fc\u015f\u00fcnelim. \u0130lk kurulum, Laravel, Nginx ve MySQL&#8217;i i\u00e7eriyor ancak trafik artt\u0131k\u00e7a performans sorunlar\u0131 ya\u015fanmaya ba\u015fl\u0131yor.<\/p>\n<p><strong>Optimizasyon Ad\u0131mlar\u0131:<\/strong><\/p>\n<ol>\n<li>\n      <strong>Redis Caching Entegrasyonu:<\/strong> HaberJet, okuyucular\u0131n yorumlar\u0131n\u0131 ve makale i\u00e7eriklerini \u00f6nbelle\u011fe almak i\u00e7in Redis&#8217;i kullanmaya karar verdi. <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131na yeni bir <code class=\"language-\">redis<\/code> hizmeti eklendi ve Laravel&#8217;in <code class=\"language-\">.env<\/code> dosyas\u0131nda <code class=\"language-\">CACHE_DRIVER=redis<\/code> olarak ayarland\u0131. Bu, veritaban\u0131 \u00fczerindeki y\u00fck\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde azaltt\u0131.<\/p>\n<pre><code class=\"language-yaml\">\n# docker-compose.yml (services alt\u0131na eklenecek)\n  redis:\n    image: redis:alpine\n    container_name: laravel_redis\n    restart: unless-stopped\n    networks:\n      - laravel_network\n      <\/code><\/pre>\n<\/li>\n<li>\n      <strong>PHP-FPM Ayarlar\u0131n\u0131n \u0130yile\u015ftirilmesi:<\/strong> <code class=\"language-\">app\/php-fpm.conf<\/code> dosyas\u0131ndaki <code class=\"language-\">pm.max_children<\/code>, <code class=\"language-\">pm.start_servers<\/code> gibi ayarlar, sunucunun kaynaklar\u0131na ve beklenen trafik y\u00fck\u00fcne g\u00f6re optimize edildi. Bu, e\u015f zamanl\u0131 istekleri daha iyi y\u00f6netmeye yard\u0131mc\u0131 oldu.\n    <\/li>\n<li>\n      <strong>Nginx Ayarlar\u0131:<\/strong> Nginx&#8217;in <code class=\"language-\">default.conf<\/code> dosyas\u0131nda <code class=\"language-\">client_max_body_size<\/code> gibi ayarlar, b\u00fcy\u00fck resim y\u00fcklemeleri i\u00e7in art\u0131r\u0131ld\u0131 ve statik dosya \u00f6nbellekleme s\u00fcreleri ayarland\u0131.\n    <\/li>\n<li>\n      <strong>Veritaban\u0131 Optimizasyonu:<\/strong> MySQL konteyneri i\u00e7in daha fazla kaynak ayr\u0131ld\u0131 ve MySQL yap\u0131land\u0131rmas\u0131 (\u00f6rne\u011fin, <code class=\"language-\">innodb_buffer_pool_size<\/code>) y\u00fcksek trafik i\u00e7in ayarland\u0131. Bu, <code class=\"language-\">db<\/code> hizmetinin <code class=\"language-\">environment<\/code> b\u00f6l\u00fcm\u00fcne eklenebilir veya \u00f6zel bir MySQL yap\u0131land\u0131rma dosyas\u0131 ba\u011flanabilir.\n    <\/li>\n<\/ol>\n<p>Bu ileri d\u00fczey optimizasyonlar sayesinde, HaberJet, artan trafik y\u00fck\u00fcn\u00fc sorunsuz bir \u015fekilde y\u00f6netebildi ve kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirdi. Docker Compose, bu t\u00fcr karma\u015f\u0131k altyap\u0131 de\u011fi\u015fikliklerini kolayca entegre etme ve y\u00f6netme esnekli\u011fi sunar.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu kapsaml\u0131 rehber boyunca, Laravel, Nginx ve MySQL&#8217;i Docker Compose ile nas\u0131l kuraca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011frendik. Konteynerizasyonun temel kavramlar\u0131ndan ba\u015flayarak, proje yap\u0131s\u0131n\u0131 olu\u015fturduk, hizmetleri tan\u0131mlad\u0131k, uygulamam\u0131z\u0131 ba\u015flatt\u0131k ve hatta performans\u0131 ve g\u00fcvenli\u011fi art\u0131racak ileri d\u00fczey ipu\u00e7lar\u0131n\u0131 ke\u015ffettik. Art\u0131k geli\u015ftirme ortam\u0131n\u0131z\u0131 tutarl\u0131, izole ve ta\u015f\u0131nabilir bir \u015fekilde y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc bir araca sahipsiniz. Docker Compose, sadece geli\u015ftirme s\u00fcrecini h\u0131zland\u0131rmakla kalmaz, ayn\u0131 zamanda ekip i\u00e7i i\u015fbirli\u011fini kolayla\u015ft\u0131r\u0131r ve uygulamalar\u0131n\u0131z\u0131n \u00fcretim ortamlar\u0131na daha sorunsuz bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Konteynerizasyon, modern yaz\u0131l\u0131m geli\u015ftirme metodolojilerinin vazge\u00e7ilmez bir par\u00e7as\u0131 haline gelmi\u015ftir. Bu rehberde edindi\u011finiz bilgilerle, kendi Laravel projelerinizi Dockerize edebilir, farkl\u0131 hizmetleri entegre edebilir ve daha karma\u015f\u0131k altyap\u0131lar\u0131 y\u00f6netme konusunda sa\u011flam bir temel olu\u015fturabilirsiniz. Unutmay\u0131n, Docker ekosistemi s\u00fcrekli geli\u015fiyor ve yeni ara\u00e7lar, en iyi uygulamalar ortaya \u00e7\u0131k\u0131yor. Bu nedenle, \u00f6\u011frenmeye ve ke\u015ffetmeye devam etmek, bu alanda uzmanla\u015fman\u0131n anahtar\u0131d\u0131r. Umar\u0131z bu rehber, Docker Compose ile yolculu\u011funuza g\u00fc\u00e7l\u00fc bir ba\u015flang\u0131\u00e7 yapman\u0131za yard\u0131mc\u0131 olmu\u015ftur.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<div class=\"faq\">\n<h4>Docker Compose&#8217;u \u00fcretimde kullanmak g\u00fcvenli midir?<\/h4>\n<p>Docker Compose, genellikle geli\u015ftirme ve test ortamlar\u0131 i\u00e7in tasarlanm\u0131\u015ft\u0131r. K\u00fc\u00e7\u00fck \u00f6l\u00e7ekli \u00fcretim ortamlar\u0131 i\u00e7in kullan\u0131labilse de, y\u00fcksek kullan\u0131labilirlik, \u00f6l\u00e7eklenebilirlik ve otomatik hata kurtarma gibi \u00f6zellikler gerektiren b\u00fcy\u00fck \u00f6l\u00e7ekli \u00fcretim da\u011f\u0131t\u0131mlar\u0131 i\u00e7in Docker Swarm veya Kubernetes gibi konteyner orkestrasyon ara\u00e7lar\u0131 daha uygun ve \u00f6nerilen \u00e7\u00f6z\u00fcmlerdir. Docker Compose, h\u0131zl\u0131 bir ba\u015flang\u0131\u00e7 ve basit da\u011f\u0131t\u0131mlar i\u00e7in harikad\u0131r, ancak \u00fcretimde daha g\u00fc\u00e7l\u00fc y\u00f6netim ve \u00f6l\u00e7eklendirme yetenekleri sunan ara\u00e7lar tercih edilmelidir.<\/p>\n<\/p><\/div>\n<div class=\"faq\">\n<h4>Veritaban\u0131 yedeklemesini nas\u0131l yapmal\u0131y\u0131m?<\/h4>\n<p>Veritaban\u0131 yedeklemesi i\u00e7in birka\u00e7 y\u00f6ntem bulunmaktad\u0131r. En yayg\u0131n olan\u0131, MySQL konteynerine ba\u011flan\u0131p <code class=\"language-\">mysqldump<\/code> komutunu kullanmakt\u0131r. \u00d6rne\u011fin:<\/p>\n<pre><code>\ndocker compose exec db mysqldump -u laravel_user -p laravel_db > backup.sql\n    <\/code><\/pre>\n<p>Bu komut, veritaban\u0131n\u0131z\u0131 <code class=\"language-\">backup.sql<\/code> dosyas\u0131na yedekleyecektir. D\u00fczenli yedeklemeler i\u00e7in bu komutu bir cron job veya otomasyon arac\u0131 ile \u00e7al\u0131\u015ft\u0131rabilirsiniz. Ayr\u0131ca, <code class=\"language-\">db_data<\/code> volume&#8217;\u00fcn\u00fc ana makinenize ba\u011flayarak veya d\u00fczenli aral\u0131klarla yedekleme servislerine otomatik olarak g\u00f6nderecek \u00fc\u00e7\u00fcnc\u00fc taraf ara\u00e7lar\u0131 kullanarak da yedekleme yapabilirsiniz.<\/p>\n<\/p><\/div>\n<div class=\"faq\">\n<h4>Konteynerler aras\u0131nda ileti\u015fim nas\u0131l sa\u011flan\u0131r?<\/h4>\n<p>Docker Compose, ayn\u0131 <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131nda tan\u0131mlanan hizmetler aras\u0131nda varsay\u0131lan olarak bir k\u00f6pr\u00fc a\u011f\u0131 (bridge network) olu\u015fturur. Bu a\u011f sayesinde, hizmetler birbirleriyle hizmet adlar\u0131n\u0131 (\u00f6rne\u011fin, <code class=\"language-\">app<\/code> hizmeti <code class=\"language-\">db<\/code> hizmetine <code class=\"language-\">db<\/code> ad\u0131yla eri\u015febilir) kullanarak ileti\u015fim kurabilirler. Bu, DNS \u00e7\u00f6z\u00fcmlemesi sayesinde otomatik olarak ger\u00e7ekle\u015fir ve IP adreslerini bilmenize gerek kalmaz. Bu rehberde de <code class=\"language-\">DB_HOST: db<\/code> \u015feklinde bu ileti\u015fim modelini kulland\u0131k.<\/p>\n<\/p><\/div>\n<div class=\"faq\">\n<h4>Laravel artisan komutlar\u0131n\u0131 nas\u0131l \u00e7al\u0131\u015ft\u0131rabilirim?<\/h4>\n<p>Laravel artisan komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in, uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 PHP-FPM konteynerine ba\u011flanman\u0131z gerekir. Bunu <code class=\"language-\">docker compose exec<\/code> komutuyla yapabilirsiniz:<\/p>\n<pre><code>\ndocker compose exec app php artisan [komutunuz]\n    <\/code><\/pre>\n<p>\u00d6rne\u011fin, yeni bir Controller olu\u015fturmak i\u00e7in:<\/p>\n<pre><code>\ndocker compose exec app php artisan make:controller MyController\n    <\/code><\/pre>\n<p>Bu komut, <code class=\"language-\">app<\/code> konteyneri i\u00e7inde <code class=\"language-\">php artisan<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131r ve \u00e7\u0131kt\u0131y\u0131 terminalinize yans\u0131t\u0131r.<\/p>\n<\/p><\/div>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Docker Compose ile Laravel, Nginx ve MySQL Kurulumu Rehberi Neden Docker Compose ile Laravel, Nginx ve MySQL Kurulumu&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":[1504],"tags":[],"class_list":{"0":"post-39821","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-nginx","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>Neden Docker Compose ile Laravel, Nginx ve MySQL Kurulumu Yapmal\u0131y\u0131z?<\/title>\n<meta name=\"description\" content=\"Modern web geli\u015ftirme d\u00fcnyas\u0131nda, projelerinizi tutarl\u0131 ve izole ortamlarda \u00e7al\u0131\u015ft\u0131rmak her zamankinden daha \u00f6nemli hale geldi. Genellikle, geli\u015ftiriciler farkl\u0131 i\u015fletim sistemleri ve yerel yap\u0131land\u0131rma sorunlar\u0131yla bo\u011fu\u015fmak zorunda kal\u0131r; bu da &quot;benim bilgisayar\u0131mda \u00e7al\u0131\u015f\u0131yordu&quot; sendromuna yol a\u00e7ar. Peki, bu karma\u015fay\u0131 ortadan kald\u0131rarak geli\u015ftirme s\u00fcrecinizi nas\u0131l h\u0131zland\u0131rabilir, ekip \u00fcyeleri aras\u0131ndaki tutars\u0131zl\u0131klar\u0131 nas\u0131l giderebilir ve hatta da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi nas\u0131l kolayla\u015ft\u0131rabilirsiniz? \u0130\u015fte tam da bu noktada Docker Compose devreye giriyor. Bu kapsaml\u0131 rehberde, Laravel tabanl\u0131 bir uygulaman\u0131n Nginx web sunucusu ve MySQL veritaban\u0131 ile Docker Compose kullanarak nas\u0131l kurulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Bu sayede, hem yeni ba\u015flayanlar hem de deneyimli geli\u015ftiriciler i\u00e7in g\u00fc\u00e7l\u00fc, esnek ve ta\u015f\u0131nabilir bir geli\u015ftirme ortam\u0131 olu\u015fturman\u0131n t\u00fcm inceliklerini ke\u015ffedece\u011fiz.\" \/>\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\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Neden Docker Compose ile Laravel, Nginx ve MySQL Kurulumu Yapmal\u0131y\u0131z?\" \/>\n<meta property=\"og:description\" content=\"Modern web geli\u015ftirme d\u00fcnyas\u0131nda, projelerinizi tutarl\u0131 ve izole ortamlarda \u00e7al\u0131\u015ft\u0131rmak her zamankinden daha \u00f6nemli hale geldi. Genellikle, geli\u015ftiriciler farkl\u0131 i\u015fletim sistemleri ve yerel yap\u0131land\u0131rma sorunlar\u0131yla bo\u011fu\u015fmak zorunda kal\u0131r; bu da &quot;benim bilgisayar\u0131mda \u00e7al\u0131\u015f\u0131yordu&quot; sendromuna yol a\u00e7ar. Peki, bu karma\u015fay\u0131 ortadan kald\u0131rarak geli\u015ftirme s\u00fcrecinizi nas\u0131l h\u0131zland\u0131rabilir, ekip \u00fcyeleri aras\u0131ndaki tutars\u0131zl\u0131klar\u0131 nas\u0131l giderebilir ve hatta da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi nas\u0131l kolayla\u015ft\u0131rabilirsiniz? \u0130\u015fte tam da bu noktada Docker Compose devreye giriyor. Bu kapsaml\u0131 rehberde, Laravel tabanl\u0131 bir uygulaman\u0131n Nginx web sunucusu ve MySQL veritaban\u0131 ile Docker Compose kullanarak nas\u0131l kurulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Bu sayede, hem yeni ba\u015flayanlar hem de deneyimli geli\u015ftiriciler i\u00e7in g\u00fc\u00e7l\u00fc, esnek ve ta\u015f\u0131nabilir bir geli\u015ftirme ortam\u0131 olu\u015fturman\u0131n t\u00fcm inceliklerini ke\u015ffedece\u011fiz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-24T05:21:14+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\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Neden Docker Compose ile Laravel, Nginx ve MySQL Kurulumu Yapmal\u0131y\u0131z?\",\"datePublished\":\"2026-02-24T05:21:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/\"},\"wordCount\":4932,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Nginx\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/\",\"name\":\"Neden Docker Compose ile Laravel, Nginx ve MySQL Kurulumu Yapmal\u0131y\u0131z?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-24T05:21:14+00:00\",\"description\":\"Modern web geli\u015ftirme d\u00fcnyas\u0131nda, projelerinizi tutarl\u0131 ve izole ortamlarda \u00e7al\u0131\u015ft\u0131rmak her zamankinden daha \u00f6nemli hale geldi. Genellikle, geli\u015ftiriciler farkl\u0131 i\u015fletim sistemleri ve yerel yap\u0131land\u0131rma sorunlar\u0131yla bo\u011fu\u015fmak zorunda kal\u0131r; bu da \\\"benim bilgisayar\u0131mda \u00e7al\u0131\u015f\u0131yordu\\\" sendromuna yol a\u00e7ar. Peki, bu karma\u015fay\u0131 ortadan kald\u0131rarak geli\u015ftirme s\u00fcrecinizi nas\u0131l h\u0131zland\u0131rabilir, ekip \u00fcyeleri aras\u0131ndaki tutars\u0131zl\u0131klar\u0131 nas\u0131l giderebilir ve hatta da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi nas\u0131l kolayla\u015ft\u0131rabilirsiniz? \u0130\u015fte tam da bu noktada Docker Compose devreye giriyor. Bu kapsaml\u0131 rehberde, Laravel tabanl\u0131 bir uygulaman\u0131n Nginx web sunucusu ve MySQL veritaban\u0131 ile Docker Compose kullanarak nas\u0131l kurulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Bu sayede, hem yeni ba\u015flayanlar hem de deneyimli geli\u015ftiriciler i\u00e7in g\u00fc\u00e7l\u00fc, esnek ve ta\u015f\u0131nabilir bir geli\u015ftirme ortam\u0131 olu\u015fturman\u0131n t\u00fcm inceliklerini ke\u015ffedece\u011fiz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Neden Docker Compose ile Laravel, Nginx ve MySQL Kurulumu Yapmal\u0131y\u0131z?\"}]},{\"@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":"Neden Docker Compose ile Laravel, Nginx ve MySQL Kurulumu Yapmal\u0131y\u0131z?","description":"Modern web geli\u015ftirme d\u00fcnyas\u0131nda, projelerinizi tutarl\u0131 ve izole ortamlarda \u00e7al\u0131\u015ft\u0131rmak her zamankinden daha \u00f6nemli hale geldi. Genellikle, geli\u015ftiriciler farkl\u0131 i\u015fletim sistemleri ve yerel yap\u0131land\u0131rma sorunlar\u0131yla bo\u011fu\u015fmak zorunda kal\u0131r; bu da \"benim bilgisayar\u0131mda \u00e7al\u0131\u015f\u0131yordu\" sendromuna yol a\u00e7ar. Peki, bu karma\u015fay\u0131 ortadan kald\u0131rarak geli\u015ftirme s\u00fcrecinizi nas\u0131l h\u0131zland\u0131rabilir, ekip \u00fcyeleri aras\u0131ndaki tutars\u0131zl\u0131klar\u0131 nas\u0131l giderebilir ve hatta da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi nas\u0131l kolayla\u015ft\u0131rabilirsiniz? \u0130\u015fte tam da bu noktada Docker Compose devreye giriyor. Bu kapsaml\u0131 rehberde, Laravel tabanl\u0131 bir uygulaman\u0131n Nginx web sunucusu ve MySQL veritaban\u0131 ile Docker Compose kullanarak nas\u0131l kurulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Bu sayede, hem yeni ba\u015flayanlar hem de deneyimli geli\u015ftiriciler i\u00e7in g\u00fc\u00e7l\u00fc, esnek ve ta\u015f\u0131nabilir bir geli\u015ftirme ortam\u0131 olu\u015fturman\u0131n t\u00fcm inceliklerini ke\u015ffedece\u011fiz.","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\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/","og_locale":"tr_TR","og_type":"article","og_title":"Neden Docker Compose ile Laravel, Nginx ve MySQL Kurulumu Yapmal\u0131y\u0131z?","og_description":"Modern web geli\u015ftirme d\u00fcnyas\u0131nda, projelerinizi tutarl\u0131 ve izole ortamlarda \u00e7al\u0131\u015ft\u0131rmak her zamankinden daha \u00f6nemli hale geldi. Genellikle, geli\u015ftiriciler farkl\u0131 i\u015fletim sistemleri ve yerel yap\u0131land\u0131rma sorunlar\u0131yla bo\u011fu\u015fmak zorunda kal\u0131r; bu da \"benim bilgisayar\u0131mda \u00e7al\u0131\u015f\u0131yordu\" sendromuna yol a\u00e7ar. Peki, bu karma\u015fay\u0131 ortadan kald\u0131rarak geli\u015ftirme s\u00fcrecinizi nas\u0131l h\u0131zland\u0131rabilir, ekip \u00fcyeleri aras\u0131ndaki tutars\u0131zl\u0131klar\u0131 nas\u0131l giderebilir ve hatta da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi nas\u0131l kolayla\u015ft\u0131rabilirsiniz? \u0130\u015fte tam da bu noktada Docker Compose devreye giriyor. Bu kapsaml\u0131 rehberde, Laravel tabanl\u0131 bir uygulaman\u0131n Nginx web sunucusu ve MySQL veritaban\u0131 ile Docker Compose kullanarak nas\u0131l kurulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Bu sayede, hem yeni ba\u015flayanlar hem de deneyimli geli\u015ftiriciler i\u00e7in g\u00fc\u00e7l\u00fc, esnek ve ta\u015f\u0131nabilir bir geli\u015ftirme ortam\u0131 olu\u015fturman\u0131n t\u00fcm inceliklerini ke\u015ffedece\u011fiz.","og_url":"https:\/\/fatihsoysal.com\/blog\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-24T05:21:14+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\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Neden Docker Compose ile Laravel, Nginx ve MySQL Kurulumu Yapmal\u0131y\u0131z?","datePublished":"2026-02-24T05:21:14+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/"},"wordCount":4932,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Nginx"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/","url":"https:\/\/fatihsoysal.com\/blog\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/","name":"Neden Docker Compose ile Laravel, Nginx ve MySQL Kurulumu Yapmal\u0131y\u0131z?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-24T05:21:14+00:00","description":"Modern web geli\u015ftirme d\u00fcnyas\u0131nda, projelerinizi tutarl\u0131 ve izole ortamlarda \u00e7al\u0131\u015ft\u0131rmak her zamankinden daha \u00f6nemli hale geldi. Genellikle, geli\u015ftiriciler farkl\u0131 i\u015fletim sistemleri ve yerel yap\u0131land\u0131rma sorunlar\u0131yla bo\u011fu\u015fmak zorunda kal\u0131r; bu da \"benim bilgisayar\u0131mda \u00e7al\u0131\u015f\u0131yordu\" sendromuna yol a\u00e7ar. Peki, bu karma\u015fay\u0131 ortadan kald\u0131rarak geli\u015ftirme s\u00fcrecinizi nas\u0131l h\u0131zland\u0131rabilir, ekip \u00fcyeleri aras\u0131ndaki tutars\u0131zl\u0131klar\u0131 nas\u0131l giderebilir ve hatta da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi nas\u0131l kolayla\u015ft\u0131rabilirsiniz? \u0130\u015fte tam da bu noktada Docker Compose devreye giriyor. Bu kapsaml\u0131 rehberde, Laravel tabanl\u0131 bir uygulaman\u0131n Nginx web sunucusu ve MySQL veritaban\u0131 ile Docker Compose kullanarak nas\u0131l kurulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Bu sayede, hem yeni ba\u015flayanlar hem de deneyimli geli\u015ftiriciler i\u00e7in g\u00fc\u00e7l\u00fc, esnek ve ta\u015f\u0131nabilir bir geli\u015ftirme ortam\u0131 olu\u015fturman\u0131n t\u00fcm inceliklerini ke\u015ffedece\u011fiz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/neden-docker-compose-ile-laravel-nginx-ve-mysql-kurulumu-yapmaliyiz\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Neden Docker Compose ile Laravel, Nginx ve MySQL Kurulumu Yapmal\u0131y\u0131z?"}]},{"@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\/39821","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=39821"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39821\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=39821"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=39821"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=39821"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}