{"id":40089,"date":"2026-02-24T16:22:18","date_gmt":"2026-02-24T13:22:18","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/"},"modified":"2026-02-24T16:22:18","modified_gmt":"2026-02-24T13:22:18","slug":"giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/","title":{"rendered":"Giri\u015f: Neden Geli\u015ftirme Ortam\u0131 Kurulumu Bu Kadar Zorlu?"},"content":{"rendered":"<p><title>Laravel, Nginx ve MySQL&#8217;i Docker Compose ile Kurulum Rehberi<\/title><br \/>\n<body><\/p>\n<p>Modern web uygulamalar\u0131 geli\u015ftirirken kurulum s\u00fcre\u00e7lerinin karma\u015f\u0131kl\u0131\u011f\u0131yla m\u0131 bo\u011fu\u015fuyorsunuz? Laravel, Nginx ve MySQL&#8217;i Docker Compose ile h\u0131zl\u0131ca nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin, geli\u015ftirme ortam\u0131n\u0131z\u0131 standartla\u015ft\u0131r\u0131n ve verimlili\u011finizi art\u0131r\u0131n.<\/p>\n<h2>Giri\u015f: Neden Geli\u015ftirme Ortam\u0131 Kurulumu Bu Kadar Zorlu?<\/h2>\n<p>Web geli\u015ftirme d\u00fcnyas\u0131, s\u00fcrekli de\u011fi\u015fen teknolojiler ve karma\u015f\u0131k ba\u011f\u0131ml\u0131l\u0131klarla dolu. Bir Laravel projesi \u00fczerinde \u00e7al\u0131\u015f\u0131rken, PHP&#8217;nin belirli bir s\u00fcr\u00fcm\u00fcne, MySQL veritaban\u0131na ve Nginx veya Apache gibi bir web sunucusuna ihtiyac\u0131n\u0131z vard\u0131r. Bu bile\u015fenlerin her birini i\u015fletim sisteminize manuel olarak kurmak, s\u00fcr\u00fcm \u00e7ak\u0131\u015fmalar\u0131, sistem kaynaklar\u0131n\u0131n a\u015f\u0131r\u0131 kullan\u0131m\u0131 ve &#8220;benim makinemde \u00e7al\u0131\u015f\u0131yordu&#8221; sendromu gibi pek \u00e7ok sorunu beraberinde getirebilir. \u00d6zellikle farkl\u0131 projelerde farkl\u0131 PHP s\u00fcr\u00fcmleri veya veritaban\u0131 tipleri kullanman\u0131z gerekti\u011finde, bu karma\u015fa katlanarak artar. Geli\u015ftirme ortam\u0131n\u0131z\u0131n bir geli\u015ftiriciden di\u011ferine veya geli\u015ftirme ortam\u0131ndan \u00fcretim ortam\u0131na tutarl\u0131 olmamas\u0131, zaman kayb\u0131na, hatalara ve gereksiz streslere yol a\u00e7ar.<\/p>\n<p>\u0130\u015fte tam da bu noktada konteyner teknolojileri, \u00f6zellikle de Docker ve Docker Compose devreye giriyor. Docker, uygulamalar\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 izole edilmi\u015f, ta\u015f\u0131nabilir birimler olan konteynerler i\u00e7inde \u00e7al\u0131\u015ft\u0131rman\u0131za olanak tan\u0131r. Bu sayede uygulaman\u0131z, \u00e7al\u0131\u015ft\u0131\u011f\u0131 ortamdan ba\u011f\u0131ms\u0131z hale gelir. Docker Compose ise birden fazla Docker konteynerini i\u00e7eren uygulamalar\u0131 tan\u0131mlamak ve \u00e7al\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131lan bir ara\u00e7t\u0131r. Tek bir YAML dosyas\u0131 ile t\u00fcm servislerinizi (veritaban\u0131, web sunucusu, uygulama sunucusu vb.) yap\u0131land\u0131rabilir, ba\u015flatabilir ve y\u00f6netebilirsiniz. Bu, geli\u015ftirme ortam\u0131 kurulumunu basitle\u015ftirmenin ve standartla\u015ft\u0131rman\u0131n en etkili yollar\u0131ndan biridir. Bu makalede, pop\u00fcler PHP framework&#8217;\u00fc Laravel&#8217;i, y\u00fcksek performansl\u0131 web sunucusu Nginx&#8217;i ve sa\u011flam veritaban\u0131 sistemi MySQL&#8217;i Docker Compose kullanarak nas\u0131l kusursuz bir \u015fekilde entegre edece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz. Bu sayede hem ba\u015flang\u0131\u00e7 seviyesindeki geli\u015ftiriciler hem de deneyimli profesyoneller i\u00e7in temiz, tutarl\u0131 ve verimli bir geli\u015ftirme ortam\u0131 olu\u015fturman\u0131n kap\u0131lar\u0131n\u0131 aralayaca\u011f\u0131z.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: Geli\u015ftirme ortam\u0131n\u0131z\u0131 Dockerize etmek, sadece kurulumu kolayla\u015ft\u0131rmakla kalmaz, ayn\u0131 zamanda CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m) s\u00fcre\u00e7lerinizi de b\u00fcy\u00fck \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r ve standartla\u015ft\u0131r\u0131r. Uygulaman\u0131z\u0131n her zaman ayn\u0131 \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olabilirsiniz.\n    <\/div>\n<h2>Temel Kavramlar Nelerdir: Docker, Laravel, Nginx ve MySQL&#8217;i Yak\u0131ndan Tan\u0131yal\u0131m<\/h2>\n<p>Bu k\u0131lavuza ba\u015flamadan \u00f6nce, kullanaca\u011f\u0131m\u0131z temel teknolojilerin ne oldu\u011funu ve neden bir arada bu kadar g\u00fc\u00e7l\u00fc olduklar\u0131n\u0131 anlamak \u00f6nemlidir. Bu b\u00f6l\u00fcmde, her bir bile\u015fenin ne i\u015fe yarad\u0131\u011f\u0131n\u0131 ve genel mimarideki yerini a\u00e7\u0131klayaca\u011f\u0131z.<\/p>\n<h3>Docker ve Docker Compose Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p><strong>Docker<\/strong>, uygulamalar\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 paketleyerek &#8220;konteyner&#8221; ad\u0131 verilen izole edilmi\u015f birimlerde \u00e7al\u0131\u015ft\u0131rman\u0131z\u0131 sa\u011flayan a\u00e7\u0131k kaynakl\u0131 bir platformdur. Bir konteyner, uygulaman\u0131z\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in gereken her \u015feyi (kod, \u00e7al\u0131\u015fma zaman\u0131, sistem ara\u00e7lar\u0131, k\u00fct\u00fcphaneler ve ayarlar) i\u00e7erir. Bu izolasyon sayesinde, uygulaman\u0131z farkl\u0131 ortamlarda (geli\u015ftirme, test, \u00fcretim) her zaman ayn\u0131 \u015fekilde \u00e7al\u0131\u015f\u0131r. Docker&#8217;\u0131n en b\u00fcy\u00fck avantajlar\u0131ndan biri, &#8220;benim makinemde \u00e7al\u0131\u015f\u0131yordu&#8221; sorununu ortadan kald\u0131rmas\u0131d\u0131r. Her konteyner kendi ba\u011f\u0131ms\u0131z i\u015fletim sistemine sahip bir sanal makine olmasa da, kendi izole edilmi\u015f ortam\u0131na sahiptir.<\/p>\n<p><strong>Docker Compose<\/strong> ise, birden fazla Docker konteynerini i\u00e7eren uygulamalar\u0131 tan\u0131mlamak ve \u00e7al\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131lan bir ara\u00e7t\u0131r. Karma\u015f\u0131k uygulamalar genellikle birden fazla servis gerektirir (\u00f6rne\u011fin, bir web uygulamas\u0131, bir veritaban\u0131 ve bir \u00f6nbellek servisi). Docker Compose, bu servislerin t\u00fcm\u00fcn\u00fc tek bir YAML dosyas\u0131 i\u00e7inde tan\u0131mlaman\u0131za ve tek bir komutla (<code>docker compose up<\/code>) t\u00fcm\u00fcn\u00fc ba\u015flatman\u0131za olanak tan\u0131r. Bu, geli\u015ftirme ortam\u0131n\u0131z\u0131 kurmay\u0131 ve y\u00f6netmeyi inan\u0131lmaz derecede basitle\u015ftirir. Geli\u015ftiriciler, projenin t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 saniyeler i\u00e7inde aya\u011fa kald\u0131rabilir ve hemen kod yazmaya ba\u015flayabilir.<\/p>\n<h3>Laravel, Nginx ve MySQL Neden Bu Kadar Pop\u00fcler?<\/h3>\n<p>Bu \u00fc\u00e7 teknoloji, modern web geli\u015ftirme y\u0131\u011f\u0131n\u0131n\u0131n temel ta\u015flar\u0131d\u0131r ve her birinin kendine \u00f6zg\u00fc g\u00fc\u00e7l\u00fc y\u00f6nleri vard\u0131r:<\/p>\n<ul>\n<li>\n            <strong>Laravel (PHP Framework):<\/strong> PHP tabanl\u0131, a\u00e7\u0131k kaynakl\u0131 ve pop\u00fcler bir web uygulama framework&#8217;\u00fcd\u00fcr. Geli\u015ftiricilerin h\u0131zl\u0131 bir \u015fekilde sa\u011flam ve \u00f6l\u00e7eklenebilir web uygulamalar\u0131 olu\u015fturmas\u0131na olanak tan\u0131yan zarif bir s\u00f6zdizimi ve kapsaml\u0131 \u00f6zellik setine sahiptir. MVC (Model-View-Controller) mimarisi, ORM (Eloquent), kuyruk y\u00f6netimi, kimlik do\u011frulama gibi bir\u00e7ok yerle\u015fik \u00f6zelli\u011fi sayesinde geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r ve basitle\u015ftirir. Laravel, PHP ekosistemindeki en aktif topluluklardan birine sahiptir, bu da sorun giderme ve kaynak bulma konusunda b\u00fcy\u00fck bir avantaj sa\u011flar.\n        <\/li>\n<li>\n            <strong>Nginx (Web Sunucusu):<\/strong> Y\u00fcksek performansl\u0131, hafif ve \u00f6l\u00e7eklenebilir bir web sunucusu ve ters proxy&#8217;dir. \u00d6zellikle y\u00fcksek trafikli web siteleri i\u00e7in tasarlanm\u0131\u015ft\u0131r ve e\u015fzamanl\u0131 ba\u011flant\u0131lar\u0131 verimli bir \u015fekilde y\u00f6netme yetene\u011fiyle bilinir. Nginx, statik dosyalar\u0131 sunmada olduk\u00e7a h\u0131zl\u0131d\u0131r ve dinamik i\u00e7erik i\u00e7in PHP-FPM gibi uygulama sunucular\u0131yla sorunsuz bir \u015fekilde entegre olur. Bir ters proxy olarak kullan\u0131ld\u0131\u011f\u0131nda, y\u00fck dengeleme, SSL sonland\u0131rma ve g\u00fcvenlik gibi ek yetenekler sunar.\n        <\/li>\n<li>\n            <strong>MySQL (Veritaban\u0131 Y\u00f6netim Sistemi):<\/strong> D\u00fcnyan\u0131n en pop\u00fcler a\u00e7\u0131k kaynakl\u0131 ili\u015fkisel veritaban\u0131 y\u00f6netim sistemlerinden biridir. Sa\u011flaml\u0131\u011f\u0131, g\u00fcvenilirli\u011fi, performans\u0131 ve geni\u015f topluluk deste\u011fi ile bilinir. MySQL, k\u00fc\u00e7\u00fck \u00f6l\u00e7ekli projelerden kurumsal d\u00fczeydeki uygulamalara kadar geni\u015f bir yelpazede kullan\u0131labilir. Laravel&#8217;in Eloquent ORM&#8217;si ile m\u00fckemmel bir uyum i\u00e7indedir, bu da veritaban\u0131 i\u015flemlerini kod \u00fczerinden kolayca y\u00f6netmenizi sa\u011flar.<\/li>\n<\/ul>\n<h3>Neden Bu \u00dc\u00e7l\u00fcy\u00fc Docker Compose ile Kullanmal\u0131y\u0131z?<\/h3>\n<p>Laravel, Nginx ve MySQL \u00fc\u00e7l\u00fcs\u00fcn\u00fc Docker Compose ile birle\u015ftirmek, geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizde devrim yarat\u0131r. \u0130\u015fte ba\u015fl\u0131ca nedenler:<\/p>\n<ol>\n<li>\n            <strong>Tutarl\u0131l\u0131k:<\/strong> Her geli\u015ftirici ayn\u0131 ortamda \u00e7al\u0131\u015f\u0131r. Bu, &#8220;benim makinemde \u00e7al\u0131\u015f\u0131yordu&#8221; sorununu ortadan kald\u0131r\u0131r ve ekip i\u00e7inde daha sorunsuz bir i\u015fbirli\u011fi sa\u011flar.\n        <\/li>\n<li>\n            <strong>\u0130zolasyon:<\/strong> Her servis (Laravel\/PHP-FPM, Nginx, MySQL) kendi konteynerinde izole bir \u015fekilde \u00e7al\u0131\u015f\u0131r. Bu, ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nler ve bir servisteki de\u011fi\u015fikliklerin di\u011ferlerini etkilemesini engeller.\n        <\/li>\n<li>\n            <strong>Kolay Kurulum:<\/strong> Yeni bir projeye ba\u015flayan veya mevcut bir projeye kat\u0131lan bir geli\u015ftirici, tek bir komutla t\u00fcm geli\u015ftirme ortam\u0131n\u0131 kurabilir. Bu, onboarding s\u00fcrecini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r.\n        <\/li>\n<li>\n            <strong>Ta\u015f\u0131nabilirlik:<\/strong> Konteynerler, bulut ortamlar\u0131ndan yerel makinelere kadar her yerde \u00e7al\u0131\u015fabilir. Bu, uygulaman\u0131z\u0131n farkl\u0131 ortamlara kolayca ta\u015f\u0131nabilmesini sa\u011flar.\n        <\/li>\n<li>\n            <strong>S\u00fcr\u00fcm Kontrol\u00fc:<\/strong> <code>docker-compose.yml<\/code> ve <code>Dockerfile<\/code> dosyalar\u0131 proje dizininizde saklan\u0131r ve s\u00fcr\u00fcm kontrol sistemlerine (Git gibi) dahil edilebilir. Bu, ortam yap\u0131land\u0131rman\u0131z\u0131n da kod gibi y\u00f6netilmesini sa\u011flar.\n        <\/li>\n<li>\n            <strong>\u00d6l\u00e7eklenebilirlik:<\/strong> Docker Compose, servisleri kolayca \u00f6l\u00e7eklendirmenize olanak tan\u0131r, ancak daha b\u00fcy\u00fck \u00f6l\u00e7ekli \u00fcretim ortamlar\u0131 i\u00e7in Kubernetes gibi orkestrasyon ara\u00e7lar\u0131 daha uygun olabilir.\n        <\/li>\n<\/ol>\n<p>Bu temel kavramlar\u0131 anlad\u0131ktan sonra, art\u0131k geli\u015ftirme ortam\u0131m\u0131z\u0131 ad\u0131m ad\u0131m kurmaya ba\u015flayabiliriz.<\/p>\n<h2>Geli\u015ftirme Ortam\u0131n\u0131z\u0131 Haz\u0131rlama: \u0130lk Ad\u0131mlar Nelerdir?<\/h2>\n<p>Docker Compose ile Laravel, Nginx ve MySQL y\u0131\u011f\u0131n\u0131n\u0131 kurmaya ba\u015flamadan \u00f6nce, sisteminizde baz\u0131 \u00f6nko\u015fullar\u0131n y\u00fckl\u00fc olmas\u0131 gerekmektedir. Bu b\u00f6l\u00fcm, gerekli ara\u00e7lar\u0131 kurman\u0131za ve proje yap\u0131n\u0131z\u0131 olu\u015fturman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>Docker ve Docker Compose Kurulumu (\u00d6nko\u015fullar)<\/h3>\n<p>\u0130lk ve en \u00f6nemli ad\u0131m, Docker&#8217;\u0131 ve dolay\u0131s\u0131yla Docker Compose&#8217;u sisteminize kurmakt\u0131r. Docker Desktop, hem Docker Engine&#8217;i hem de Docker Compose&#8217;u i\u00e7erdi\u011fi i\u00e7in en kolay kurulum y\u00f6ntemidir ve Windows, macOS ve Linux i\u00e7in mevcuttur.<\/p>\n<ul>\n<li>\n            <strong>Windows ve macOS i\u00e7in:<\/strong><\/p>\n<p>Docker Desktop&#8217;\u0131 resmi Docker web sitesinden (<code><a href=\"https:\/\/www.docker.com\/products\/docker-desktop\">www.docker.com\/products\/docker-desktop<\/a><\/code>) indirin ve kurulum sihirbaz\u0131n\u0131 takip edin. Kurulum tamamland\u0131ktan sonra Docker Desktop otomatik olarak ba\u015flayacak ve Docker komutlar\u0131n\u0131 terminalinizde kullanabileceksiniz.<\/p>\n<\/li>\n<li>\n            <strong>Linux i\u00e7in:<\/strong><\/p>\n<p>Linux da\u011f\u0131t\u0131m\u0131n\u0131za \u00f6zel kurulum talimatlar\u0131 i\u00e7in Docker&#8217;\u0131n resmi belgelerine (<code><a href=\"https:\/\/docs.docker.com\/engine\/install\/\">docs.docker.com\/engine\/install\/<\/a><\/code>) bak\u0131n. Genellikle, paket y\u00f6neticiniz arac\u0131l\u0131\u011f\u0131yla Docker Engine&#8217;i ve ard\u0131ndan Docker Compose&#8217;u kurman\u0131z gerekir.<\/p>\n<\/li>\n<\/ul>\n<p>Kurulumu do\u011frulad\u0131ktan sonra, terminalinizi a\u00e7\u0131n ve a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">docker --version\ndocker compose version\n<\/code><\/pre>\n<p>Bu komutlar, Docker ve Docker Compose&#8217;un y\u00fckl\u00fc oldu\u011funu ve s\u00fcr\u00fcm bilgilerini g\u00f6stermelidir. E\u011fer bir hata al\u0131rsan\u0131z, kurulum ad\u0131mlar\u0131n\u0131 dikkatlice tekrar kontrol edin.<\/p>\n<h3>Proje Dizini Yap\u0131s\u0131n\u0131n Olu\u015fturulmas\u0131<\/h3>\n<p>\u015eimdi, Laravel projemiz ve Docker yap\u0131land\u0131rma dosyalar\u0131m\u0131z i\u00e7in temiz bir dizin yap\u0131s\u0131 olu\u015ftural\u0131m. Bu, projenizin d\u00fczenli kalmas\u0131n\u0131 ve y\u00f6netilmesini kolayla\u015ft\u0131racakt\u0131r.<\/p>\n<p>Terminalinizde a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131rarak projeniz i\u00e7in bir ana dizin olu\u015fturun ve i\u00e7ine girin:<\/p>\n<pre><code class=\"language-bash\">mkdir laravel-docker-app\ncd laravel-docker-app\n<\/code><\/pre>\n<p>Bu dizinin i\u00e7inde, Laravel projemizin kendisi i\u00e7in bir alt dizin ve Nginx yap\u0131land\u0131rmas\u0131 i\u00e7in ayr\u0131 bir dizin olu\u015fturaca\u011f\u0131z. Genel olarak, yap\u0131m\u0131z \u015f\u00f6yle g\u00f6r\u00fcnecektir:<\/p>\n<pre><code class=\"language-text\">laravel-docker-app\/\n\u251c\u2500\u2500 app\/                  # Laravel projemizin kaynak kodlar\u0131 burada olacak\n\u251c\u2500\u2500 docker-compose.yml    # Docker Compose yap\u0131land\u0131rma dosyas\u0131\n\u251c\u2500\u2500 docker\/\n\u2502   \u251c\u2500\u2500 nginx\/\n\u2502   \u2502   \u2514\u2500\u2500 default.conf  # Nginx sunucu yap\u0131land\u0131rmas\u0131\n\u2502   \u2514\u2500\u2500 php\/\n\u2502       \u2514\u2500\u2500 Dockerfile    # PHP (Laravel) konteyneri i\u00e7in Dockerfile\n\u2514\u2500\u2500 .env                  # Ortam de\u011fi\u015fkenleri (\u00f6rne\u011fin, veritaban\u0131 bilgileri)\n<\/code><\/pre>\n<p>\u015eimdi, bu yap\u0131y\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">mkdir app\nmkdir docker\nmkdir docker\/nginx\nmkdir docker\/php\ntouch docker-compose.yml\ntouch docker\/nginx\/default.conf\ntouch docker\/php\/Dockerfile\ntouch .env\n<\/code><\/pre>\n<p>Laravel projesini <code>app\/<\/code> dizinine daha sonra kuraca\u011f\u0131z. \u015eimdilik bu temel yap\u0131 yeterli. Bu d\u00fczenli yap\u0131, farkl\u0131 servislerin yap\u0131land\u0131rma dosyalar\u0131n\u0131 birbirinden ayr\u0131 tutarak okunabilirli\u011fi ve y\u00f6netilebilirli\u011fi art\u0131r\u0131r. \u00d6rne\u011fin, Nginx yap\u0131land\u0131rmas\u0131 <code>docker\/nginx\/<\/code> alt\u0131nda, PHP konteyneri i\u00e7in <code>Dockerfile<\/code> ise <code>docker\/php\/<\/code> alt\u0131nda yer alacak. Bu sayede, gelecekte herhangi bir serviste de\u011fi\u015fiklik yapman\u0131z gerekti\u011finde ilgili dosyay\u0131 kolayca bulabilirsiniz.<\/p>\n<p>Bu ad\u0131mlarla, Docker ve Docker Compose&#8217;u kurmu\u015f ve projenizin temel dizin yap\u0131s\u0131n\u0131 olu\u015fturmu\u015f oldunuz. Art\u0131k Docker Compose dosyam\u0131z\u0131 yap\u0131land\u0131rmaya ve servislerimizi tan\u0131mlamaya haz\u0131r\u0131z.<\/p>\n<h2>Docker Compose Dosyas\u0131n\u0131 Yap\u0131land\u0131rma: Servisleri Tan\u0131mlama<\/h2>\n<p><code>docker-compose.yml<\/code> dosyas\u0131, t\u00fcm Docker servislerimizin kalbini olu\u015fturur. Bu dosya, uygulaman\u0131z\u0131n hangi servislerden olu\u015ftu\u011funu, bu servislerin hangi Docker imajlar\u0131n\u0131 kullanaca\u011f\u0131n\u0131, hangi portlar\u0131 dinleyece\u011fini, hangi birimlerin (volumes) ba\u011flanaca\u011f\u0131n\u0131 ve aralar\u0131ndaki a\u011f ba\u011flant\u0131lar\u0131n\u0131 tan\u0131mlar. \u015eimdi bu \u00f6nemli dosyay\u0131 ad\u0131m ad\u0131m olu\u015ftural\u0131m.<\/p>\n<h3><code>docker-compose.yml<\/code> Dosyas\u0131n\u0131n Olu\u015fturulmas\u0131 ve Temel Yap\u0131s\u0131<\/h3>\n<p><code>laravel-docker-app\/<\/code> dizininin k\u00f6k\u00fcnde bulunan <code>docker-compose.yml<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki temel yap\u0131y\u0131 ekleyin:<\/p>\n<pre><code class=\"language-yaml\">version: '3.8'\n\nservices:\n  # MySQL veritaban\u0131 servisi\n  db:\n    image: mysql:8.0\n    container_name: laravel_mysql_db\n    restart: unless-stopped\n    env_file:\n      - .env\n    environment:\n      MYSQL_DATABASE: ${DB_DATABASE}\n      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}\n      MYSQL_PASSWORD: ${DB_PASSWORD}\n      MYSQL_USER: ${DB_USERNAME}\n    volumes:\n      - dbdata:\/var\/lib\/mysql\n    ports:\n      - \"3306:3306\"\n\n  # PHP (Laravel) uygulama servisi\n  app:\n    build:\n      context: .\n      dockerfile: docker\/php\/Dockerfile\n    container_name: laravel_app\n    restart: unless-stopped\n    env_file:\n      - .env\n    volumes:\n      - .\/app:\/var\/www\/html\n    depends_on:\n      - db\n\n  # Nginx web sunucusu servisi\n  nginx:\n    image: nginx:stable-alpine\n    container_name: laravel_nginx\n    restart: unless-stopped\n    ports:\n      - \"80:80\"\n      - \"443:443\" # E\u011fer HTTPS kullanacaksan\u0131z\n    volumes:\n      - .\/app:\/var\/www\/html:ro\n      - .\/docker\/nginx\/default.conf:\/etc\/nginx\/conf.d\/default.conf:ro\n    depends_on:\n      - app\n\nvolumes:\n  dbdata:\n    driver: local\n<\/code><\/pre>\n<p>Bu dosya, \u00fc\u00e7 ana servisi tan\u0131mlar: <code>db<\/code> (MySQL), <code>app<\/code> (Laravel\/PHP-FPM) ve <code>nginx<\/code>. Her servisin kendine \u00f6zg\u00fc yap\u0131land\u0131rmas\u0131 vard\u0131r.<\/p>\n<h3>MySQL Servisi Tan\u0131m\u0131 (<code class=\"language-\">db<\/code>)<\/h3>\n<p><code>db<\/code> servisi, MySQL veritaban\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131r:<\/p>\n<ul>\n<li><code>image: mysql:8.0<\/code>: MySQL&#8217;in 8.0 s\u00fcr\u00fcm\u00fcn\u00fc kullanaca\u011f\u0131m\u0131z\u0131 belirtir.<\/li>\n<li><code>container_name: laravel_mysql_db<\/code>: Konteyner i\u00e7in okunabilir bir isim atar.<\/li>\n<li><code>restart: unless-stopped<\/code>: Konteynerin bir hata durumunda veya Docker yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda otomatik olarak yeniden ba\u015flamas\u0131n\u0131 sa\u011flar.<\/li>\n<li><code>env_file: - .env<\/code> ve <code>environment<\/code>: Veritaban\u0131 kimlik bilgileri gibi hassas bilgileri <code>.env<\/code> dosyas\u0131ndan al\u0131r. Bu, kimlik bilgilerini koddan ay\u0131rmak i\u00e7in iyi bir g\u00fcvenlik uygulamas\u0131d\u0131r.<\/li>\n<li><code>volumes: - dbdata:\/var\/lib\/mysql<\/code>: Veritaban\u0131 verilerinin kal\u0131c\u0131 olmas\u0131n\u0131 sa\u011flar. <code>dbdata<\/code> ad\u0131nda bir Docker volume&#8217;u olu\u015fturulur ve MySQL&#8217;in veri dizinine ba\u011flan\u0131r. Bu sayede konteyner silinse bile verileriniz kaybolmaz.<\/li>\n<li><code>ports: - \"3306:3306\"<\/code>: Host makinenizin 3306 portunu konteynerin 3306 portuna e\u015fler. B\u00f6ylece host makinenizden veritaban\u0131na eri\u015febilirsiniz.<\/li>\n<\/ul>\n<h3>PHP (Laravel) Servisi Tan\u0131m\u0131 (<code class=\"language-\">app<\/code>)<\/h3>\n<p><code>app<\/code> servisi, Laravel uygulaman\u0131z\u0131 \u00e7al\u0131\u015ft\u0131racak PHP-FPM ortam\u0131n\u0131 i\u00e7erir:<\/p>\n<ul>\n<li><code>build: context: . dockerfile: docker\/php\/Dockerfile<\/code>: Bu, PHP konteynerinin \u00f6nceden olu\u015fturulmu\u015f bir imaj yerine, kendi <code>Dockerfile<\/code>&#8216;\u0131m\u0131zdan in\u015fa edilece\u011fini belirtir. <code>context: .<\/code>, <code>Dockerfile<\/code>&#8216;\u0131n k\u00f6k dizinde bulundu\u011funu (yani <code>laravel-docker-app\/<\/code> dizinini) ve <code>dockerfile: docker\/php\/Dockerfile<\/code> ise <code>Dockerfile<\/code>&#8216;\u0131n yolunu g\u00f6sterir.<\/li>\n<li><code>volumes: - .\/app:\/var\/www\/html<\/code>: Laravel projemizin kaynak kodlar\u0131n\u0131n bulundu\u011fu <code>.\/app<\/code> dizinini konteyner i\u00e7indeki <code>\/var\/www\/html<\/code> dizinine ba\u011flar. Bu, host makinenizde yapt\u0131\u011f\u0131n\u0131z kod de\u011fi\u015fikliklerinin an\u0131nda konteyner i\u00e7inde de g\u00f6r\u00fcnmesini sa\u011flar.<\/li>\n<li><code>depends_on: - db<\/code>: Bu servisin ba\u015flamadan \u00f6nce <code>db<\/code> servisinin \u00e7al\u0131\u015f\u0131r durumda olmas\u0131n\u0131 sa\u011flar.<\/li>\n<\/ul>\n<h3>Nginx Web Sunucusu Servisi Tan\u0131m\u0131 (<code class=\"language-\">nginx<\/code>)<\/h3>\n<p><code>nginx<\/code> servisi, gelen HTTP isteklerini i\u015fler ve bunlar\u0131 <code>app<\/code> servisine (PHP-FPM) y\u00f6nlendirir:<\/p>\n<ul>\n<li><code>image: nginx:stable-alpine<\/code>: Nginx&#8217;in hafif Alpine Linux tabanl\u0131 imaj\u0131n\u0131 kullan\u0131r\u0131z.<\/li>\n<li><code>ports: - \"80:80\" - \"443:443\"<\/code>: Host makinenizin 80 (HTTP) ve 443 (HTTPS) portlar\u0131n\u0131 Nginx konteynerinin ilgili portlar\u0131na e\u015fler.<\/li>\n<li><code>volumes: - .\/app:\/var\/www\/html:ro - .\/docker\/nginx\/default.conf:\/etc\/nginx\/conf.d\/default.conf:ro<\/code>:\n<ul>\n<li>\u0130lk volume, Laravel projemizin kodlar\u0131n\u0131 Nginx&#8217;in web k\u00f6k dizinine salt okunur (<code>:ro<\/code>) olarak ba\u011flar.<\/li>\n<li>\u0130kinci volume, kendi Nginx yap\u0131land\u0131rma dosyam\u0131z\u0131 (<code>default.conf<\/code>) konteyner i\u00e7indeki Nginx yap\u0131land\u0131rma dizinine ba\u011flar. Bu sayede Nginx&#8217;in Laravel projemizi do\u011fru bir \u015fekilde sunmas\u0131n\u0131 sa\u011flayabiliriz.<\/li>\n<\/ul>\n<\/li>\n<li><code>depends_on: - app<\/code>: Nginx&#8217;in ba\u015flamadan \u00f6nce <code>app<\/code> servisinin \u00e7al\u0131\u015f\u0131r durumda olmas\u0131n\u0131 sa\u011flar.<\/li>\n<\/ul>\n<p>Son olarak, <code>volumes: dbdata: driver: local<\/code> k\u0131sm\u0131, MySQL verileri i\u00e7in kal\u0131c\u0131 bir Docker volume&#8217;u tan\u0131mlar.<\/p>\n<p>Bu yap\u0131land\u0131rma, t\u00fcm servislerinizin birbiriyle nas\u0131l ileti\u015fim kuraca\u011f\u0131n\u0131 ve verilerin nas\u0131l y\u00f6netilece\u011fini a\u00e7\u0131k\u00e7a belirtir. \u015eimdi, Laravel uygulamam\u0131z\u0131 ve di\u011fer yap\u0131land\u0131rma dosyalar\u0131m\u0131z\u0131 haz\u0131rlama zaman\u0131.<\/p>\n<h2>Laravel Projesini Entegre Etme ve \u00c7al\u0131\u015ft\u0131rma: Uygulaman\u0131z\u0131 Aya\u011fa Kald\u0131rma<\/h2>\n<p>Docker Compose dosyam\u0131z\u0131 haz\u0131rlad\u0131\u011f\u0131m\u0131za g\u00f6re, \u015fimdi Laravel projemizi olu\u015fturma, PHP konteynerimiz i\u00e7in bir Dockerfile yazma ve Nginx&#8217;i do\u011fru \u015fekilde yap\u0131land\u0131rma zaman\u0131. Bu ad\u0131mlar, uygulaman\u0131z\u0131n Docker ortam\u0131nda sorunsuz bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h3>Laravel Projesini Docker Ortam\u0131na Ta\u015f\u0131ma (veya Olu\u015fturma)<\/h3>\n<p>Daha \u00f6nce olu\u015fturdu\u011fumuz <code>app\/<\/code> dizinine Laravel projesini kuraca\u011f\u0131z. Bunu, Docker Compose arac\u0131l\u0131\u011f\u0131yla ge\u00e7ici bir PHP konteyneri kullanarak yapabiliriz, bu da ba\u011f\u0131ml\u0131l\u0131klar\u0131n yerel sisteminize kurulmas\u0131n\u0131 engeller.<\/p>\n<p><code>laravel-docker-app\/<\/code> dizininde oldu\u011funuzdan emin olun ve a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">docker run --rm -v $(pwd)\/app:\/app -w \/app laravel_app composer create-project laravel\/laravel .\n<\/code><\/pre>\n<p>Bu komut, Laravel projesini <code>app\/<\/code> dizinine indirir ve t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kurar. E\u011fer daha \u00f6nce bir Laravel projeniz varsa, sadece <code>app\/<\/code> dizinine kopyalaman\u0131z yeterlidir.<\/p>\n<p><strong>PHP Konteyneri i\u00e7in Dockerfile (<code class=\"language-\">docker\/php\/Dockerfile<\/code>)<\/strong><\/p>\n<p><code>docker\/php\/Dockerfile<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki i\u00e7eri\u011fi ekleyin. Bu Dockerfile, Laravel uygulaman\u0131z i\u00e7in gerekli PHP uzant\u0131lar\u0131n\u0131 ve ayarlar\u0131n\u0131 i\u00e7erir.<\/p>\n<pre><code class=\"language-dockerfile\">FROM php:8.2-fpm-alpine\n\n# Gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckle\nRUN apk add --no-cache \\\n    nginx \\\n    mysql-client \\\n    git \\\n    unzip \\\n    libzip-dev \\\n    libpng-dev \\\n    libjpeg-turbo-dev \\\n    freetype-dev \\\n    icu-dev \\\n    gmp-dev \\\n    libpq-dev \\\n    libxml2-dev \\\n    && docker-php-ext-install -j$(nproc) pdo pdo_mysql zip gd intl gmp bcmath opcache \\\n    && docker-php-ext-configure gd --with-freetype --with-jpeg \\\n    && rm -rf \/var\/cache\/apk\/*\n\n# Composer'\u0131 y\u00fckle\nCOPY --from=composer:latest \/usr\/bin\/composer \/usr\/local\/bin\/composer\n\n# \u00c7al\u0131\u015fma dizinini ayarla\nWORKDIR \/var\/www\/html\n\n# Uygulama ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00fckle (\u00fcretim ortam\u0131 i\u00e7in --no-dev kullan\u0131labilir)\nCOPY app\/composer.json app\/composer.lock .\/\nRUN composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader\n\n# Uygulama kodunu kopyala\nCOPY app .\n\n# \u0130zinleri ayarla\nRUN chown -R www-data:www-data \/var\/www\/html \\\n    && chmod -R 775 \/var\/www\/html\/storage \\\n    && chmod -R 775 \/var\/www\/html\/bootstrap\/cache\n\nEXPOSE 9000\nCMD [\"php-fpm\"]\n<\/code><\/pre>\n<p>Bu Dockerfile \u015funlar\u0131 yapar:<\/p>\n<ul>\n<li><code>php:8.2-fpm-alpine<\/code> imaj\u0131n\u0131 temel al\u0131r (PHP 8.2 ve Alpine Linux).<\/li>\n<li>Laravel&#8217;in ihtiya\u00e7 duydu\u011fu PHP uzant\u0131lar\u0131n\u0131 (pdo, pdo_mysql, zip, gd, intl vb.) kurar.<\/li>\n<li>Composer&#8217;\u0131 y\u00fckler.<\/li>\n<li>Uygulama kodunu kopyalar ve gerekli dizinlere yazma izinleri verir.<\/li>\n<li>PHP-FPM&#8217;in 9000 portunu a\u00e7ar ve PHP-FPM&#8217;i ba\u015flat\u0131r.<\/li>\n<\/ul>\n<h3>Veritaban\u0131 Ba\u011flant\u0131s\u0131 ve Migrasyonlar<\/h3>\n<p>Laravel projemizin <code>.env<\/code> dosyas\u0131n\u0131 (<code>laravel-docker-app\/.env<\/code>) a\u00e7\u0131n ve veritaban\u0131 ba\u011flant\u0131 bilgilerini Docker Compose dosyam\u0131zdaki ayarlarla e\u015fle\u015fecek \u015fekilde g\u00fcncelleyin:<\/p>\n<pre><code class=\"language-ini\">DB_CONNECTION=mysql\nDB_HOST=db\nDB_PORT=3306\nDB_DATABASE=laravel_docker\nDB_USERNAME=laravel_user\nDB_PASSWORD=secret\n<\/code><\/pre>\n<p>Burada \u00f6nemli olan, <code>DB_HOST<\/code> de\u011ferini <code>db<\/code> olarak ayarlamakt\u0131r. Bu, Docker Compose a\u011f\u0131ndaki MySQL servisinin ad\u0131d\u0131r. Di\u011fer de\u011ferler, <code>docker-compose.yml<\/code> dosyas\u0131ndaki <code>environment<\/code> de\u011fi\u015fkenleri ile e\u015fle\u015fmelidir.<\/p>\n<p>\u015eimdi, t\u00fcm servislerimizi ilk kez \u00e7al\u0131\u015ft\u0131ral\u0131m:<\/p>\n<pre><code class=\"language-bash\">docker compose up -d --build\n<\/code><\/pre>\n<p>Bu komut:<\/p>\n<ul>\n<li><code>--build<\/code>: Dockerfile&#8217;dan <code>app<\/code> servisini yeniden in\u015fa eder.<\/li>\n<li><code>-d<\/code>: Konteynerleri arka planda (detached mode) \u00e7al\u0131\u015ft\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Servisleriniz \u00e7al\u0131\u015fmaya ba\u015flad\u0131ktan sonra, Laravel migrasyonlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rarak veritaban\u0131 tablolar\u0131n\u0131 olu\u015fturabiliriz:<\/p>\n<pre><code class=\"language-bash\">docker compose exec app php artisan migrate\n<\/code><\/pre>\n<p><code>docker compose exec app<\/code> komutu, <code>app<\/code> konteyneri i\u00e7inde bir komut \u00e7al\u0131\u015ft\u0131rmam\u0131z\u0131 sa\u011flar. Bu sayede <code>php artisan<\/code> komutlar\u0131n\u0131 do\u011frudan Docker ortam\u0131nda \u00e7al\u0131\u015ft\u0131rabiliriz.<\/p>\n<h3>Nginx Yap\u0131land\u0131rmas\u0131 (<code class=\"language-\">docker\/nginx\/default.conf<\/code>)<\/h3>\n<p>Son olarak, Nginx&#8217;in Laravel projemizi do\u011fru \u015fekilde sunmas\u0131 i\u00e7in yap\u0131land\u0131rmam\u0131z gerekiyor. <code>docker\/nginx\/default.conf<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki i\u00e7eri\u011fi ekleyin:<\/p>\n<pre><code class=\"language-nginx\">server {\n    listen 80;\n    server_name localhost;\n    root \/var\/www\/html\/public;\n    index index.php index.html index.htm;\n\n    location \/ {\n        try_files $uri $uri\/ \/index.php?$query_string;\n    }\n\n    location ~ \\.php$ {\n        try_files $uri =404;\n        fastcgi_split_path_info ^(.+\\.php)(\/.+)$;\n        fastcgi_pass app:9000; # app servisine y\u00f6nlendir\n        fastcgi_index index.php;\n        include fastcgi_params;\n        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n        fastcgi_param PATH_INFO $fastcgi_path_info;\n    }\n\n    location ~ \/\\.ht {\n        deny all;\n    }\n}\n<\/code><\/pre>\n<p>Bu Nginx yap\u0131land\u0131rmas\u0131:<\/p>\n<ul>\n<li>Gelen istekleri 80 portundan dinler ve <code>localhost<\/code> alan ad\u0131n\u0131 hedefler.<\/li>\n<li>Web k\u00f6k dizinini Laravel projesinin <code>public\/<\/code> dizini olarak ayarlar.<\/li>\n<li><code>location \/<\/code> blo\u011fu, t\u00fcm istekleri Laravel&#8217;in \u00f6n denetleyicisi olan <code>index.php<\/code>&#8216;ye y\u00f6nlendirir.<\/li>\n<li><code>location ~ \\.php$<\/code> blo\u011fu, PHP dosyalar\u0131 i\u00e7in istekleri <code>app<\/code> servisindeki PHP-FPM&#8217;e (<code>app:9000<\/code>) iletir.<\/li>\n<\/ul>\n<h3>\u0130lk \u00c7al\u0131\u015ft\u0131rma ve Kontrol<\/h3>\n<p>Nginx yap\u0131land\u0131rmas\u0131n\u0131 g\u00fcncelledikten sonra, Nginx konteynerini yeniden ba\u015flatman\u0131z gerekebilir:<\/p>\n<pre><code class=\"language-bash\">docker compose restart nginx\n<\/code><\/pre>\n<p>Art\u0131k taray\u0131c\u0131n\u0131z\u0131 a\u00e7\u0131p <code>http:\/\/localhost<\/code> adresine gitti\u011finizde, Laravel kar\u015f\u0131lama sayfas\u0131n\u0131 g\u00f6rmeniz gerekir. E\u011fer bir sorunla kar\u015f\u0131la\u015f\u0131rsan\u0131z, <code>docker compose logs<\/code> komutuyla servislerin loglar\u0131n\u0131 kontrol edebilirsiniz.<\/p>\n<p>Tebrikler! Laravel, Nginx ve MySQL y\u0131\u011f\u0131n\u0131n\u0131 Docker Compose ile ba\u015far\u0131yla kurdunuz ve \u00e7al\u0131\u015ft\u0131rd\u0131n\u0131z. Bu, geli\u015ftirme ortam\u0131n\u0131z\u0131 standartla\u015ft\u0131rman\u0131n ve verimlili\u011finizi art\u0131rman\u0131n ilk ad\u0131m\u0131d\u0131r.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryosu: \u00d6l\u00e7eklenebilirlik ve G\u00fcvenlik \u0130pu\u00e7lar\u0131<\/h2>\n<p>Bir geli\u015ftirme ortam\u0131n\u0131 kurmak harika, ancak ger\u00e7ek d\u00fcnya senaryolar\u0131nda uygulaman\u0131z\u0131 daha sa\u011flam, g\u00fcvenli ve \u00f6l\u00e7eklenebilir hale getirmek i\u00e7in ek ad\u0131mlar atmak gerekir. Bu b\u00f6l\u00fcmde, ortam de\u011fi\u015fkenleri, veri kal\u0131c\u0131l\u0131\u011f\u0131 ve HTTPS yap\u0131land\u0131rmas\u0131 gibi \u00f6nemli konulara odaklanaca\u011f\u0131z.<\/p>\n<h3>Geli\u015ftirme ve \u00dcretim Ortamlar\u0131 Aras\u0131ndaki Farklar<\/h3>\n<p>Geli\u015ftirme ortam\u0131n\u0131z genellikle h\u0131zl\u0131 iterasyon ve kolay hata ay\u0131klama \u00fczerine kuruludur. \u00dcretim ortam\u0131 ise performans, g\u00fcvenlik ve \u00f6l\u00e7eklenebilirlik odakl\u0131d\u0131r. Docker Compose, her iki ortam i\u00e7in de temel bir yap\u0131 sunsa da, \u00fcretimde farkl\u0131 Dockerfile&#8217;lar, Compose dosyalar\u0131 ve yap\u0131land\u0131rmalar kullanmak yayg\u0131n bir yakla\u015f\u0131md\u0131r. \u00d6rne\u011fin, \u00fcretimde <code>--no-dev<\/code> ile ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fcklemek, daha k\u00fc\u00e7\u00fck imajlar olu\u015fturmak ve debug ara\u00e7lar\u0131n\u0131 kald\u0131rmak \u00f6nemlidir. Ayr\u0131ca, \u00fcretimde veritaban\u0131 \u015fifreleri, API anahtarlar\u0131 gibi hassas bilgileri do\u011frudan <code>.env<\/code> dosyas\u0131nda tutmak yerine, Docker Secrets veya Kubernetes Secrets gibi daha g\u00fcvenli y\u00f6ntemler kullanmal\u0131s\u0131n\u0131z.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: \u00dcretim i\u00e7in ayr\u0131 bir <code>docker-compose.prod.yml<\/code> dosyas\u0131 olu\u015fturarak geli\u015ftirme ortam\u0131n\u0131zdan farkl\u0131 ayarlar uygulayabilirsiniz. \u00d6rne\u011fin, geli\u015ftirme ortam\u0131nda yerel bir volume kullan\u0131rken, \u00fcretimde bulut tabanl\u0131 bir veritaban\u0131 servisine ba\u011flanabilirsiniz.\n    <\/div>\n<h3>Ortam De\u011fi\u015fkenleri (<code class=\"language-\">.env<\/code>) ve G\u00fcvenlik<\/h3>\n<p><code>.env<\/code> dosyas\u0131, veritaban\u0131 kimlik bilgileri, API anahtarlar\u0131 ve uygulama ayarlar\u0131 gibi hassas bilgileri depolamak i\u00e7in kullan\u0131l\u0131r. Bu dosya, s\u00fcr\u00fcm kontrol\u00fcne (Git) eklenmemelidir (<code>.gitignore<\/code>&#8216;a ekleyin). <code>docker-compose.yml<\/code> dosyam\u0131zda <code>env_file: - .env<\/code> kullanarak bu de\u011fi\u015fkenleri Docker konteynerlerine aktard\u0131k. Bu, geli\u015ftirme ortam\u0131 i\u00e7in uygun olsa da, \u00fcretimde daha g\u00fcvenli y\u00f6ntemler tercih edilmelidir:<\/p>\n<ul>\n<li><strong>Docker Secrets:<\/strong> Docker Swarm ve Kubernetes gibi orkestrasyon ara\u00e7lar\u0131, hassas verileri g\u00fcvenli bir \u015fekilde depolamak ve konteynerlere da\u011f\u0131tmak i\u00e7in &#8220;secrets&#8221; mekanizmalar\u0131 sunar.<\/li>\n<li><strong>Ortam De\u011fi\u015fkeni Y\u00f6netimi:<\/strong> Bulut sa\u011flay\u0131c\u0131lar\u0131 (AWS, Azure, GCP) genellikle ortam de\u011fi\u015fkenlerini y\u00f6netmek i\u00e7in kendi servislerini sunar (\u00f6rne\u011fin, AWS Secrets Manager).<\/li>\n<\/ul>\n<h3>Veri Kal\u0131c\u0131l\u0131\u011f\u0131 (Volumes)<\/h3>\n<p><code>dbdata<\/code> ad\u0131nda bir Docker volume&#8217;u kullanarak MySQL verilerimizin kal\u0131c\u0131 olmas\u0131n\u0131 sa\u011flad\u0131k. Bu, konteynerler silinse veya yeniden olu\u015fturulsa bile veritaban\u0131 verilerinizin kaybolmamas\u0131n\u0131 garanti eder. Uygulaman\u0131z\u0131n \u00fcretti\u011fi kullan\u0131c\u0131 taraf\u0131ndan y\u00fcklenen dosyalar (profil resimleri, belgeler vb.) gibi di\u011fer kal\u0131c\u0131 veriler i\u00e7in de benzer bir yakla\u015f\u0131m izlemelisiniz. Laravel&#8217;in <code>storage\/app\/public<\/code> dizini i\u00e7in de bir volume tan\u0131mlayabilirsiniz:<\/p>\n<pre><code class=\"language-yaml\"># docker-compose.yml dosyan\u0131zda\napp:\n  # ... di\u011fer ayarlar\n  volumes:\n    - .\/app:\/var\/www\/html\n    - app_storage:\/var\/www\/html\/storage # Yeni volume\n\n# ...\n\nvolumes:\n  dbdata:\n    driver: local\n  app_storage: # Yeni volume tan\u0131m\u0131\n    driver: local\n<\/code><\/pre>\n<p>Bu, kullan\u0131c\u0131 taraf\u0131ndan y\u00fcklenen dosyalar\u0131n konteynerden ba\u011f\u0131ms\u0131z olarak kal\u0131c\u0131 olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>HTTPS Yap\u0131land\u0131rmas\u0131 (Let&#8217;s Encrypt ile \u00d6rnek)<\/h3>\n<p>\u00dcretim ortam\u0131nda uygulaman\u0131z\u0131n HTTPS \u00fczerinden g\u00fcvenli bir \u015fekilde sunulmas\u0131 kritik \u00f6neme sahiptir. Nginx&#8217;i Docker konteynerinde HTTPS i\u00e7in yap\u0131land\u0131rmak m\u00fcmk\u00fcnd\u00fcr. Let&#8217;s Encrypt, \u00fccretsiz SSL\/TLS sertifikalar\u0131 sa\u011flayan pop\u00fcler bir hizmettir. Certbot arac\u0131 ile bu sertifikalar\u0131 kolayca alabilir ve Nginx ile entegre edebilirsiniz.<\/p>\n<p>Docker Compose ile Let&#8217;s Encrypt entegrasyonu genellikle ayr\u0131 bir Certbot konteyneri kurarak ve Nginx konteynerini bu sertifikalar\u0131 kullanacak \u015fekilde yap\u0131land\u0131rarak yap\u0131l\u0131r. Bu, daha karma\u015f\u0131k bir kurulum gerektirse de, temel ad\u0131mlar \u015funlard\u0131r:<\/p>\n<ol>\n<li>Certbot konteynerini kurun ve sertifikalar\u0131 al\u0131n. Bu genellikle Nginx&#8217;i ge\u00e7ici olarak kapat\u0131p Certbot&#8217;un 80 portunu kullanmas\u0131n\u0131 gerektirebilir veya Nginx&#8217;i Certbot&#8217;un do\u011frulama isteklerini proxy edecek \u015fekilde yap\u0131land\u0131rabilirsiniz.<\/li>\n<li>Al\u0131nan sertifikalar\u0131 Nginx konteyneriyle payla\u015fmak i\u00e7in Docker volumes kullan\u0131n (\u00f6rne\u011fin, <code>.\/data\/certbot\/conf:\/etc\/letsencrypt<\/code>).<\/li>\n<li>Nginx yap\u0131land\u0131rma dosyan\u0131z\u0131 (<code>default.conf<\/code>) HTTPS&#8217;i dinleyecek ve sertifikalar\u0131 kullanacak \u015fekilde g\u00fcncelleyin.<\/li>\n<\/ol>\n<p>\u00d6rnek Nginx HTTPS yap\u0131land\u0131rmas\u0131 (<code>docker\/nginx\/default.conf<\/code>):<\/p>\n<pre><code class=\"language-nginx\">server {\n    listen 80;\n    server_name your_domain.com www.your_domain.com;\n    return 301 https:\/\/$host$request_uri; # T\u00fcm HTTP isteklerini HTTPS'e y\u00f6nlendir\n}\n\nserver {\n    listen 443 ssl http2;\n    server_name your_domain.com www.your_domain.com;\n    root \/var\/www\/html\/public;\n    index index.php index.html index.htm;\n\n    ssl_certificate \/etc\/letsencrypt\/live\/your_domain.com\/fullchain.pem;\n    ssl_certificate_key \/etc\/letsencrypt\/live\/your_domain.com\/privkey.pem;\n\n    # Di\u011fer SSL ayarlar\u0131 (g\u00fcvenlik i\u00e7in \u00f6nerilir)\n    ssl_protocols TLSv1.2 TLSv1.3;\n    ssl_prefer_server_ciphers on;\n    ssl_ciphers \"EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH\";\n    ssl_ecdh_curve secp384r1;\n    ssl_session_cache shared:SSL:10m;\n    ssl_session_tickets off;\n    ssl_stapling on;\n    ssl_stapling_verify on;\n    resolver 8.8.8.8 8.8.4.4 valid=300s;\n    resolver_timeout 5s;\n    add_header X-Frame-Options DENY;\n    add_header X-Content-Type-Options nosniff;\n    add_header X-XSS-Protection \"1; mode=block\";\n\n    location \/ {\n        try_files $uri $uri\/ \/index.php?$query_string;\n    }\n\n    location ~ \\.php$ {\n        try_files $uri =404;\n        fastcgi_split_path_info ^(.+\\.php)(\/.+)$;\n        fastcgi_pass app:9000;\n        fastcgi_index index.php;\n        include fastcgi_params;\n        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n        fastcgi_param PATH_INFO $fastcgi_path_info;\n    }\n\n    location ~ \/\\.ht {\n        deny all;\n    }\n}\n<\/code><\/pre>\n<p>Bu, alan ad\u0131n\u0131z ve sertifika yollar\u0131n\u0131zla g\u00fcncellenmesi gereken bir \u00f6rnektir. Ger\u00e7ek bir \u00fcretim ortam\u0131nda bu ad\u0131mlar\u0131 dikkatlice takip etmek ve Certbot&#8217;un resmi belgelerine ba\u015fvurmak \u00f6nemlidir.<\/p>\n<p>Bu ipu\u00e7lar\u0131 ve teknikler, geli\u015ftirme ortam\u0131n\u0131z\u0131 bir ad\u0131m \u00f6teye ta\u015f\u0131yarak daha g\u00fcvenli, verimli ve ger\u00e7ek d\u00fcnya senaryolar\u0131na uygun hale getirmenize yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h2>\u0130leri D\u00fczey Kullan\u0131m ve Optimizasyon Teknikleri Nelerdir?<\/h2>\n<p>Temel kurulumu tamamlad\u0131ktan sonra, Docker Compose ile Laravel geli\u015ftirme deneyiminizi daha da zenginle\u015ftirecek ve optimize edecek baz\u0131 ileri d\u00fczey tekniklere g\u00f6z atal\u0131m. Bu teknikler, daha b\u00fcy\u00fck projeler veya daha karma\u015f\u0131k i\u015f ak\u0131\u015flar\u0131 i\u00e7in \u00f6zellikle faydal\u0131d\u0131r.<\/p>\n<h3>\u00c7oklu Docker Compose Dosyalar\u0131 ile Ortam Y\u00f6netimi<\/h3>\n<p>Projeniz b\u00fcy\u00fcd\u00fck\u00e7e veya farkl\u0131 ortamlar (geli\u015ftirme, test, \u00fcretim) aras\u0131nda farkl\u0131 yap\u0131land\u0131rmalar kullanman\u0131z gerekti\u011finde, tek bir <code>docker-compose.yml<\/code> dosyas\u0131 y\u00f6netilemez hale gelebilir. Bu durumda, \u00e7oklu Docker Compose dosyalar\u0131 kullanmak iyi bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<p>\u00d6rne\u011fin, temel servislerinizi (<code>db<\/code>, <code>app<\/code>, <code>nginx<\/code>) <code>docker-compose.yml<\/code> dosyas\u0131nda tan\u0131mlayabilir, geli\u015ftirme ortam\u0131na \u00f6zg\u00fc ek servisleri (\u00f6rne\u011fin, MailHog, Redis) veya ayarlar\u0131 <code>docker-compose.override.yml<\/code> dosyas\u0131nda belirtebilirsiniz. Docker Compose, varsay\u0131lan olarak <code>docker-compose.yml<\/code> ve <code>docker-compose.override.yml<\/code> dosyalar\u0131n\u0131 otomatik olarak birle\u015ftirir.<\/p>\n<p>Ayr\u0131ca, \u00fcretim ortam\u0131 i\u00e7in <code>docker-compose.prod.yml<\/code> gibi ayr\u0131 bir dosya olu\u015fturabilir ve bu dosyay\u0131 a\u015fa\u011f\u0131daki gibi \u00e7al\u0131\u015ft\u0131rabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d\n<\/code><\/pre>\n<p>Bu yakla\u015f\u0131m, ortamlar aras\u0131nda tutarl\u0131l\u0131\u011f\u0131 korurken esneklik sa\u011flar.<\/p>\n<h3>CI\/CD Entegrasyonu ve Otomatik Da\u011f\u0131t\u0131m<\/h3>\n<p>Dockerize edilmi\u015f bir uygulama, S\u00fcrekli Entegrasyon (CI) ve S\u00fcrekli Da\u011f\u0131t\u0131m (CD) s\u00fcre\u00e7lerine m\u00fckemmel bir \u015fekilde entegre edilebilir. CI\/CD boru hatt\u0131n\u0131zda:<\/p>\n<ol>\n<li>Kodunuz her commit edildi\u011finde veya birle\u015ftirildi\u011finde, Docker imajlar\u0131n\u0131z\u0131 otomatik olarak olu\u015fturabilir (<code>docker build<\/code>).<\/li>\n<li>Bu imajlar\u0131 bir Docker kay\u0131t defterine (Docker Hub, GitLab Container Registry vb.) g\u00f6nderebilirsiniz (<code>docker push<\/code>).<\/li>\n<li>Da\u011f\u0131t\u0131m a\u015famas\u0131nda, sunucunuzda bu imajlar\u0131 \u00e7ekebilir ve Docker Compose veya Kubernetes gibi bir orkestrasyon arac\u0131yla uygulaman\u0131z\u0131 ba\u015flatabilirsiniz (<code>docker pull<\/code> ve <code>docker compose up<\/code>).<\/li>\n<\/ol>\n<p>Bu otomasyon, da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini h\u0131zland\u0131r\u0131r, insan hatas\u0131n\u0131 azalt\u0131r ve uygulaman\u0131z\u0131n daha g\u00fcvenilir bir \u015fekilde yay\u0131nlanmas\u0131n\u0131 sa\u011flar. GitHub Actions, GitLab CI\/CD, Jenkins gibi ara\u00e7lar bu entegrasyonu kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>Log Y\u00f6netimi ve \u0130zleme<\/h3>\n<p>Docker Compose ile \u00e7al\u0131\u015fan servislerin loglar\u0131n\u0131 izlemek, sorun giderme ve performans analizi i\u00e7in hayati \u00f6neme sahiptir. <code>docker compose logs<\/code> komutu, t\u00fcm servislerin loglar\u0131n\u0131 tek bir yerden g\u00f6rmenizi sa\u011flar. Belirli bir servisin loglar\u0131n\u0131 g\u00f6rmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">docker compose logs app\n<\/code><\/pre>\n<p>Ger\u00e7ek d\u00fcnya \u00fcretim ortamlar\u0131nda, loglar\u0131 merkezi bir log toplama sistemine (ELK Stack &#8211; Elasticsearch, Logstash, Kibana, Grafana, Prometheus) g\u00f6ndermek \u00f6nemlidir. Docker, loglar\u0131 \u00e7e\u015fitli s\u00fcr\u00fcc\u00fcler arac\u0131l\u0131\u011f\u0131yla harici sistemlere aktarman\u0131za olanak tan\u0131r. \u00d6rne\u011fin, <code>docker-compose.yml<\/code> dosyan\u0131zda <code>logging<\/code> yap\u0131land\u0131rmas\u0131n\u0131 kullanarak loglar\u0131 bir syslog sunucusuna veya JSON dosyalar\u0131na y\u00f6nlendirebilirsiniz.<\/p>\n<h3>Debugging \u0130pu\u00e7lar\u0131 ve Ara\u00e7lar\u0131<\/h3>\n<p>Laravel uygulamalar\u0131n\u0131 Docker konteynerleri i\u00e7inde hata ay\u0131klamak, geleneksel y\u00f6ntemlerden biraz farkl\u0131 olabilir. Xdebug, PHP uygulamalar\u0131 i\u00e7in pop\u00fcler bir hata ay\u0131klama arac\u0131d\u0131r. Xdebug&#8217;\u0131 PHP Dockerfile&#8217;\u0131n\u0131za ekleyebilir ve IDE&#8217;nizi (\u00f6rne\u011fin, VS Code veya PhpStorm) Xdebug ile ba\u011flant\u0131 kuracak \u015fekilde yap\u0131land\u0131rabilirsiniz.<\/p>\n<p><code>docker\/php\/Dockerfile<\/code> i\u00e7ine Xdebug ekleme \u00f6rne\u011fi:<\/p>\n<pre><code class=\"language-dockerfile\"># ... di\u011fer RUN komutlar\u0131ndan sonra\nRUN pecl install xdebug \\\n    && docker-php-ext-enable xdebug\n\nCOPY docker\/php\/xdebug.ini \/usr\/local\/etc\/php\/conf.d\/xdebug.ini\n<\/code><\/pre>\n<p>Ve <code>docker\/php\/xdebug.ini<\/code> dosyas\u0131:<\/p>\n<pre><code class=\"language-ini\">zend_extension=xdebug.so\nxdebug.mode=develop,debug\nxdebug.start_with_request=yes\nxdebug.client_host=host.docker.internal # macOS\/Windows i\u00e7in\n# xdebug.client_host=172.17.0.1 # Linux i\u00e7in (docker0 aray\u00fcz IP'si)\nxdebug.client_port=9003\nxdebug.idekey=VSCODE\n<\/code><\/pre>\n<p>Bu, IDE&#8217;nizin Docker konteyneri i\u00e7indeki PHP-FPM ile ileti\u015fim kurmas\u0131n\u0131 sa\u011flayarak kesme noktalar\u0131 (breakpoints) koyman\u0131za ve kodunuzu ad\u0131m ad\u0131m izlemenize olanak tan\u0131r. <code>host.docker.internal<\/code>, Docker Desktop y\u00fckl\u00fc sistemlerde (macOS, Windows) host makinesinin IP adresini temsil eder. Linux&#8217;ta ise genellikle <code>docker0<\/code> aray\u00fcz\u00fcn\u00fcn IP adresini (genellikle <code>172.17.0.1<\/code>) kullanman\u0131z gerekebilir.<\/p>\n<p>Bu ileri d\u00fczey teknikler, Docker Compose ile Laravel geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi daha verimli, g\u00fcvenli ve y\u00f6netilebilir hale getirmenize yard\u0131mc\u0131 olacakt\u0131r. Konteyner teknolojilerinin sundu\u011fu esneklik sayesinde, ihtiya\u00e7lar\u0131n\u0131za g\u00f6re ortam\u0131n\u0131z\u0131 s\u00fcrekli olarak optimize edebilirsiniz.<\/p>\n<h2>Sonu\u00e7: Geli\u015ftirme Ortam\u0131n\u0131z\u0131 D\u00f6n\u00fc\u015ft\u00fcr\u00fcn<\/h2>\n<p>Bu makalede, Laravel, Nginx ve MySQL&#8217;i Docker Compose ile nas\u0131l entegre edece\u011fimizi ad\u0131m ad\u0131m \u00f6\u011frendik. Karma\u015f\u0131k ve zaman al\u0131c\u0131 manuel kurulum s\u00fcre\u00e7lerinden, tek bir komutla \u00e7al\u0131\u015ft\u0131r\u0131labilen tutarl\u0131, izole ve ta\u015f\u0131nabilir bir geli\u015ftirme ortam\u0131na ge\u00e7i\u015f yapt\u0131k. Konteyner teknolojilerinin g\u00fcc\u00fcn\u00fc kullanarak, &#8220;benim makinemde \u00e7al\u0131\u015f\u0131yordu&#8221; sorununu geride b\u0131rakt\u0131k ve geli\u015ftirme verimlili\u011fimizi \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rd\u0131k.<\/p>\n<p>Ba\u015flang\u0131\u00e7ta Docker ve Docker Compose&#8217;un temel kavramlar\u0131n\u0131 anlad\u0131k, ard\u0131ndan Laravel projemizi ve gerekli yap\u0131land\u0131rma dosyalar\u0131n\u0131 olu\u015fturduk. MySQL veritaban\u0131n\u0131, PHP-FPM ile Laravel uygulamas\u0131n\u0131 ve Nginx web sunucusunu Docker Compose \u00e7at\u0131s\u0131 alt\u0131nda nas\u0131l bir araya getirece\u011fimizi ayr\u0131nt\u0131l\u0131 bir \u015fekilde inceledik. Ayr\u0131ca, ger\u00e7ek d\u00fcnya senaryolar\u0131nda kar\u015f\u0131la\u015fabilece\u011fimiz g\u00fcvenlik, veri kal\u0131c\u0131l\u0131\u011f\u0131 ve HTTPS gibi \u00f6nemli konulara de\u011findik. Son olarak, \u00e7oklu Docker Compose dosyalar\u0131, CI\/CD entegrasyonu ve hata ay\u0131klama gibi ileri d\u00fczey tekniklerle ortam\u0131m\u0131z\u0131 daha da optimize etme yollar\u0131n\u0131 ke\u015ffettik.<\/p>\n<p>Bu kurulum, sadece yerel geli\u015ftirme ortam\u0131n\u0131z\u0131 iyile\u015ftirmekle kalmayacak, ayn\u0131 zamanda uygulaman\u0131z\u0131n da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini de basitle\u015ftirecektir. Docker Compose, modern web geli\u015ftiricilerinin ara\u00e7 kutusunda vazge\u00e7ilmez bir yer edinmi\u015f olup, projelerinizi daha h\u0131zl\u0131, daha g\u00fcvenilir ve daha \u00f6l\u00e7eklenebilir bir \u015fekilde hayata ge\u00e7irmenize olanak tan\u0131r. Unutmay\u0131n, pratik yapmak ve farkl\u0131 senaryolar\u0131 denemek, bu ara\u00e7larda ustala\u015fman\u0131n anahtar\u0131d\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<dl>\n<dt><strong>1. Docker Compose ile kurdu\u011fum veritaban\u0131 verileri kaybolur mu?<\/strong><\/dt>\n<dd>Hay\u0131r, <code>docker-compose.yml<\/code> dosyas\u0131nda tan\u0131mlad\u0131\u011f\u0131m\u0131z <code>dbdata<\/code> gibi Docker volumes kullanarak veritaban\u0131 verilerinin kal\u0131c\u0131 olmas\u0131n\u0131 sa\u011flad\u0131k. Konteynerler silinse veya yeniden olu\u015fturulsa bile bu volume i\u00e7indeki veriler korunur.<\/dd>\n<dt><strong>2. Nginx yerine Apache kullanabilir miyim?<\/strong><\/dt>\n<dd>Evet, kesinlikle kullanabilirsiniz. Nginx yerine Apache imaj\u0131n\u0131 (\u00f6rne\u011fin, <code>httpd:alpine<\/code>) kullanabilir ve Nginx i\u00e7in yapt\u0131\u011f\u0131m\u0131z gibi Apache i\u00e7in de ayr\u0131 bir yap\u0131land\u0131rma dosyas\u0131 olu\u015fturup Docker Compose dosyas\u0131nda ilgili servisi g\u00fcncelleyebilirsiniz. Temel mant\u0131k ayn\u0131 kalacakt\u0131r.<\/dd>\n<dt><strong>3. Laravel projemde Composer ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 nas\u0131l g\u00fcncellerim?<\/strong><\/dt>\n<dd>Laravel konteyneri i\u00e7inde Composer&#8217;\u0131 \u00e7al\u0131\u015ft\u0131rman\u0131z gerekir. Bunun i\u00e7in a\u015fa\u011f\u0131daki komutu kullanabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">docker compose exec app composer update\n<\/code><\/pre>\n<p>        Bu komut, <code>app<\/code> servisi konteyneri i\u00e7inde <code>composer update<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131r ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131z\u0131 g\u00fcnceller.<\/dd>\n<dt><strong>4. Yeni bir PHP uzant\u0131s\u0131 eklemem gerekirse ne yapmal\u0131y\u0131m?<\/strong><\/dt>\n<dd>Yeni bir PHP uzant\u0131s\u0131 eklemeniz gerekti\u011finde, <code>docker\/php\/Dockerfile<\/code> dosyas\u0131n\u0131 d\u00fczenlemeniz ve gerekli uzant\u0131y\u0131 eklemeniz gerekir (\u00f6rne\u011fin, <code>RUN docker-php-ext-install new_extension<\/code>). De\u011fi\u015fiklikleri yapt\u0131ktan sonra, PHP konteynerinizi yeniden in\u015fa etmeniz ve ba\u015flatman\u0131z gerekir:<\/p>\n<pre><code class=\"language-bash\">docker compose up -d --build app\n<\/code><\/pre>\n<p>        Bu komut sadece <code>app<\/code> servisini yeniden in\u015fa edip ba\u015flatacakt\u0131r.<\/dd>\n<dt><strong>5. Geli\u015ftirme ortam\u0131nda HTTPS kullanmak zorunda m\u0131y\u0131m?<\/strong><\/dt>\n<dd>Hay\u0131r, geli\u015ftirme ortam\u0131nda HTTPS kullanmak zorunlu de\u011fildir ve genellikle HTTP (port 80) \u00fczerinden \u00e7al\u0131\u015fmak daha h\u0131zl\u0131 ve basittir. HTTPS yap\u0131land\u0131rmas\u0131 genellikle \u00fcretim ortamlar\u0131 i\u00e7in kritik \u00f6neme sahiptir. Ancak, taray\u0131c\u0131lar\u0131n baz\u0131 yeni \u00f6zelliklerinin (\u00f6rne\u011fin, Geolocation API) sadece HTTPS \u00fczerinden \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 unutmay\u0131n. Bu t\u00fcr \u00f6zelliklere ihtiyac\u0131n\u0131z varsa, geli\u015ftirme ortam\u0131n\u0131zda da HTTPS kullanmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Laravel, Nginx ve MySQL&#8217;i Docker Compose ile Kurulum Rehberi Modern web uygulamalar\u0131 geli\u015ftirirken kurulum s\u00fcre\u00e7lerinin karma\u015f\u0131kl\u0131\u011f\u0131yla m\u0131 bo\u011fu\u015fuyorsunuz?&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":[1],"tags":[],"class_list":{"0":"post-40089","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Giri\u015f: Neden Geli\u015ftirme Ortam\u0131 Kurulumu Bu Kadar Zorlu?<\/title>\n<meta name=\"description\" content=\"Modern web uygulamalar\u0131 geli\u015ftirirken kurulum s\u00fcre\u00e7lerinin karma\u015f\u0131kl\u0131\u011f\u0131yla m\u0131 bo\u011fu\u015fuyorsunuz? Laravel, Nginx ve MySQL&#039;i Docker Compose ile h\u0131zl\u0131ca nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin, geli\u015ftirme ortam\u0131n\u0131z\u0131 standartla\u015ft\u0131r\u0131n ve verimlili\u011finizi art\u0131r\u0131n.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Giri\u015f: Neden Geli\u015ftirme Ortam\u0131 Kurulumu Bu Kadar Zorlu?\" \/>\n<meta property=\"og:description\" content=\"Modern web uygulamalar\u0131 geli\u015ftirirken kurulum s\u00fcre\u00e7lerinin karma\u015f\u0131kl\u0131\u011f\u0131yla m\u0131 bo\u011fu\u015fuyorsunuz? Laravel, Nginx ve MySQL&#039;i Docker Compose ile h\u0131zl\u0131ca nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin, geli\u015ftirme ortam\u0131n\u0131z\u0131 standartla\u015ft\u0131r\u0131n ve verimlili\u011finizi art\u0131r\u0131n.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-24T13:22:18+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"28 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Giri\u015f: Neden Geli\u015ftirme Ortam\u0131 Kurulumu Bu Kadar Zorlu?\",\"datePublished\":\"2026-02-24T13:22:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/\"},\"wordCount\":4565,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/\",\"name\":\"Giri\u015f: Neden Geli\u015ftirme Ortam\u0131 Kurulumu Bu Kadar Zorlu?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-24T13:22:18+00:00\",\"description\":\"Modern web uygulamalar\u0131 geli\u015ftirirken kurulum s\u00fcre\u00e7lerinin karma\u015f\u0131kl\u0131\u011f\u0131yla m\u0131 bo\u011fu\u015fuyorsunuz? Laravel, Nginx ve MySQL'i Docker Compose ile h\u0131zl\u0131ca nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin, geli\u015ftirme ortam\u0131n\u0131z\u0131 standartla\u015ft\u0131r\u0131n ve verimlili\u011finizi art\u0131r\u0131n.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Giri\u015f: Neden Geli\u015ftirme Ortam\u0131 Kurulumu Bu Kadar Zorlu?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Giri\u015f: Neden Geli\u015ftirme Ortam\u0131 Kurulumu Bu Kadar Zorlu?","description":"Modern web uygulamalar\u0131 geli\u015ftirirken kurulum s\u00fcre\u00e7lerinin karma\u015f\u0131kl\u0131\u011f\u0131yla m\u0131 bo\u011fu\u015fuyorsunuz? Laravel, Nginx ve MySQL'i Docker Compose ile h\u0131zl\u0131ca nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin, geli\u015ftirme ortam\u0131n\u0131z\u0131 standartla\u015ft\u0131r\u0131n ve verimlili\u011finizi art\u0131r\u0131n.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/","og_locale":"tr_TR","og_type":"article","og_title":"Giri\u015f: Neden Geli\u015ftirme Ortam\u0131 Kurulumu Bu Kadar Zorlu?","og_description":"Modern web uygulamalar\u0131 geli\u015ftirirken kurulum s\u00fcre\u00e7lerinin karma\u015f\u0131kl\u0131\u011f\u0131yla m\u0131 bo\u011fu\u015fuyorsunuz? Laravel, Nginx ve MySQL'i Docker Compose ile h\u0131zl\u0131ca nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin, geli\u015ftirme ortam\u0131n\u0131z\u0131 standartla\u015ft\u0131r\u0131n ve verimlili\u011finizi art\u0131r\u0131n.","og_url":"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-24T13:22:18+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"28 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Giri\u015f: Neden Geli\u015ftirme Ortam\u0131 Kurulumu Bu Kadar Zorlu?","datePublished":"2026-02-24T13:22:18+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/"},"wordCount":4565,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/","url":"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/","name":"Giri\u015f: Neden Geli\u015ftirme Ortam\u0131 Kurulumu Bu Kadar Zorlu?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-24T13:22:18+00:00","description":"Modern web uygulamalar\u0131 geli\u015ftirirken kurulum s\u00fcre\u00e7lerinin karma\u015f\u0131kl\u0131\u011f\u0131yla m\u0131 bo\u011fu\u015fuyorsunuz? Laravel, Nginx ve MySQL'i Docker Compose ile h\u0131zl\u0131ca nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frenin, geli\u015ftirme ortam\u0131n\u0131z\u0131 standartla\u015ft\u0131r\u0131n ve verimlili\u011finizi art\u0131r\u0131n.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/giris-neden-gelistirme-ortami-kurulumu-bu-kadar-zorlu\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Giri\u015f: Neden Geli\u015ftirme Ortam\u0131 Kurulumu Bu Kadar Zorlu?"}]},{"@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\/40089","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=40089"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/40089\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=40089"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=40089"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=40089"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}