{"id":39525,"date":"2026-02-23T12:21:10","date_gmt":"2026-02-23T09:21:10","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/"},"modified":"2026-02-23T12:21:10","modified_gmt":"2026-02-23T09:21:10","slug":"temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/","title":{"rendered":"Temel Kavramlara Derin Dal\u0131\u015f: Neden Docker Compose ve Bu \u00dc\u00e7l\u00fc?"},"content":{"rendered":"<h1>Laravel, Nginx ve MySQL&#8217;i Docker Compose ile Kurulum Rehberi<\/h1>\n<p>Modern web geli\u015ftirme d\u00fcnyas\u0131nda, projelerin karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131k\u00e7a geli\u015ftirme ortamlar\u0131n\u0131n kurulumu ve y\u00f6netimi de zorla\u015fabiliyor. Ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131, farkl\u0131 i\u015fletim sistemlerindeki uyumluluk sorunlar\u0131 veya yeni bir ekip \u00fcyesinin projeye adapte olma s\u00fcreci, geli\u015ftiricilerin zaman\u0131n\u0131 bo\u015fa harcayabilen yayg\u0131n problemlerdir. Bu makalede, bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm olan Docker Compose&#8217;u kullanarak Laravel, Nginx ve MySQL \u00fc\u00e7l\u00fcs\u00fcn\u00fc nas\u0131l kolayca kuraca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Kendi izole ve ta\u015f\u0131nabilir geli\u015ftirme ortam\u0131n\u0131z\u0131 olu\u015fturarak verimlili\u011finizi art\u0131r\u0131n!<\/p>\n<h2>Temel Kavramlara Derin Dal\u0131\u015f: Neden Docker Compose ve Bu \u00dc\u00e7l\u00fc?<\/h2>\n<p>Web uygulamalar\u0131 geli\u015ftirirken kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck zorluklardan biri, projenin t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 ve hizmetlerini do\u011fru bir \u015fekilde kurmak ve y\u00f6netmektir. Geleneksel yakla\u015f\u0131mlar genellikle i\u015fletim sistemi d\u00fczeyinde manuel kurulumlar gerektirir; bu da farkl\u0131 geli\u015ftiriciler aras\u0131nda tutars\u0131z ortamlara ve &#8220;benim makinemde \u00e7al\u0131\u015f\u0131yordu&#8221; sendromuna yol a\u00e7ar. \u0130\u015fte tam bu noktada Docker ve Docker Compose devreye girerek bu sorunlara modern ve etkili \u00e7\u00f6z\u00fcmler sunar.<\/p>\n<p>Peki, tam olarak nedir bu Docker ve Docker Compose? Docker, uygulamalar\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 &#8220;konteyner&#8221; ad\u0131 verilen izole edilmi\u015f, hafif ve ta\u015f\u0131nabilir birimler halinde paketlemeye olanak tan\u0131yan a\u00e7\u0131k kaynakl\u0131 bir platformdur. Bir konteyner, uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gereken her \u015feyi (kod, \u00e7al\u0131\u015fma zaman\u0131, sistem ara\u00e7lar\u0131, sistem k\u00fct\u00fcphaneleri vb.) i\u00e7erir. Bu sayede uygulaman\u0131z, hangi ortamda \u00e7al\u0131\u015f\u0131rsa \u00e7al\u0131\u015fs\u0131n her zaman ayn\u0131 \u015fekilde davran\u0131r. Bu izolasyon, farkl\u0131 projeler i\u00e7in farkl\u0131 PHP versiyonlar\u0131na veya veritaban\u0131 sunucular\u0131na ihtiya\u00e7 duyman\u0131z durumunda b\u00fcy\u00fck bir esneklik sa\u011flar ve ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131n\u0131 tamamen ortadan kald\u0131r\u0131r.<\/p>\n<p>Docker Compose ise tek ba\u015f\u0131na Docker&#8217;\u0131n yeteneklerini bir ad\u0131m \u00f6teye ta\u015f\u0131r. Tek bir uygulama genellikle birden fazla hizmetten olu\u015fur; \u00f6rne\u011fin bir web uygulamas\u0131 i\u00e7in bir web sunucusu (Nginx), bir uygulama \u00e7al\u0131\u015fma zaman\u0131 (PHP-FPM) ve bir veritaban\u0131 (MySQL). Docker Compose, bu \u00e7oklu konteyner uygulamalar\u0131n\u0131 tek bir YAML dosyas\u0131 kullanarak tan\u0131mlaman\u0131za ve tek bir komutla y\u00f6netmenize olanak tan\u0131r. Bu, t\u00fcm hizmetlerinizi ayn\u0131 anda ba\u015flatmak, durdurmak veya yeniden olu\u015fturmak i\u00e7in karma\u015f\u0131k komut dizileri yazma ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r, geli\u015ftirme s\u00fcrecinizi inan\u0131lmaz derecede h\u0131zland\u0131r\u0131r ve basitle\u015ftirir.<\/p>\n<p>\u015eimdi gelelim neden Laravel, Nginx ve MySQL \u00fc\u00e7l\u00fcs\u00fcn\u00fc tercih etti\u011fimize. Laravel, PHP ekosisteminin en pop\u00fcler ve g\u00fc\u00e7l\u00fc web framework&#8217;lerinden biridir. H\u0131zl\u0131 geli\u015ftirme, temiz kod yap\u0131s\u0131 ve zengin \u00f6zellik setleri sayesinde geli\u015ftiricilerin favorisidir. Ancak Laravel uygulamalar\u0131n\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in bir PHP \u00e7al\u0131\u015fma zaman\u0131na (genellikle PHP-FPM) ve genellikle bir veritaban\u0131na ihtiya\u00e7 duyar. Nginx, y\u00fcksek performansl\u0131, hafif ve esnek bir web sunucusudur. \u00d6zellikle statik i\u00e7erik sunumu ve ters proxy yetenekleriyle bilinir, Laravel gibi PHP tabanl\u0131 uygulamalar i\u00e7in m\u00fckemmel bir se\u00e7imdir. \u0130stekleri do\u011frudan PHP-FPM&#8217;ye y\u00f6nlendirerek uygulaman\u0131z\u0131n daha verimli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. MySQL ise d\u00fcnyan\u0131n en yayg\u0131n kullan\u0131lan a\u00e7\u0131k kaynakl\u0131 ili\u015fkisel veritaban\u0131 y\u00f6netim sistemlerinden biridir. Sa\u011flaml\u0131\u011f\u0131, \u00f6l\u00e7eklenebilirli\u011fi ve geni\u015f topluluk deste\u011fi sayesinde Laravel uygulamalar\u0131 i\u00e7in ideal bir veritaban\u0131 \u00e7\u00f6z\u00fcm\u00fcd\u00fcr.<\/p>\n<p>Bu \u00fc\u00e7 teknolojinin Docker Compose ile bir araya gelmesi, geli\u015ftiricilere izole edilmi\u015f, tutarl\u0131, ta\u015f\u0131nabilir ve h\u0131zl\u0131 bir geli\u015ftirme ortam\u0131 sunar. Art\u0131k &#8220;benim makinemde \u00e7al\u0131\u015f\u0131yor&#8221; gibi sorunlarla u\u011fra\u015fmak yerine, her ekip \u00fcyesi ayn\u0131 ortamda \u00e7al\u0131\u015fabilir, bu da i\u015fbirli\u011fini ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131r\u0131r. \u00d6rne\u011fin, b\u00fcy\u00fck bir e-ticaret platformu geli\u015ftiren bir ekip d\u00fc\u015f\u00fcn\u00fcn. Her bir mikroservis (\u00fcr\u00fcn y\u00f6netimi, kullan\u0131c\u0131 auth, \u00f6deme sistemi) kendi Docker Compose dosyas\u0131yla izole bir \u015fekilde y\u00f6netilebilir. Bu sayede farkl\u0131 ekipler birbirlerinin ortamlar\u0131n\u0131 etkilemeden ba\u011f\u0131ms\u0131z olarak \u00e7al\u0131\u015fabilir, yeni geli\u015ftiriciler saniyeler i\u00e7inde t\u00fcm projeyi aya\u011fa kald\u0131rabilir ve \u00fcretim ortam\u0131na ge\u00e7i\u015f \u00e7ok daha sorunsuz hale gelir. Bu sinerji, modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biridir.<\/p>\n<h2>Proje Yap\u0131s\u0131n\u0131 Olu\u015fturma ve Temel Docker Compose Dosyas\u0131: Nereden Ba\u015flamal\u0131y\u0131z?<\/h2>\n<p>Herhangi bir b\u00fcy\u00fck projede oldu\u011fu gibi, Docker Compose ile Laravel uygulamas\u0131 kurarken de d\u00fczenli bir proje yap\u0131s\u0131 olu\u015fturmak, uzun vadede y\u00f6netilebilirli\u011fi ve anla\u015f\u0131l\u0131rl\u0131\u011f\u0131 art\u0131r\u0131r. \u0130lk ad\u0131m\u0131m\u0131z, projemiz i\u00e7in ana bir dizin olu\u015fturmak ve ard\u0131ndan Docker ile ilgili dosyalar\u0131 ayr\u0131 bir klas\u00f6rde tutmakt\u0131r. Bu yakla\u015f\u0131m, projenizin k\u00f6k dizinini temiz tutarken, Docker konfig\u00fcrasyonlar\u0131n\u0131 da kolayca bulman\u0131z\u0131 sa\u011flar.<\/p>\n<p>\u00d6ncelikle, terminalinizi a\u00e7\u0131n ve projeniz i\u00e7in bir dizin olu\u015fturun. \u00d6rne\u011fin:<\/p>\n<pre><code>\nmkdir my-laravel-app\ncd my-laravel-app\n<\/code><\/pre>\n<p>Bu ana dizin alt\u0131nda, Docker konfig\u00fcrasyon dosyalar\u0131m\u0131z\u0131 bar\u0131nd\u0131racak ayr\u0131 bir klas\u00f6r olu\u015fturmak iyi bir pratiktir:<\/p>\n<pre><code>\nmkdir docker\n<\/code><\/pre>\n<p>\u015eimdi, Laravel projemizi bu ana dizine kurabiliriz. E\u011fer zaten bir Laravel projeniz varsa, onu do\u011frudan <code class=\"language-\">my-laravel-app<\/code> dizininin i\u00e7ine kopyalayabilirsiniz. Yoksa, Composer kullanarak yeni bir Laravel projesi olu\u015fturabiliriz. Ancak burada dikkat etmemiz gereken bir nokta var: Laravel&#8217;i do\u011frudan Docker konteynerleri i\u00e7inde kurmak daha iyi bir yakla\u015f\u0131md\u0131r, \u00e7\u00fcnk\u00fc bu, ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve PHP versiyonunu konteyner ortam\u0131na g\u00f6re optimize etmemizi sa\u011flar. \u015eimdilik, sadece ana dizini olu\u015ftural\u0131m ve Laravel projesini daha sonra Docker i\u00e7inde aya\u011fa kald\u0131r\u0131rken kurar\u0131z.<\/p>\n<p>Proje yap\u0131m\u0131z temel olarak \u015f\u00f6yle g\u00f6r\u00fcnecek:<\/p>\n<pre><code>\nmy-laravel-app\/\n\u251c\u2500\u2500 docker\/\n\u2502   \u251c\u2500\u2500 nginx\/\n\u2502   \u2502   \u2514\u2500\u2500 default.conf\n\u2502   \u2514\u2500\u2500 php-fpm\/\n\u2502       \u2514\u2500\u2500 Dockerfile\n\u251c\u2500\u2500 docker-compose.yml\n\u2514\u2500\u2500 .env (Laravel'e \u00f6zel ortam de\u011fi\u015fkenleri)\n<\/code><\/pre>\n<p>\u015eimdi, Docker Compose&#8217;un kalbi olan <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131n\u0131 ana dizinimizde olu\u015ftural\u0131m. Bu dosya, t\u00fcm servislerimizi, a\u011f ayarlar\u0131m\u0131z\u0131 ve volume&#8217;lerimizi tan\u0131mlayaca\u011f\u0131m\u0131z yerdir. \u0130lk ba\u015fta temel bir yap\u0131 ile ba\u015flayaca\u011f\u0131z:<\/p>\n<pre><code>\n# my-laravel-app\/docker-compose.yml\nversion: '3.8'\n\nservices:\n  # Servisler buraya gelecek (mysql, nginx, app)\n\nvolumes:\n  # Kal\u0131c\u0131 veri depolama i\u00e7in volume'ler\n  db_data:\n    driver: local\n\nnetworks:\n  # Servisler aras\u0131 ileti\u015fim i\u00e7in \u00f6zel a\u011f\n  app_network:\n    driver: bridge\n<\/code><\/pre>\n<p>Bu temel yap\u0131, Docker Compose dosyam\u0131z\u0131n iskeletini olu\u015fturur. <code class=\"language-\">version: '3.8'<\/code> ifadesi, Docker Compose dosyas\u0131n\u0131n hangi s\u00fcr\u00fcm s\u00f6zdizimini kulland\u0131\u011f\u0131n\u0131 belirtir. <code class=\"language-\">services<\/code> blo\u011fu, uygulamam\u0131z\u0131n farkl\u0131 bile\u015fenlerini (veritaban\u0131, web sunucusu, uygulama sunucusu vb.) tan\u0131mlayaca\u011f\u0131m\u0131z yerdir. <code class=\"language-\">volumes<\/code> blo\u011fu, konteynerler aras\u0131nda veya konteynerler ile host makine aras\u0131nda veri payla\u015f\u0131m\u0131 ve kal\u0131c\u0131l\u0131\u011f\u0131 i\u00e7in kullan\u0131l\u0131r. <code class=\"language-\">db_data<\/code> ad\u0131nda bir volume tan\u0131mlad\u0131k, bu sayede MySQL verilerimiz konteyner silinse bile kaybolmayacakt\u0131r. Son olarak, <code class=\"language-\">networks<\/code> blo\u011fu, servislerimizin birbirleriyle g\u00fcvenli ve izole bir \u015fekilde ileti\u015fim kurmas\u0131n\u0131 sa\u011flayan \u00f6zel bir a\u011f olu\u015fturmam\u0131z\u0131 sa\u011flar. <code class=\"language-\">app_network<\/code> ad\u0131nda bir k\u00f6pr\u00fc a\u011f\u0131 (bridge network) tan\u0131mlad\u0131k; t\u00fcm servislerimiz bu a\u011fa ba\u011flanacak ve birbirlerini isimleriyle tan\u0131yabileceklerdir.<\/p>\n<p>Bu ad\u0131m, Docker Compose ile Laravel projemizi kurman\u0131n temelini atar. D\u00fczenli bir dizin yap\u0131s\u0131 ve iyi tan\u0131mlanm\u0131\u015f bir <code class=\"language-\">docker-compose.yml<\/code> iskeleti, ilerleyen ad\u0131mlarda i\u015fimizi olduk\u00e7a kolayla\u015ft\u0131racakt\u0131r. Ayr\u0131ca, <code class=\"language-\">.env<\/code> dosyas\u0131n\u0131n \u00f6nemini unutmamak gerekir. Laravel&#8217;in veritaban\u0131 ba\u011flant\u0131 bilgileri, uygulama anahtar\u0131 gibi hassas ve ortama \u00f6zg\u00fc de\u011fi\u015fkenleri bu dosyada saklar\u0131z. Docker Compose ortam\u0131nda, bu <code class=\"language-\">.env<\/code> dosyas\u0131n\u0131 konteynerlere do\u011fru bir \u015fekilde iletmek, uygulaman\u0131z\u0131n sorunsuz \u00e7al\u0131\u015fmas\u0131 i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<div class=\"expert-tip\">\n  <strong>Uzman \u0130pucu:<\/strong> Projenizin k\u00f6k dizininde bir <code class=\"language-\">.dockerignore<\/code> dosyas\u0131 olu\u015fturmak, Docker imajlar\u0131n\u0131z\u0131n boyutunu \u00f6nemli \u00f6l\u00e7\u00fcde k\u00fc\u00e7\u00fcltebilir. Bu dosya, Docker&#8217;\u0131n imaj olu\u015fturma s\u0131ras\u0131nda hangi dosya ve dizinleri g\u00f6z ard\u0131 etmesi gerekti\u011fini belirtir. \u00d6rne\u011fin, <code class=\"language-\">node_modules<\/code>, <code class=\"language-\">.git<\/code>, <code class=\"language-\">.DS_Store<\/code> gibi gereksiz dosyalar\u0131 bu listeye ekleyerek build s\u00fcresini ve imaj boyutunu optimize edebilirsiniz.\n<\/div>\n<h2>Servislerin Detayl\u0131 Tan\u0131mlamas\u0131: MySQL, Nginx ve PHP-FPM Konteynerleri Nas\u0131l Yap\u0131land\u0131r\u0131l\u0131r?<\/h2>\n<p>Docker Compose dosyam\u0131z\u0131n iskeletini olu\u015fturduktan sonra, s\u0131ra uygulamam\u0131z\u0131n temel bile\u015fenlerini, yani MySQL veritaban\u0131n\u0131, Nginx web sunucusunu ve PHP-FPM uygulama sunucusunu (Laravel i\u00e7in) tan\u0131mlamaya geldi. Her bir servis, kendi i\u00e7inde ba\u011f\u0131ms\u0131z bir konteyneri temsil edecek ve belirli g\u00f6revleri yerine getirecektir. Bu b\u00f6l\u00fcmde, her bir servisin <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131nda nas\u0131l yap\u0131land\u0131r\u0131laca\u011f\u0131n\u0131 ve ilgili yard\u0131mc\u0131 dosyalar\u0131n (Dockerfile, Nginx config) nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131 detayl\u0131ca inceleyece\u011fiz.<\/p>\n<h3>MySQL Servisi<\/h3>\n<p>Veritaban\u0131, \u00e7o\u011fu web uygulamas\u0131n\u0131n kalbidir. MySQL servisi i\u00e7in resmi Docker imaj\u0131n\u0131 kullanaca\u011f\u0131z ve baz\u0131 temel ortam de\u011fi\u015fkenlerini ayarlayarak kolayca yap\u0131land\u0131raca\u011f\u0131z. Veri kal\u0131c\u0131l\u0131\u011f\u0131 i\u00e7in bir Docker volume&#8217;\u00fc tan\u0131mlamak kritik \u00f6neme sahiptir, aksi takdirde konteyner her yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda verileriniz kaybolur.<\/p>\n<pre><code>\n# my-laravel-app\/docker-compose.yml (services blo\u011funa ekleyin)\nservices:\n  mysql:\n    image: mysql:8.0\n    container_name: laravel_mysql\n    restart: unless-stopped\n    environment:\n      MYSQL_DATABASE: laravel_db\n      MYSQL_ROOT_PASSWORD: root_password\n      MYSQL_USER: laravel_user\n      MYSQL_PASSWORD: laravel_password\n      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' # Geli\u015ftirme ortam\u0131 i\u00e7in\n    volumes:\n      - db_data:\/var\/lib\/mysql\n    ports:\n      - \"3306:3306\" # \u0130ste\u011fe ba\u011fl\u0131, host'tan eri\u015fim i\u00e7in\n    networks:\n      - app_network\n<\/code><\/pre>\n<p>Burada <code class=\"language-\">image: mysql:8.0<\/code> ile MySQL 8.0 s\u00fcr\u00fcm\u00fcn\u00fc kullanaca\u011f\u0131m\u0131z\u0131 belirtiyoruz. <code class=\"language-\">environment<\/code> blo\u011fu, veritaban\u0131 ad\u0131, root \u015fifresi ve Laravel&#8217;in kullanaca\u011f\u0131 kullan\u0131c\u0131 ad\u0131\/\u015fifresi gibi \u00f6nemli ayarlar\u0131 yapar. <code class=\"language-\">volumes: - db_data:\/var\/lib\/mysql<\/code> sat\u0131r\u0131, <code class=\"language-\">db_data<\/code> adl\u0131 volume&#8217;\u00fc konteynerin <code class=\"language-\">\/var\/lib\/mysql<\/code> dizinine ba\u011flar; bu sayede verileriniz konteyner ya\u015fam d\u00f6ng\u00fcs\u00fcnden ba\u011f\u0131ms\u0131z olarak kal\u0131c\u0131 olur. <code class=\"language-\">ports<\/code> ayar\u0131, host makinenizden 3306 portu \u00fczerinden MySQL&#8217;e eri\u015fmenizi sa\u011flar, bu geli\u015ftirme s\u0131ras\u0131nda veritaban\u0131 y\u00f6neticileri (\u00f6rne\u011fin DBeaver, MySQL Workbench) kullanmak i\u00e7in faydal\u0131d\u0131r. Son olarak, <code class=\"language-\">app_network<\/code> a\u011f\u0131na ba\u011flanarak di\u011fer servislerle ileti\u015fim kurmas\u0131n\u0131 sa\u011fl\u0131yoruz.<\/p>\n<h3>PHP-FPM (Laravel Uygulamas\u0131) Servisi<\/h3>\n<p>Laravel uygulamam\u0131z\u0131n \u00e7al\u0131\u015faca\u011f\u0131 PHP ortam\u0131n\u0131 PHP-FPM (FastCGI Process Manager) arac\u0131l\u0131\u011f\u0131yla sa\u011flayaca\u011f\u0131z. Bu servis i\u00e7in \u00f6zel bir <code class=\"language-\">Dockerfile<\/code> olu\u015fturarak, PHP&#8217;nin gerekli uzant\u0131lar\u0131n\u0131 ve Composer&#8217;\u0131 kuraca\u011f\u0131z.<\/p>\n<p>\u00d6ncelikle, <code class=\"language-\">docker\/php-fpm\/Dockerfile<\/code> dosyas\u0131n\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code>\n# my-laravel-app\/docker\/php-fpm\/Dockerfile\nFROM php:8.2-fpm-alpine\n\n# Gerekli PHP uzant\u0131lar\u0131n\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00fckleyin\nRUN apk add --no-cache \\\n    autoconf \\\n    build-base \\\n    libzip-dev \\\n    libpng-dev \\\n    jpeg-dev \\\n    git \\\n    oniguruma-dev \\\n    libxml2-dev \\\n    freetype-dev \\\n    icu-dev \\\n    $PHPIZE_DEPS \\\n    && docker-php-ext-install -j$(nproc) pdo_mysql zip gd exif pcntl bcmath opcache intl \\\n    && docker-php-ext-configure gd --with-freetype --with-jpeg \\\n    && docker-php-ext-enable opcache\n\n# Composer'\u0131 global olarak kurun\nCOPY --from=composer:latest \/usr\/bin\/composer \/usr\/bin\/composer\n\n# \u00c7al\u0131\u015fma dizinini ayarlay\u0131n\nWORKDIR \/var\/www\/html\n\n# Kullan\u0131c\u0131 ve grup olu\u015fturma (g\u00fcvenlik i\u00e7in)\nRUN addgroup -g 1000 laravel \\\n    && adduser -u 1000 -G laravel -s \/bin\/sh -D laravel\n\nUSER laravel\n\nEXPOSE 9000\nCMD [\"php-fpm\"]\n<\/code><\/pre>\n<p>Bu <code class=\"language-\">Dockerfile<\/code>, PHP 8.2 FPM Alpine Linux tabanl\u0131 bir imaj kullan\u0131r. Gerekli PHP uzant\u0131lar\u0131n\u0131 (pdo_mysql, zip, gd vb.) ve Composer&#8217;\u0131 kurar. <code class=\"language-\">WORKDIR \/var\/www\/html<\/code> ile Laravel projemizin konumunu belirliyoruz. G\u00fcvenlik i\u00e7in <code class=\"language-\">laravel<\/code> ad\u0131nda root olmayan bir kullan\u0131c\u0131 olu\u015fturup onu kullan\u0131yoruz. \u015eimdi <code class=\"language-\">docker-compose.yml<\/code> i\u00e7indeki PHP-FPM servisini tan\u0131mlayal\u0131m:<\/p>\n<pre><code>\n# my-laravel-app\/docker-compose.yml (services blo\u011funa ekleyin)\nservices:\n  # ... mysql servisi ...\n\n  app:\n    build:\n      context: .\/docker\/php-fpm\n      dockerfile: Dockerfile\n    container_name: laravel_app\n    restart: unless-stopped\n    volumes:\n      - .:\/var\/www\/html # Laravel projesini ba\u011fla\n      - .\/docker\/php-fpm\/php.ini:\/usr\/local\/etc\/php\/conf.d\/custom.ini # \u0130ste\u011fe ba\u011fl\u0131, PHP ayarlar\u0131\n    environment:\n      APP_ENV: local\n      CONTAINER_ROLE: app\n    networks:\n      - app_network\n    depends_on:\n      - mysql\n<\/code><\/pre>\n<p><code class=\"language-\">build<\/code> anahtar\u0131, Docker Compose&#8217;un bu servis i\u00e7in <code class=\"language-\">docker\/php-fpm\/Dockerfile<\/code> dosyas\u0131n\u0131 kullanarak bir imaj olu\u015fturmas\u0131n\u0131 sa\u011flar. <code class=\"language-\">volumes: - .:\/var\/www\/html<\/code> sat\u0131r\u0131 \u00e7ok \u00f6nemlidir; bu, projemizin k\u00f6k dizinini (<code>.<\/code>) konteynerin <code class=\"language-\">\/var\/www\/html<\/code> dizinine ba\u011flar. Bu sayede host makinede yapt\u0131\u011f\u0131n\u0131z kod de\u011fi\u015fiklikleri an\u0131nda konteyner i\u00e7inde de g\u00f6r\u00fcn\u00fcr olur. <code class=\"language-\">depends_on: - mysql<\/code> ile <code class=\"language-\">app<\/code> servisinin <code class=\"language-\">mysql<\/code> servisi ba\u015flamadan \u00f6nce ba\u015flamamas\u0131n\u0131 sa\u011fl\u0131yoruz.<\/p>\n<h3>Nginx Servisi<\/h3>\n<p>Nginx, gelen HTTP isteklerini kar\u015f\u0131layacak ve bunlar\u0131 PHP-FPM servisine y\u00f6nlendirecek olan web sunucumuzdur. Nginx i\u00e7in de \u00f6zel bir konfig\u00fcrasyon dosyas\u0131 olu\u015fturmam\u0131z gerekiyor.<\/p>\n<p>\u00d6ncelikle, <code class=\"language-\">docker\/nginx\/default.conf<\/code> dosyas\u0131n\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code>\n# my-laravel-app\/docker\/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; # PHP-FPM servisi ve portu\n        fastcgi_index index.php;\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 Nginx konfig\u00fcrasyonu, t\u00fcm istekleri Laravel&#8217;in <code class=\"language-\">public<\/code> dizinine y\u00f6nlendirir ve <code class=\"language-\">.php<\/code> uzant\u0131l\u0131 dosyalar\u0131 <code class=\"language-\">app<\/code> servisine (PHP-FPM) 9000 portu \u00fczerinden iletir. <code class=\"language-\">fastcgi_pass app:9000<\/code> sat\u0131r\u0131ndaki <code class=\"language-\">app<\/code> ifadesi, Docker Compose a\u011f\u0131ndaki PHP-FPM servisimizin ad\u0131d\u0131r. \u015eimdi <code class=\"language-\">docker-compose.yml<\/code> i\u00e7indeki Nginx servisini tan\u0131mlayal\u0131m:<\/p>\n<pre><code>\n# my-laravel-app\/docker-compose.yml (services blo\u011funa ekleyin)\nservices:\n  # ... mysql ve app servisleri ...\n\n  nginx:\n    image: nginx:stable-alpine\n    container_name: laravel_nginx\n    restart: unless-stopped\n    ports:\n      - \"80:80\"\n    volumes:\n      - .:\/var\/www\/html # Laravel projesini ba\u011fla\n      - .\/docker\/nginx\/default.conf:\/etc\/nginx\/conf.d\/default.conf # Nginx config dosyas\u0131n\u0131 ba\u011fla\n    networks:\n      - app_network\n    depends_on:\n      - app # Nginx, app servisi ba\u015flad\u0131ktan sonra ba\u015flas\u0131n\n<\/code><\/pre>\n<p>Nginx i\u00e7in resmi <code class=\"language-\">nginx:stable-alpine<\/code> imaj\u0131n\u0131 kullan\u0131yoruz. <code class=\"language-\">ports: - \"80:80\"<\/code> ile host makinenizin 80 portunu konteynerin 80 portuna ba\u011fl\u0131yoruz, b\u00f6ylece taray\u0131c\u0131n\u0131zdan <code class=\"language-\">http:\/\/localhost<\/code> adresine eri\u015febilirsiniz. <code class=\"language-\">volumes<\/code> blo\u011funda, hem Laravel projemizi hem de \u00f6zel Nginx konfig\u00fcrasyon dosyam\u0131z\u0131 ba\u011fl\u0131yoruz. <code class=\"language-\">depends_on: - app<\/code> ile Nginx&#8217;in PHP-FPM servisi ba\u015flamadan \u00f6nce ba\u015flamamas\u0131n\u0131 sa\u011fl\u0131yoruz.<\/p>\n<p>Bu detayl\u0131 tan\u0131mlamalarla, Laravel, Nginx ve MySQL&#8217;den olu\u015fan eksiksiz bir Docker Compose ortam\u0131n\u0131 yap\u0131land\u0131rm\u0131\u015f oluyoruz. Her bir servisin kendine ait bir sorumlulu\u011fu ve ba\u011f\u0131ms\u0131z bir ya\u015fam d\u00f6ng\u00fcs\u00fc vard\u0131r, ancak <code class=\"language-\">networks<\/code> ve <code class=\"language-\">depends_on<\/code> sayesinde sorunsuz bir \u015fekilde bir araya gelirler. Bu yap\u0131land\u0131rma, hem geli\u015ftirme hem de daha sonraki da\u011f\u0131t\u0131m s\u00fcre\u00e7leri i\u00e7in sa\u011flam bir temel sunar.<\/p>\n<div class=\"expert-tip\">\n  <strong>Vaka Analizi: Birden Fazla Laravel Projesini Tek Nginx ile Y\u00f6netme<\/strong><br \/>\n  B\u00fcy\u00fck bir \u015firketin birden fazla mikroservis veya farkl\u0131 Laravel projeleri geli\u015ftirdi\u011fini d\u00fc\u015f\u00fcn\u00fcn. Her projenin kendi Docker Compose dosyas\u0131 olabilir. Ancak, t\u00fcm bu projeleri tek bir Nginx konteyneri \u00fczerinden y\u00f6netmek isteyebilirsiniz. Bu durumda, ana Nginx konteynerinizi bir ters proxy olarak yap\u0131land\u0131rabilir ve her projenin kendi PHP-FPM servisine istekleri y\u00f6nlendirebilirsiniz. \u00d6rne\u011fin, <code class=\"language-\">app1.local<\/code> isteklerini <code class=\"language-\">project1_app:9000<\/code>&#8216;e, <code class=\"language-\">app2.local<\/code> isteklerini <code class=\"language-\">project2_app:9000<\/code>&#8216;e y\u00f6nlendiren bir <code class=\"language-\">nginx.conf<\/code> dosyas\u0131 yazarak bu mimariyi kolayca kurabilirsiniz. Bu yakla\u015f\u0131m, geli\u015ftirme ortam\u0131n\u0131zda birden fazla projenin e\u015f zamanl\u0131 ve izole bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.\n<\/div>\n<h2>Laravel Uygulamas\u0131n\u0131 Docker Ortam\u0131na Haz\u0131rlama ve \u0130lk \u00c7al\u0131\u015ft\u0131rma: Ad\u0131m Ad\u0131m Rehber<\/h2>\n<p>\u00d6nceki ad\u0131mlarda, Docker Compose dosyam\u0131z\u0131 ve ilgili servis konfig\u00fcrasyonlar\u0131m\u0131z\u0131 olu\u015fturarak Laravel, Nginx ve MySQL i\u00e7in temel bir ortam haz\u0131rlad\u0131k. \u015eimdi s\u0131ra, Laravel uygulamas\u0131n\u0131 bu Docker ortam\u0131na entegre etmeye ve her \u015feyin sorunsuz bir \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmaya geldi. Bu b\u00f6l\u00fcm, ad\u0131m ad\u0131m kurulumu tamamlayacak ve uygulaman\u0131z\u0131 taray\u0131c\u0131n\u0131zda g\u00f6r\u00fcnt\u00fclemenizi sa\u011flayacak pratik bilgileri i\u00e7ermektedir.<\/p>\n<h3>1. Laravel Projesini Kopyalama (E\u011fer Mevcutsa)<\/h3>\n<p>E\u011fer zaten bir Laravel projeniz varsa, <code class=\"language-\">my-laravel-app<\/code> dizininizin k\u00f6k\u00fcne kopyalay\u0131n. E\u011fer yeni bir proje olu\u015fturduysan\u0131z, bu ad\u0131m\u0131 atlayabilirsiniz. Docker Compose, projemizin k\u00f6k dizinini (<code>.<\/code>) PHP-FPM konteynerinin <code class=\"language-\">\/var\/www\/html<\/code> dizinine ba\u011flad\u0131\u011f\u0131 i\u00e7in, Laravel projenizin t\u00fcm dosyalar\u0131 bu dizinde olmal\u0131d\u0131r.<\/p>\n<h3>2. Laravel&#8217;in <code class=\"language-\">.env<\/code> Dosyas\u0131n\u0131 D\u00fczenleme<\/h3>\n<p>Laravel&#8217;in <code class=\"language-\">.env<\/code> dosyas\u0131, uygulaman\u0131n ortam de\u011fi\u015fkenlerini i\u00e7erir. Veritaban\u0131 ba\u011flant\u0131s\u0131 i\u00e7in bu dosyay\u0131 Docker Compose ortam\u0131m\u0131za uygun \u015fekilde d\u00fczenlememiz gerekiyor. Projenizin k\u00f6k dizinindeki <code class=\"language-\">.env<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki de\u011fi\u015fiklikleri yap\u0131n:<\/p>\n<pre><code>\n# my-laravel-app\/.env\nDB_CONNECTION=mysql\nDB_HOST=mysql      # Docker Compose servis ad\u0131\nDB_PORT=3306\nDB_DATABASE=laravel_db\nDB_USERNAME=laravel_user\nDB_PASSWORD=laravel_password\n<\/code><\/pre>\n<p>Buradaki en \u00f6nemli de\u011fi\u015fiklik <code class=\"language-\">DB_HOST<\/code> de\u011feridir. Docker Compose a\u011f\u0131nda, servisler birbirlerini servis adlar\u0131yla tan\u0131r. Bu nedenle, <code class=\"language-\">mysql<\/code> servisine eri\u015fmek i\u00e7in <code class=\"language-\">DB_HOST<\/code> olarak <code class=\"language-\">mysql<\/code> yaz\u0131yoruz. Di\u011fer veritaban\u0131 de\u011fi\u015fkenleri, <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131nda <code class=\"language-\">mysql<\/code> servisi i\u00e7in ayarlad\u0131\u011f\u0131m\u0131z <code class=\"language-\">environment<\/code> de\u011fi\u015fkenleriyle e\u015fle\u015fmelidir.<\/p>\n<h3>3. Konteynerleri Aya\u011fa Kald\u0131rma<\/h3>\n<p>Art\u0131k her \u015fey haz\u0131r! Projenizin k\u00f6k dizininde (<code>my-laravel-app\/<\/code>) terminalinizi a\u00e7\u0131n ve a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131rarak t\u00fcm servisleri ba\u015flat\u0131n:<\/p>\n<pre><code>\ndocker compose up -d\n<\/code><\/pre>\n<ul>\n<li><code class=\"language-\">up<\/code>: Docker Compose dosyas\u0131nda tan\u0131mlanan t\u00fcm servisleri olu\u015fturur ve ba\u015flat\u0131r.<\/li>\n<li><code class=\"language-\">-d<\/code> (detached mode): Konteynerleri arka planda \u00e7al\u0131\u015ft\u0131r\u0131r, b\u00f6ylece terminaliniz serbest kal\u0131r.<\/li>\n<\/ul>\n<p>Bu komut, Nginx, PHP-FPM ve MySQL konteynerlerini olu\u015fturacak, gerekli imajlar\u0131 indirecek (e\u011fer yerelde yoksa) ve onlar\u0131 ba\u015flatacakt\u0131r. \u0130lk \u00e7al\u0131\u015ft\u0131rmada biraz zaman alabilir, \u00e7\u00fcnk\u00fc imajlar\u0131n indirilmesi ve PHP-FPM imaj\u0131n\u0131n olu\u015fturulmas\u0131 gerekecektir.<\/p>\n<h3>4. Laravel Ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 Y\u00fckleme ve Veritaban\u0131n\u0131 Haz\u0131rlama<\/h3>\n<p>Konteynerler \u00e7al\u0131\u015fmaya ba\u015flad\u0131ktan sonra, Laravel&#8217;in Composer ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00fcklememiz ve veritaban\u0131 tablolar\u0131n\u0131 olu\u015fturmam\u0131z gerekiyor. Bu i\u015flemleri do\u011frudan PHP-FPM konteyneri i\u00e7inde yapaca\u011f\u0131z. Bunun i\u00e7in <code class=\"language-\">docker compose exec<\/code> komutunu kullanaca\u011f\u0131z:<\/p>\n<pre><code>\n# Composer ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00fckle\ndocker compose exec app composer install\n\n# Laravel uygulama anahtar\u0131n\u0131 olu\u015ftur\ndocker compose exec app php artisan key:generate\n\n# Veritaban\u0131 tablolar\u0131n\u0131 olu\u015ftur (migrations)\ndocker compose exec app php artisan migrate\n<\/code><\/pre>\n<p><code class=\"language-\">docker compose exec app<\/code> komutu, <code class=\"language-\">app<\/code> (PHP-FPM) servisi i\u00e7inde bir komut \u00e7al\u0131\u015ft\u0131rmam\u0131z\u0131 sa\u011flar. Bu sayede, Laravel&#8217;in ihtiya\u00e7 duydu\u011fu t\u00fcm kurulum ad\u0131mlar\u0131n\u0131 izole Docker ortam\u0131nda ger\u00e7ekle\u015ftirebiliriz.<\/p>\n<h3>5. Dosya \u0130zinlerini Ayarlama (Gerekirse)<\/h3>\n<p>Bazen Laravel&#8217;in <code class=\"language-\">storage<\/code> ve <code class=\"language-\">bootstrap\/cache<\/code> dizinlerine yazma izinleri konusunda sorunlar ya\u015fanabilir. Bu durumda, a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131rarak izinleri d\u00fczeltebilirsiniz:<\/p>\n<pre><code>\ndocker compose exec app chmod -R 775 storage bootstrap\/cache\ndocker compose exec app chown -R laravel:laravel storage bootstrap\/cache\n<\/code><\/pre>\n<p>Bu komutlar, ilgili dizinlere yazma izni verir ve sahipli\u011fi <code class=\"language-\">Dockerfile<\/code> i\u00e7inde olu\u015fturdu\u011fumuz <code class=\"language-\">laravel<\/code> kullan\u0131c\u0131s\u0131na atar.<\/p>\n<h3>6. Uygulamay\u0131 Taray\u0131c\u0131da Test Etme<\/h3>\n<p>T\u00fcm bu ad\u0131mlar\u0131 tamamlad\u0131ktan sonra, taray\u0131c\u0131n\u0131z\u0131 a\u00e7\u0131n ve <code class=\"language-\">http:\/\/localhost<\/code> adresine gidin. E\u011fer her \u015fey yolunda gittiyse, Laravel&#8217;in ho\u015f geldiniz sayfas\u0131n\u0131 g\u00f6rmelisiniz. Tebrikler! Laravel uygulaman\u0131z Docker Compose ile ba\u015far\u0131yla \u00e7al\u0131\u015f\u0131yor.<\/p>\n<div class=\"expert-tip\">\n  <strong>Hata Ay\u0131klama \u0130pu\u00e7lar\u0131:<\/strong> E\u011fer bir sorunla kar\u015f\u0131la\u015f\u0131rsan\u0131z, <code class=\"language-\">docker compose logs<\/code> komutu ile t\u00fcm servislerin loglar\u0131n\u0131 kontrol edebilirsiniz. Belirli bir servisin loglar\u0131n\u0131 g\u00f6rmek i\u00e7in <code class=\"language-\">docker compose logs [servis_ad\u0131]<\/code> (\u00f6rne\u011fin <code class=\"language-\">docker compose logs app<\/code>) kullanabilirsiniz. Ayr\u0131ca, bir konteynerin i\u00e7ine girip manuel olarak komut \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code class=\"language-\">docker compose exec [servis_ad\u0131] bash<\/code> (veya <code class=\"language-\">sh<\/code>) komutunu kullanabilirsiniz.\n<\/div>\n<p><strong>Vaka Analizi: K\u00fc\u00e7\u00fck Bir E-ticaret Uygulamas\u0131n\u0131n Geli\u015ftirme Ortam\u0131<\/strong><\/p>\n<p>Bir geli\u015ftirici, yeni bir e-ticaret uygulamas\u0131n\u0131n prototipini olu\u015fturmak istiyor. Geleneksel y\u00f6ntemlerle PHP, Nginx ve MySQL&#8217;i manuel olarak kurmak saatlerini alabilir ve i\u015fletim sistemi uyumlulu\u011fu sorunlar\u0131yla kar\u015f\u0131la\u015fabilir. Docker Compose kullanarak, yukar\u0131daki ad\u0131mlar\u0131 takip ederek sadece 15-20 dakika i\u00e7inde t\u00fcm geli\u015ftirme ortam\u0131n\u0131 kurdu. Laravel projesini kopyalad\u0131, <code class=\"language-\">.env<\/code> dosyas\u0131n\u0131 d\u00fczenledi, <code class=\"language-\">docker compose up -d<\/code> komutunu \u00e7al\u0131\u015ft\u0131rd\u0131 ve ard\u0131ndan Composer ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 ve veritaban\u0131 migrate i\u015flemlerini yapt\u0131. Art\u0131k uygulamas\u0131n\u0131 an\u0131nda geli\u015ftirmeye ba\u015flayabilir, ba\u011f\u0131ml\u0131l\u0131k sorunlar\u0131 veya ortam farkl\u0131l\u0131klar\u0131 hakk\u0131nda endi\u015felenmesine gerek kalmaz. Bu, \u00f6zellikle h\u0131zl\u0131 prototipleme ve MVP (Minimum Viable Product) geli\u015ftirme s\u00fcre\u00e7lerinde inan\u0131lmaz bir zaman tasarrufu sa\u011flar.<\/p>\n<h2>\u0130leri Seviye Optimizasyonlar ve Geli\u015ftirme \u0130pu\u00e7lar\u0131: Performans ve G\u00fcvenlik<\/h2>\n<p>Docker Compose ile Laravel, Nginx ve MySQL ortam\u0131m\u0131z\u0131 kurduk ve \u00e7al\u0131\u015ft\u0131rd\u0131k. Ancak, bu kurulumu daha da optimize etmek, performans\u0131n\u0131 art\u0131rmak ve g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 azaltmak i\u00e7in yapabilece\u011fimiz baz\u0131 ileri seviye ad\u0131mlar bulunmaktad\u0131r. Bu b\u00f6l\u00fcmde, hem geli\u015ftirme hem de potansiyel \u00fcretim ortamlar\u0131 i\u00e7in faydal\u0131 olabilecek ipu\u00e7lar\u0131na ve tekniklere odaklanaca\u011f\u0131z.<\/p>\n<h3>Dockerfile Optimizasyonlar\u0131: Daha K\u00fc\u00e7\u00fck ve H\u0131zl\u0131 \u0130majlar<\/h3>\n<p>PHP-FPM i\u00e7in kulland\u0131\u011f\u0131m\u0131z <code class=\"language-\">Dockerfile<\/code>, \u00e7o\u011fu senaryo i\u00e7in yeterli olsa da, imaj boyutunu k\u00fc\u00e7\u00fcltmek ve build s\u00fcrelerini h\u0131zland\u0131rmak m\u00fcmk\u00fcnd\u00fcr. Bunun en etkili yollar\u0131ndan biri &#8220;\u00e7ok a\u015famal\u0131 yap\u0131lar&#8221; (multi-stage builds) kullanmakt\u0131r. Bu teknik, imaj\u0131n farkl\u0131 a\u015famalar\u0131nda ge\u00e7ici dosyalar\u0131 veya derleme ara\u00e7lar\u0131n\u0131 kullanarak nihai imaj\u0131n sadece gerekli bile\u015fenleri i\u00e7ermesini sa\u011flar.<\/p>\n<pre><code>\n# my-laravel-app\/docker\/php-fpm\/Dockerfile (Multi-stage build \u00f6rne\u011fi)\n# A\u015fama 1: Ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckle ve derle\nFROM composer:2 as composer_builder\n\nWORKDIR \/app\nCOPY composer.json composer.lock .\/\nRUN composer install --no-dev --no-autoloader --no-scripts --optimize-autoloader\n\n# A\u015fama 2: Nihai imaj\nFROM php:8.2-fpm-alpine\n\n# Gerekli PHP uzant\u0131lar\u0131n\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00fckleyin\nRUN apk add --no-cache \\\n    # ... \u00f6nceki uzant\u0131 kurulumlar\u0131 ...\n\n# Composer'\u0131 global olarak kurun\nCOPY --from=composer:latest \/usr\/bin\/composer \/usr\/bin\/composer\n\n# \u00d6nceki a\u015famadan Composer ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kopyala\nCOPY --from=composer_builder \/app\/vendor \/var\/www\/html\/vendor\n\n# \u00c7al\u0131\u015fma dizinini ayarlay\u0131n\nWORKDIR \/var\/www\/html\n\n# Kullan\u0131c\u0131 ve grup olu\u015fturma (g\u00fcvenlik i\u00e7in)\nRUN addgroup -g 1000 laravel \\\n    && adduser -u 1000 -G laravel -s \/bin\/sh -D laravel\n\nUSER laravel\n\nEXPOSE 9000\nCMD [\"php-fpm\"]\n<\/code><\/pre>\n<p>Bu \u00f6rnekte, Composer ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 ayr\u0131 bir <code class=\"language-\">composer:2<\/code> imaj\u0131nda kurup, sadece <code class=\"language-\">vendor<\/code> dizinini nihai PHP-FPM imaj\u0131na kopyal\u0131yoruz. Bu, PHP-FPM imaj\u0131n\u0131n daha k\u00fc\u00e7\u00fck olmas\u0131n\u0131 sa\u011flar, \u00e7\u00fcnk\u00fc Composer&#8217;\u0131n kendisi ve derleme s\u0131ras\u0131nda kullan\u0131lan ge\u00e7ici dosyalar nihai imaja dahil edilmez. Ayr\u0131ca, <code class=\"language-\">RUN<\/code> komutlar\u0131n\u0131 birle\u015ftirerek ve <code class=\"language-\">apk add<\/code> komutlar\u0131nda <code class=\"language-\">--no-cache<\/code> kullanarak katman say\u0131s\u0131n\u0131 ve \u00f6nbellek boyutunu azaltabilirsiniz.<\/p>\n<h3>Nginx Performans Ayarlar\u0131: Daha H\u0131zl\u0131 Yan\u0131tlar<\/h3>\n<p>Nginx, zaten olduk\u00e7a h\u0131zl\u0131 bir web sunucusudur, ancak performans\u0131n\u0131 daha da art\u0131rmak i\u00e7in baz\u0131 ayarlar yapabiliriz. <code class=\"language-\">docker\/nginx\/default.conf<\/code> dosyan\u0131z\u0131 g\u00fcncelleyerek s\u0131k\u0131\u015ft\u0131rma, \u00f6nbellekleme ve HTTP\/2 gibi \u00f6zellikleri etkinle\u015ftirebilirsiniz.<\/p>\n<pre><code>\n# my-laravel-app\/docker\/nginx\/default.conf (Performans ayarlar\u0131 eklendi)\nserver {\n    listen 80;\n    listen 443 ssl http2; # HTTP\/2 ve SSL i\u00e7in\n    # ... di\u011fer ayarlar ...\n\n    # Gzip s\u0131k\u0131\u015ft\u0131rmay\u0131 etkinle\u015ftir\n    gzip on;\n    gzip_vary on;\n    gzip_proxied any;\n    gzip_types text\/plain text\/css application\/json application\/javascript text\/xml application\/xml application\/xml+rss text\/javascript;\n    gzip_comp_level 6;\n    gzip_min_length 1000;\n\n    # Statik dosyalar i\u00e7in \u00f6nbellekleme (\u00f6rn: resimler, CSS, JS)\n    location ~* \\.(jpg|jpeg|gif|png|css|js|ico|xml)$ {\n        expires 30d;\n        log_not_found off;\n    }\n\n    # ... PHP-FPM ve di\u011fer location bloklar\u0131 ...\n}\n<\/code><\/pre>\n<p>HTTP\/2 ve SSL i\u00e7in 443 portunu dinlemeyi ekledik (bunun i\u00e7in SSL sertifikas\u0131 yap\u0131land\u0131rman\u0131z gerekir). <code class=\"language-\">gzip<\/code> ayarlar\u0131, sunucudan g\u00f6nderilen metin tabanl\u0131 dosyalar\u0131 s\u0131k\u0131\u015ft\u0131rarak bant geni\u015fli\u011fini azalt\u0131r ve y\u00fckleme s\u00fcrelerini h\u0131zland\u0131r\u0131r. Statik dosyalar i\u00e7in <code class=\"language-\">expires<\/code> ba\u015fl\u0131\u011f\u0131 belirleyerek taray\u0131c\u0131 \u00f6nbelleklemesini te\u015fvik edebilir, b\u00f6ylece tekrar eden ziyaretlerde bu dosyalar\u0131n yeniden indirilmesini \u00f6nleyebilirsiniz.<\/p>\n<h3>MySQL Optimizasyonlar\u0131: Veritaban\u0131 Performans\u0131<\/h3>\n<p>MySQL performans\u0131n\u0131 art\u0131rmak i\u00e7in genellikle <code class=\"language-\">my.cnf<\/code> dosyas\u0131nda ayarlamalar yap\u0131l\u0131r. Docker ortam\u0131nda, bu dosyay\u0131 bir volume olarak ba\u011flayarak \u00f6zelle\u015ftirebiliriz. \u00d6rne\u011fin, <code class=\"language-\">innodb_buffer_pool_size<\/code> gibi parametreler veritaban\u0131 performans\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde etkileyebilir.<\/p>\n<p>\u00d6ncelikle <code class=\"language-\">docker\/mysql\/my.cnf<\/code> dosyas\u0131n\u0131 olu\u015fturun (\u00f6rnek):<\/p>\n<pre><code>\n# my-laravel-app\/docker\/mysql\/my.cnf\n[mysqld]\ninnodb_buffer_pool_size = 256M # Sistem RAM'ine g\u00f6re ayarlanmal\u0131\nmax_connections = 150\n# ... di\u011fer ayarlar ...\n<\/code><\/pre>\n<p>Ard\u0131ndan <code class=\"language-\">docker-compose.yml<\/code> dosyan\u0131zdaki MySQL servisine bu volume&#8217;\u00fc ekleyin:<\/p>\n<pre><code>\n# my-laravel-app\/docker-compose.yml (mysql servisine ekleyin)\nservices:\n  mysql:\n    # ... di\u011fer ayarlar ...\n    volumes:\n      - db_data:\/var\/lib\/mysql\n      - .\/docker\/mysql\/my.cnf:\/etc\/mysql\/conf.d\/my.cnf # Yeni eklenen sat\u0131r\n<\/code><\/pre>\n<p>Bu \u015fekilde, MySQL konteyneriniz \u00f6zel ayarlar\u0131n\u0131zla ba\u015flayacakt\u0131r. Unutmay\u0131n, bu ayarlar sistem kaynaklar\u0131n\u0131za ve uygulaman\u0131z\u0131n ihtiya\u00e7lar\u0131na g\u00f6re dikkatlice yap\u0131lmal\u0131d\u0131r.<\/p>\n<h3>Geli\u015ftirme ve \u00dcretim Ortam\u0131 Farklar\u0131: Xdebug ve G\u00fcvenlik<\/h3>\n<p>Geli\u015ftirme ve \u00fcretim ortamlar\u0131 aras\u0131nda belirgin farklar vard\u0131r. Geli\u015ftirme s\u0131ras\u0131nda hata ay\u0131klama (debugging) i\u00e7in Xdebug gibi ara\u00e7lara ihtiya\u00e7 duyarken, \u00fcretimde bu ara\u00e7lar performans\u0131 d\u00fc\u015f\u00fcrebilir ve g\u00fcvenlik a\u00e7\u0131klar\u0131 olu\u015fturabilir. Xdebug&#8217;\u0131 PHP-FPM konteynerinize dahil etmek i\u00e7in <code class=\"language-\">Dockerfile<\/code>&#8216;\u0131n\u0131za eklemeler yapabilir ve <code class=\"language-\">php.ini<\/code> dosyas\u0131nda etkinle\u015ftirebilirsiniz.<\/p>\n<pre><code>\n# my-laravel-app\/docker\/php-fpm\/Dockerfile (Xdebug kurulumu)\n# ... di\u011fer RUN komutlar\u0131 ...\nRUN apk add --no-cache php8-pecl-xdebug \\\n    && docker-php-ext-enable xdebug\n<\/code><\/pre>\n<p>Ve <code class=\"language-\">docker\/php-fpm\/php.ini<\/code> dosyan\u0131za (veya <code class=\"language-\">custom.ini<\/code> dosyan\u0131za):<\/p>\n<pre><code>\n# my-laravel-app\/docker\/php-fpm\/php.ini\n[XDebug]\nxdebug.mode=develop,debug\nxdebug.start_with_request=yes\nxdebug.client_host=host.docker.internal # Docker Desktop i\u00e7in\nxdebug.client_port=9003\n<\/code><\/pre>\n<p>\u00dcretim ortam\u0131nda ise Xdebug&#8217;\u0131 kesinlikle devre d\u0131\u015f\u0131 b\u0131rakmal\u0131 veya hi\u00e7 kurmamal\u0131s\u0131n\u0131z. Ayr\u0131ca, \u00fcretimde <code class=\"language-\">MYSQL_ALLOW_EMPTY_PASSWORD<\/code> gibi ayarlar\u0131 kullanmamal\u0131, g\u00fc\u00e7l\u00fc parolalar ve root olmayan kullan\u0131c\u0131lar tercih etmelisiniz. Nginx i\u00e7in SSL sertifikalar\u0131 kullanmak ve g\u00fcvenlik ba\u015fl\u0131klar\u0131n\u0131 (Content Security Policy, X-XSS-Protection) eklemek de \u00f6nemlidir.<\/p>\n<div class=\"expert-tip\">\n  <strong>Mobil Uyumluluk ve Geli\u015ftirme:<\/strong> Docker Compose ortam\u0131n\u0131z, mobil uyumlu web siteleri geli\u015ftirirken de b\u00fcy\u00fck kolayl\u0131k sa\u011flar. Taray\u0131c\u0131n\u0131zda <code class=\"language-\">http:\/\/localhost<\/code> adresinden uygulaman\u0131za eri\u015febilir, taray\u0131c\u0131 geli\u015ftirici ara\u00e7lar\u0131n\u0131 kullanarak mobil g\u00f6r\u00fcn\u00fcm\u00fc test edebilirsiniz. Hatta baz\u0131 ileri d\u00fczey ara\u00e7lar (\u00f6rn. BrowserSync) ile Docker konteynerinizde \u00e7al\u0131\u015fan uygulaman\u0131z\u0131 mobil cihazlar\u0131n\u0131zdan direkt olarak test edebilir, yapt\u0131\u011f\u0131n\u0131z kod de\u011fi\u015fikliklerinin an\u0131nda mobil cihazda da g\u00fcncellendi\u011fini g\u00f6rebilirsiniz. Bu, \u00f6zellikle responsive tasar\u0131m geli\u015ftirirken i\u015f ak\u0131\u015f\u0131n\u0131z\u0131 h\u0131zland\u0131r\u0131r.\n<\/div>\n<p>Bu ileri seviye optimizasyonlar ve ipu\u00e7lar\u0131, Docker Compose ile kurdu\u011funuz ortam\u0131n sadece \u00e7al\u0131\u015f\u0131r durumda olmas\u0131n\u0131 de\u011fil, ayn\u0131 zamanda daha performansl\u0131, g\u00fcvenli ve s\u00fcrd\u00fcr\u00fclebilir olmas\u0131n\u0131 sa\u011flar. Geli\u015ftirme ve \u00fcretim ortamlar\u0131 aras\u0131ndaki farklar\u0131 anlamak ve buna g\u00f6re yap\u0131land\u0131rma yapmak, ba\u015far\u0131l\u0131 bir da\u011f\u0131t\u0131m stratejisinin anahtar\u0131d\u0131r.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular: Gelecek Ad\u0131mlar\u0131n\u0131z Neler Olmal\u0131?<\/h2>\n<p>Bu makale boyunca, Laravel, Nginx ve MySQL&#8217;i Docker Compose ile nas\u0131l kuraca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011frendik. Geleneksel kurulum y\u00f6ntemlerinin getirdi\u011fi karma\u015f\u0131kl\u0131k ve ba\u011f\u0131ml\u0131l\u0131k sorunlar\u0131n\u0131n \u00fcstesinden gelmek i\u00e7in Docker&#8217;\u0131n konteynerizasyon g\u00fcc\u00fcn\u00fc ve Docker Compose&#8217;un \u00e7oklu servis y\u00f6netim yeteneklerini kulland\u0131k. Temel kavramlardan ba\u015flayarak, proje yap\u0131s\u0131n\u0131 olu\u015fturduk, servisleri detayl\u0131ca tan\u0131mlad\u0131k ve uygulamam\u0131z\u0131 Docker ortam\u0131nda ba\u015far\u0131yla \u00e7al\u0131\u015ft\u0131rd\u0131k. Ayr\u0131ca, performans optimizasyonlar\u0131 ve g\u00fcvenlik ipu\u00e7lar\u0131 gibi ileri seviye konulara da de\u011finerek, ortam\u0131m\u0131z\u0131 daha sa\u011flam ve verimli hale getirme yollar\u0131n\u0131 ke\u015ffettik.<\/p>\n<p>Bu kurulum sayesinde elde etti\u011fimiz en b\u00fcy\u00fck kazan\u0131mlar \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>H\u0131zl\u0131 ve Tutarl\u0131 Ortam Kurulumu:<\/strong> Yeni bir projeye ba\u015flarken veya yeni bir ekip \u00fcyesi kat\u0131ld\u0131\u011f\u0131nda, t\u00fcm geli\u015ftirme ortam\u0131 dakikalar i\u00e7inde aya\u011fa kald\u0131r\u0131labilir. &#8220;Benim makinemde \u00e7al\u0131\u015f\u0131yordu&#8221; sorunlar\u0131 art\u0131k ge\u00e7mi\u015fte kald\u0131.<\/li>\n<li><strong>\u0130zolasyon ve Ba\u011f\u0131ms\u0131zl\u0131k:<\/strong> Her servis kendi konteynerinde izole bir \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in, farkl\u0131 projeler farkl\u0131 PHP versiyonlar\u0131 veya veritaban\u0131 sunucular\u0131 kullanabilir, ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131 ya\u015fanmaz.<\/li>\n<li><strong>Ta\u015f\u0131nabilirlik:<\/strong> Docker Compose dosyas\u0131 sayesinde, t\u00fcm ortam\u0131n\u0131z\u0131 herhangi bir Docker y\u00fckl\u00fc makineye kolayca ta\u015f\u0131yabilir ve ayn\u0131 \u015fekilde \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/li>\n<li><strong>Versiyon Kontrol\u00fc ve \u0130\u015fbirli\u011fi:<\/strong> <code class=\"language-\">docker-compose.yml<\/code> ve <code class=\"language-\">Dockerfile<\/code> gibi konfig\u00fcrasyon dosyalar\u0131 versiyon kontrol sistemlerine (Git) dahil edilebilir, bu da ekip i\u00e7inde i\u015fbirli\u011fini ve ortam tutarl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Art\u0131k sa\u011flam bir temeliniz oldu\u011funa g\u00f6re, gelecekteki ad\u0131mlar\u0131n\u0131z \u015funlar\u0131 i\u00e7erebilir:<\/p>\n<ul>\n<li><strong>CI\/CD Entegrasyonu:<\/strong> S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m (CI\/CD) s\u00fcre\u00e7lerinize Docker Compose&#8217;u entegre ederek otomatik test ve da\u011f\u0131t\u0131m yapabilirsiniz.<\/li>\n<li><strong>Orkestrasyon Ara\u00e7lar\u0131:<\/strong> Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e ve daha fazla konteynere ihtiya\u00e7 duyduk\u00e7a Kubernetes gibi daha geli\u015fmi\u015f konteyner orkestrasyon ara\u00e7lar\u0131n\u0131 ke\u015ffedebilirsiniz.<\/li>\n<li><strong>G\u00f6zetim ve Log Y\u00f6netimi:<\/strong> Konteynerlerinizin performans\u0131n\u0131 izlemek ve loglar\u0131n\u0131 merkezi bir yerde toplamak i\u00e7in Prometheus, Grafana, ELK Stack gibi ara\u00e7lar\u0131 inceleyebilirsiniz.<\/li>\n<li><strong>Geli\u015fmi\u015f A\u011f Yap\u0131land\u0131rmas\u0131:<\/strong> Docker a\u011flar\u0131n\u0131 daha derinlemesine \u00f6\u011frenerek daha karma\u015f\u0131k servis ileti\u015fim senaryolar\u0131n\u0131 y\u00f6netebilirsiniz.<\/li>\n<\/ul>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<p><strong>1. Docker Compose ile kurdu\u011fum ortam \u00fcretim ortam\u0131 i\u00e7in uygun mu?<\/strong><\/p>\n<p>Docker Compose, genellikle geli\u015ftirme ortamlar\u0131 ve k\u00fc\u00e7\u00fck \u00f6l\u00e7ekli \u00fcretim da\u011f\u0131t\u0131mlar\u0131 i\u00e7in harikad\u0131r. Tek bir sunucuda birden fazla servis \u00e7al\u0131\u015ft\u0131rmak i\u00e7in idealdir. Ancak, y\u00fcksek kullan\u0131labilirlik, otomatik \u00f6l\u00e7eklendirme ve karma\u015f\u0131k orkestrasyon gerektiren b\u00fcy\u00fck \u00f6l\u00e7ekli \u00fcretim ortamlar\u0131 i\u00e7in Kubernetes gibi daha geli\u015fmi\u015f konteyner orkestrasyon platformlar\u0131 daha uygun olabilir. Docker Compose&#8217;u \u00fcretimde kullanacaksan\u0131z, g\u00fcvenlik, yedekleme, izleme ve otomatik yeniden ba\u015flatma gibi konulara ekstra \u00f6zen g\u00f6stermelisiniz.<\/p>\n<p><strong>2. Farkl\u0131 PHP versiyonlar\u0131n\u0131 veya veritabanlar\u0131n\u0131 nas\u0131l y\u00f6netirim?<\/strong><\/p>\n<p>Docker&#8217;\u0131n en b\u00fcy\u00fck avantajlar\u0131ndan biri izolasyondur. Her proje i\u00e7in ayr\u0131 bir <code class=\"language-\">docker-compose.yml<\/code> dosyas\u0131 olu\u015fturarak farkl\u0131 PHP versiyonlar\u0131na (\u00f6rne\u011fin, <code class=\"language-\">php:7.4-fpm<\/code> veya <code class=\"language-\">php:8.2-fpm<\/code>) sahip PHP-FPM konteynerleri veya farkl\u0131 veritaban\u0131 sistemleri (PostgreSQL, MongoDB) kullanabilirsiniz. Her bir projenin kendi ortam\u0131 tamamen izole olacakt\u0131r, bu da ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nler.<\/p>\n<p><strong>3. Veritaban\u0131 verilerim konteyner silindi\u011finde kaybolur mu?<\/strong><\/p>\n<p>Hay\u0131r, e\u011fer <code class=\"language-\">volumes<\/code> kullanarak veritaban\u0131 verilerini kal\u0131c\u0131 hale getirdiyseniz. Makalemizde MySQL servisi i\u00e7in <code class=\"language-\">db_data<\/code> ad\u0131nda bir volume tan\u0131mlad\u0131k (<code class=\"language-\">db_data:\/var\/lib\/mysql<\/code>). Bu volume, Docker&#8217;\u0131n y\u00f6netti\u011fi bir alanda verileri saklar. Konteyneriniz silinse veya yeniden olu\u015fturulsa bile, bu volume&#8217;e ba\u011fl\u0131 oldu\u011fu s\u00fcrece verileriniz g\u00fcvende kal\u0131r.<\/p>\n<p><strong>4. Xdebug&#8217;\u0131 Docker Compose ortam\u0131na nas\u0131l entegre edebilirim?<\/strong><\/p>\n<p>Xdebug&#8217;\u0131 entegre etmek i\u00e7in PHP-FPM&#8217;in <code class=\"language-\">Dockerfile<\/code>&#8216;\u0131na Xdebug uzant\u0131s\u0131n\u0131 kurmal\u0131 ve <code class=\"language-\">php.ini<\/code> dosyas\u0131nda gerekli ayarlar\u0131 yapmal\u0131s\u0131n\u0131z. <code class=\"language-\">xdebug.client_host<\/code> ayar\u0131, Docker konteynerinizin host makine ile ileti\u015fim kurabilmesi i\u00e7in \u00f6nemlidir. Genellikle <code class=\"language-\">host.docker.internal<\/code> (Docker Desktop i\u00e7in) veya host makinenizin IP adresi kullan\u0131l\u0131r. Makalemizdeki &#8220;\u0130leri Seviye Optimizasyonlar&#8221; b\u00f6l\u00fcm\u00fcnde Xdebug kurulumuna dair bir \u00f6rnek bulabilirsiniz.<\/p>\n<p><strong>5. Konteynerler aras\u0131nda ileti\u015fim nas\u0131l kurulur?<\/strong><\/p>\n<p>Docker Compose, varsay\u0131lan olarak t\u00fcm servisleri ayn\u0131 \u00f6zel a\u011fa (bizim \u00f6rne\u011fimizde <code class=\"language-\">app_network<\/code>) ba\u011flar. Bu a\u011f i\u00e7inde, servisler birbirleriyle servis adlar\u0131n\u0131 kullanarak ileti\u015fim kurabilirler. \u00d6rne\u011fin, Laravel uygulamas\u0131 MySQL&#8217;e ba\u011flan\u0131rken <code class=\"language-\">DB_HOST=mysql<\/code> kullan\u0131r, \u00e7\u00fcnk\u00fc <code class=\"language-\">mysql<\/code> servisi bu a\u011fda bu isimle tan\u0131n\u0131r. Nginx de PHP-FPM&#8217;e <code class=\"language-\">fastcgi_pass app:9000<\/code> ile eri\u015fir. Bu, IP adresleri yerine anlaml\u0131 isimler kullanarak kolay ve esnek bir ileti\u015fim sa\u011flar.<\/p>\n","protected":false},"excerpt":{"rendered":"Laravel, Nginx ve MySQL&#8217;i Docker Compose ile Kurulum Rehberi Modern web geli\u015ftirme d\u00fcnyas\u0131nda, projelerin karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131k\u00e7a geli\u015ftirme ortamlar\u0131n\u0131n&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1407],"tags":[],"class_list":{"0":"post-39525","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-docker","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Temel Kavramlara Derin Dal\u0131\u015f: Neden Docker Compose ve Bu \u00dc\u00e7l\u00fc?<\/title>\n<meta name=\"description\" content=\"Modern web geli\u015ftirme d\u00fcnyas\u0131nda, projelerin karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131k\u00e7a geli\u015ftirme ortamlar\u0131n\u0131n kurulumu ve y\u00f6netimi de zorla\u015fabiliyor. Ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131, farkl\u0131 i\u015fletim sistemlerindeki uyumluluk sorunlar\u0131 veya yeni bir ekip \u00fcyesinin projeye adapte olma s\u00fcreci, geli\u015ftiricilerin zaman\u0131n\u0131 bo\u015fa harcayabilen yayg\u0131n problemlerdir. Bu makalede, bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm olan Docker Compose&#039;u kullanarak Laravel, Nginx ve MySQL \u00fc\u00e7l\u00fcs\u00fcn\u00fc nas\u0131l kolayca kuraca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Kendi izole ve ta\u015f\u0131nabilir geli\u015ftirme ortam\u0131n\u0131z\u0131 olu\u015fturarak 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\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Temel Kavramlara Derin Dal\u0131\u015f: Neden Docker Compose ve Bu \u00dc\u00e7l\u00fc?\" \/>\n<meta property=\"og:description\" content=\"Modern web geli\u015ftirme d\u00fcnyas\u0131nda, projelerin karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131k\u00e7a geli\u015ftirme ortamlar\u0131n\u0131n kurulumu ve y\u00f6netimi de zorla\u015fabiliyor. Ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131, farkl\u0131 i\u015fletim sistemlerindeki uyumluluk sorunlar\u0131 veya yeni bir ekip \u00fcyesinin projeye adapte olma s\u00fcreci, geli\u015ftiricilerin zaman\u0131n\u0131 bo\u015fa harcayabilen yayg\u0131n problemlerdir. Bu makalede, bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm olan Docker Compose&#039;u kullanarak Laravel, Nginx ve MySQL \u00fc\u00e7l\u00fcs\u00fcn\u00fc nas\u0131l kolayca kuraca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Kendi izole ve ta\u015f\u0131nabilir geli\u015ftirme ortam\u0131n\u0131z\u0131 olu\u015fturarak verimlili\u011finizi art\u0131r\u0131n!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-23T09:21:10+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=\"27 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Temel Kavramlara Derin Dal\u0131\u015f: Neden Docker Compose ve Bu \u00dc\u00e7l\u00fc?\",\"datePublished\":\"2026-02-23T09:21:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/\"},\"wordCount\":4301,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Docker\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/\",\"name\":\"Temel Kavramlara Derin Dal\u0131\u015f: Neden Docker Compose ve Bu \u00dc\u00e7l\u00fc?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-23T09:21:10+00:00\",\"description\":\"Modern web geli\u015ftirme d\u00fcnyas\u0131nda, projelerin karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131k\u00e7a geli\u015ftirme ortamlar\u0131n\u0131n kurulumu ve y\u00f6netimi de zorla\u015fabiliyor. Ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131, farkl\u0131 i\u015fletim sistemlerindeki uyumluluk sorunlar\u0131 veya yeni bir ekip \u00fcyesinin projeye adapte olma s\u00fcreci, geli\u015ftiricilerin zaman\u0131n\u0131 bo\u015fa harcayabilen yayg\u0131n problemlerdir. Bu makalede, bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm olan Docker Compose'u kullanarak Laravel, Nginx ve MySQL \u00fc\u00e7l\u00fcs\u00fcn\u00fc nas\u0131l kolayca kuraca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Kendi izole ve ta\u015f\u0131nabilir geli\u015ftirme ortam\u0131n\u0131z\u0131 olu\u015fturarak verimlili\u011finizi art\u0131r\u0131n!\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Temel Kavramlara Derin Dal\u0131\u015f: Neden Docker Compose ve Bu \u00dc\u00e7l\u00fc?\"}]},{\"@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":"Temel Kavramlara Derin Dal\u0131\u015f: Neden Docker Compose ve Bu \u00dc\u00e7l\u00fc?","description":"Modern web geli\u015ftirme d\u00fcnyas\u0131nda, projelerin karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131k\u00e7a geli\u015ftirme ortamlar\u0131n\u0131n kurulumu ve y\u00f6netimi de zorla\u015fabiliyor. Ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131, farkl\u0131 i\u015fletim sistemlerindeki uyumluluk sorunlar\u0131 veya yeni bir ekip \u00fcyesinin projeye adapte olma s\u00fcreci, geli\u015ftiricilerin zaman\u0131n\u0131 bo\u015fa harcayabilen yayg\u0131n problemlerdir. Bu makalede, bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm olan Docker Compose'u kullanarak Laravel, Nginx ve MySQL \u00fc\u00e7l\u00fcs\u00fcn\u00fc nas\u0131l kolayca kuraca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Kendi izole ve ta\u015f\u0131nabilir geli\u015ftirme ortam\u0131n\u0131z\u0131 olu\u015fturarak 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\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/","og_locale":"tr_TR","og_type":"article","og_title":"Temel Kavramlara Derin Dal\u0131\u015f: Neden Docker Compose ve Bu \u00dc\u00e7l\u00fc?","og_description":"Modern web geli\u015ftirme d\u00fcnyas\u0131nda, projelerin karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131k\u00e7a geli\u015ftirme ortamlar\u0131n\u0131n kurulumu ve y\u00f6netimi de zorla\u015fabiliyor. Ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131, farkl\u0131 i\u015fletim sistemlerindeki uyumluluk sorunlar\u0131 veya yeni bir ekip \u00fcyesinin projeye adapte olma s\u00fcreci, geli\u015ftiricilerin zaman\u0131n\u0131 bo\u015fa harcayabilen yayg\u0131n problemlerdir. Bu makalede, bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm olan Docker Compose'u kullanarak Laravel, Nginx ve MySQL \u00fc\u00e7l\u00fcs\u00fcn\u00fc nas\u0131l kolayca kuraca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Kendi izole ve ta\u015f\u0131nabilir geli\u015ftirme ortam\u0131n\u0131z\u0131 olu\u015fturarak verimlili\u011finizi art\u0131r\u0131n!","og_url":"https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-23T09:21:10+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"27 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Temel Kavramlara Derin Dal\u0131\u015f: Neden Docker Compose ve Bu \u00dc\u00e7l\u00fc?","datePublished":"2026-02-23T09:21:10+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/"},"wordCount":4301,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Docker"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/","url":"https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/","name":"Temel Kavramlara Derin Dal\u0131\u015f: Neden Docker Compose ve Bu \u00dc\u00e7l\u00fc?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-23T09:21:10+00:00","description":"Modern web geli\u015ftirme d\u00fcnyas\u0131nda, projelerin karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131k\u00e7a geli\u015ftirme ortamlar\u0131n\u0131n kurulumu ve y\u00f6netimi de zorla\u015fabiliyor. Ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131, farkl\u0131 i\u015fletim sistemlerindeki uyumluluk sorunlar\u0131 veya yeni bir ekip \u00fcyesinin projeye adapte olma s\u00fcreci, geli\u015ftiricilerin zaman\u0131n\u0131 bo\u015fa harcayabilen yayg\u0131n problemlerdir. Bu makalede, bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm olan Docker Compose'u kullanarak Laravel, Nginx ve MySQL \u00fc\u00e7l\u00fcs\u00fcn\u00fc nas\u0131l kolayca kuraca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Kendi izole ve ta\u015f\u0131nabilir geli\u015ftirme ortam\u0131n\u0131z\u0131 olu\u015fturarak verimlili\u011finizi art\u0131r\u0131n!","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/temel-kavramlara-derin-dalis-neden-docker-compose-ve-bu-uclu\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Temel Kavramlara Derin Dal\u0131\u015f: Neden Docker Compose ve Bu \u00dc\u00e7l\u00fc?"}]},{"@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\/39525","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=39525"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39525\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=39525"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=39525"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=39525"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}