{"id":33027,"date":"2025-10-28T16:24:10","date_gmt":"2025-10-28T13:24:10","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/"},"modified":"2025-10-28T16:24:10","modified_gmt":"2025-10-28T13:24:10","slug":"docker-composeu-anlamak-neden-ihtiyacimiz-var","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/","title":{"rendered":"Docker Compose&#8217;u Anlamak: Neden \u0130htiyac\u0131m\u0131z Var?"},"content":{"rendered":"<p><title>Ubuntu&#8217;da Docker Compose Kurulumu ve Kullan\u0131m\u0131 Rehberi<\/title><br \/>\n<body><\/p>\n<p>Modern uygulama geli\u015ftirme s\u00fcre\u00e7lerinde, mikroservis mimarileri ve konteyner teknolojileri h\u0131zla benimseniyor. Ancak birden fazla servisten olu\u015fan bir uygulaman\u0131n t\u00fcm bile\u015fenlerini tek tek y\u00f6netmek olduk\u00e7a karma\u015f\u0131k olabilir. \u0130\u015fte tam bu noktada Docker Compose devreye girerek, \u00e7ok konteynerli Docker uygulamalar\u0131n\u0131 tan\u0131mlama ve \u00e7al\u0131\u015ft\u0131rma s\u00fcrecini basitle\u015ftiriyor. Bu kapsaml\u0131 rehberde, Ubuntu \u00fczerinde Docker Compose&#8217;u nas\u0131l kuraca\u011f\u0131n\u0131z\u0131, temelden ileri d\u00fczeye nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda projelerinizi nas\u0131l y\u00f6netece\u011finizi ad\u0131m ad\u0131m \u00f6\u011freneceksiniz. Haz\u0131rsan\u0131z, konteyner orkestrasyonunun g\u00fcc\u00fcn\u00fc ke\u015ffetmeye ba\u015flayal\u0131m!<\/p>\n<h2>Docker Compose&#8217;u Anlamak: Neden \u0130htiyac\u0131m\u0131z Var?<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn karma\u015f\u0131k yaz\u0131l\u0131m projeleri genellikle tek bir b\u00fcy\u00fck uygulamadan (monolit) ziyade, birbirleriyle ileti\u015fim kuran k\u00fc\u00e7\u00fck, ba\u011f\u0131ms\u0131z servislerden (mikroservisler) olu\u015fur. \u00d6rne\u011fin, bir web uygulamas\u0131 d\u00fc\u015f\u00fcn\u00fcn: kullan\u0131c\u0131 aray\u00fcz\u00fc (frontend), API sunucusu (backend), veritaban\u0131, \u00f6nbellek sistemi (cache) ve belki de bir mesaj kuyru\u011fu gibi farkl\u0131 bile\u015fenlere sahip olabilir. Bu bile\u015fenlerin her biri kendi ortam\u0131nda \u00e7al\u0131\u015f\u0131r ve genellikle farkl\u0131 teknolojilerle geli\u015ftirilir. Docker, her bir servisi kendi izole konteyneri i\u00e7inde \u00e7al\u0131\u015ft\u0131rmam\u0131z\u0131 sa\u011flayarak bu karma\u015f\u0131kl\u0131\u011f\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde azalt\u0131r. Ancak, bu kadar \u00e7ok konteyneri ayn\u0131 anda ba\u015flatmak, durdurmak, a\u011flar\u0131n\u0131 yap\u0131land\u0131rmak ve birbirleriyle ileti\u015fim kurmalar\u0131n\u0131 sa\u011flamak elle yap\u0131ld\u0131\u011f\u0131nda yorucu ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7 haline gelebilir.<\/p>\n<p>\u0130\u015fte tam bu noktada Docker Compose, geli\u015ftiricilerin hayat\u0131n\u0131 kolayla\u015ft\u0131ran g\u00fc\u00e7l\u00fc bir ara\u00e7 olarak \u00f6ne \u00e7\u0131kar. Compose, \u00e7oklu konteynerli Docker uygulamalar\u0131n\u0131 tan\u0131mlamak ve \u00e7al\u0131\u015ft\u0131rmak i\u00e7in bir YAML dosyas\u0131 kullan\u0131r. Bu YAML dosyas\u0131, uygulaman\u0131z\u0131n t\u00fcm servislerini, bu servislerin hangi Docker imajlar\u0131ndan olu\u015fturulaca\u011f\u0131n\u0131, hangi portlar\u0131 kullanacaklar\u0131n\u0131, hangi a\u011flara dahil olacaklar\u0131n\u0131, hangi birimlere (volume) sahip olacaklar\u0131n\u0131 ve hatta birbirlerine olan ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 tek bir yerde belirtmenize olanak tan\u0131r. B\u00f6ylece, tek bir komutla (<code>docker-compose up<\/code>) uygulaman\u0131z\u0131n t\u00fcm bile\u015fenlerini belirlenen konfig\u00fcrasyonla aya\u011fa kald\u0131rabilir, durdurabilir veya yeniden ba\u015flatabilirsiniz. Bu, \u00f6zellikle geli\u015ftirme ortamlar\u0131nda tutarl\u0131l\u0131\u011f\u0131 sa\u011flamak, yeni bir geli\u015ftiriciyi projeye dahil etmek veya bir entegrasyon test ortam\u0131 kurmak i\u00e7in paha bi\u00e7ilmez bir kolayl\u0131k sunar. Compose, her bir servisin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc ba\u011f\u0131ms\u0131z olarak y\u00f6netme esnekli\u011fi sunarken, ayn\u0131 zamanda t\u00fcm uygulaman\u0131n bir b\u00fct\u00fcn olarak ele al\u0131nmas\u0131n\u0131 sa\u011flar. Konteynerle\u015fme d\u00fcnyas\u0131nda, uygulaman\u0131z\u0131n &#8220;nas\u0131l&#8221; \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 de\u011fil, &#8220;ne&#8221; \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 tan\u0131mlaman\u0131za olanak tan\u0131yan bir deklaratif yakla\u015f\u0131m sunar.<\/p>\n<p>\u00d6zetle, Docker Compose&#8217;un temel amac\u0131, birden fazla Docker konteynerini i\u00e7eren uygulamalar\u0131 daha kolay y\u00f6netilebilir, ta\u015f\u0131nabilir ve tekrarlanabilir hale getirmektir. Geli\u015ftirme, test ve hatta k\u00fc\u00e7\u00fck \u00f6l\u00e7ekli \u00fcretim ortamlar\u0131nda dahi b\u00fcy\u00fck avantajlar sa\u011flar. Bu sayede, geli\u015ftiriciler altyap\u0131 detaylar\u0131yla bo\u011fu\u015fmak yerine, uygulaman\u0131n as\u0131l i\u015flevselli\u011fine odaklanabilirler. Compose, Docker ekosisteminin ayr\u0131lmaz bir par\u00e7as\u0131d\u0131r ve modern uygulama geli\u015ftirme pratiklerinde vazge\u00e7ilmez bir ara\u00e7 haline gelmi\u015ftir. \u015eimdi, bu g\u00fc\u00e7l\u00fc arac\u0131 Ubuntu sistemimize nas\u0131l kuraca\u011f\u0131m\u0131za ve kullanaca\u011f\u0131m\u0131za ge\u00e7elim.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Docker Compose&#8217;un en b\u00fcy\u00fck avantajlar\u0131ndan biri, geli\u015ftirme ortamlar\u0131 aras\u0131ndaki &#8220;\u00e7al\u0131\u015f\u0131yor mu?&#8221; sorununu ortadan kald\u0131rmas\u0131d\u0131r. Her geli\u015ftirici, ayn\u0131 <code>docker-compose.yml<\/code> dosyas\u0131n\u0131 kullanarak uygulaman\u0131n t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 ayn\u0131 konfig\u00fcrasyonla \u00e7al\u0131\u015ft\u0131rabilir, bu da tutarl\u0131l\u0131\u011f\u0131 ve i\u015fbirli\u011fini art\u0131r\u0131r.\n<\/div>\n<style>\n\/* Mobil uyumluluk \u00f6rne\u011fi: Bu CSS blo\u011fu, makalenin g\u00f6rsel elementlerini k\u00fc\u00e7\u00fck ekranlarda daha iyi g\u00f6stermek i\u00e7in bir \u00f6rnek te\u015fkil eder. Normalde bu t\u00fcr stiller harici bir CSS dosyas\u0131nda bulunur ve harici bir dosyadan \u00e7a\u011fr\u0131lmas\u0131 en iyi pratiktir. Ancak burada, kullan\u0131c\u0131n\u0131n talebi \u00fczerine bir \u00f6rnek olarak do\u011frudan body i\u00e7eri\u011fine eklenmi\u015ftir. *\/\n@media (max-width: 768px) {\n    .content-wrapper { \/* Varsay\u0131msal bir ana i\u00e7erik sarmalay\u0131c\u0131 *\/\n        padding: 10px;\n        font-size: 16px;\n    }\n    .code-block-container { \/* Kod bloklar\u0131n\u0131n k\u00fc\u00e7\u00fck ekranlarda ta\u015fmas\u0131n\u0131 \u00f6nlemek i\u00e7in *\/\n        overflow-x: auto;\n        white-space: nowrap; \/* Sat\u0131r sonlar\u0131n\u0131 engelle *\/\n    }\n    table {\n        display: block;\n        overflow-x: auto;\n        white-space: nowrap;\n        border-collapse: collapse;\n        width: 100%;\n    }\n    table thead, table tbody, table th, table td, table tr {\n        display: block;\n    }\n    table tr {\n        margin-bottom: 15px;\n        border: 1px solid #ddd;\n    }\n    table td {\n        border: none;\n        border-bottom: 1px solid #eee;\n        position: relative;\n        padding-left: 50%;\n        text-align: right;\n    }\n    table td:before {\n        position: absolute;\n        left: 6px;\n        content: attr(data-label);\n        font-weight: bold;\n        text-align: left;\n        width: 45%;\n    }\n}\n<\/style>\n<h2>Ubuntu&#8217;da Docker ve Docker Compose Kurulumu: Ad\u0131m Ad\u0131m Rehber<\/h2>\n<p>Docker Compose kullanmaya ba\u015flamadan \u00f6nce, sisteminizde Docker Engine&#8217;in kurulu olmas\u0131 gerekmektedir. Bu b\u00f6l\u00fcmde, Ubuntu i\u015fletim sisteminde hem Docker&#8217;\u0131 hem de Docker Compose&#8217;u nas\u0131l kuraca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m anlataca\u011f\u0131z. Kurulum s\u00fcreci olduk\u00e7a basittir, ancak her ad\u0131m\u0131n do\u011fru \u015fekilde takip edilmesi \u00f6nemlidir.<\/p>\n<h3>Docker Engine Kurulumu Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Docker&#8217;\u0131 kurman\u0131n en g\u00fcvenli ve \u00f6nerilen yolu, resmi Docker deposunu kullanmakt\u0131r. Bu sayede her zaman en g\u00fcncel ve kararl\u0131 s\u00fcr\u00fcme sahip olursunuz. A\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izleyerek Docker Engine&#8217;i kurabilirsiniz:<\/p>\n<ol>\n<li><strong>Mevcut Docker S\u00fcr\u00fcmlerini Kald\u0131rma (\u0130ste\u011fe Ba\u011fl\u0131):<\/strong> E\u011fer daha \u00f6nce Docker&#8217;\u0131n eski bir s\u00fcr\u00fcm\u00fcn\u00fc kurduysan\u0131z, \u00e7ak\u0131\u015fmalar\u0131 \u00f6nlemek i\u00e7in \u00f6nce onu kald\u0131rmal\u0131s\u0131n\u0131z.<\/li>\n<pre><code class=\"language-bash\">\nsudo apt-get remove docker docker-engine docker.io containerd runc\n    <\/code><\/pre>\n<p>Bu komut, sisteminizdeki eski Docker paketlerini kald\u0131racakt\u0131r.<\/p>\n<li><strong>Gerekli Paketleri Y\u00fckleme:<\/strong> Docker deposunu kullanmak i\u00e7in baz\u0131 \u00f6nko\u015ful paketlere ihtiyac\u0131m\u0131z var.<\/li>\n<pre><code class=\"language-bash\">\nsudo apt-get update\nsudo apt-get install ca-certificates curl gnupg lsb-release\n    <\/code><\/pre>\n<p>Bu komutlar, sisteminizin paket listesini g\u00fcnceller ve gerekli yard\u0131mc\u0131 programlar\u0131 y\u00fckler.<\/p>\n<li><strong>Docker&#8217;\u0131n Resmi GPG Anahtar\u0131n\u0131 Ekleme:<\/strong> G\u00fcvenli\u011fi sa\u011flamak i\u00e7in Docker&#8217;\u0131n resmi GPG anahtar\u0131n\u0131 eklememiz gerekiyor. Bu, indirdi\u011fimiz paketlerin Docker taraf\u0131ndan imzaland\u0131\u011f\u0131n\u0131 do\u011frulamam\u0131z\u0131 sa\u011flar.<\/li>\n<pre><code class=\"language-bash\">\nsudo mkdir -p \/etc\/apt\/keyrings\ncurl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | sudo gpg --dearmor -o \/etc\/apt\/keyrings\/docker.gpg\n    <\/code><\/pre>\n<li><strong>Docker Deposunu Ekleme:<\/strong> \u015eimdi Docker&#8217;\u0131n kararl\u0131 deposunu APT kaynaklar\u0131m\u0131za ekleyebiliriz.<\/li>\n<pre><code class=\"language-bash\">\necho \\\n  \"deb [arch=$(dpkg --print-architecture) signed-by=\/etc\/apt\/keyrings\/docker.gpg] https:\/\/download.docker.com\/linux\/ubuntu \\\n  $(lsb_release -cs) stable\" | sudo tee \/etc\/apt\/sources.list.d\/docker.list > \/dev\/null\n    <\/code><\/pre>\n<p>Bu komut, sisteminize Docker&#8217;\u0131n resmi deposunu ekleyecektir. <code>$(lsb_release -cs)<\/code> k\u0131sm\u0131, Ubuntu s\u00fcr\u00fcm\u00fcn\u00fcz\u00fcn kod ad\u0131n\u0131 otomatik olarak alg\u0131lar (\u00f6rne\u011fin, <code>jammy<\/code> veya <code>focal<\/code>).<\/p>\n<li><strong>Docker Engine&#8217;i Y\u00fckleme:<\/strong> Depo eklendikten sonra, Docker Engine&#8217;i y\u00fckleyebiliriz.<\/li>\n<pre><code class=\"language-bash\">\nsudo apt-get update\nsudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin\n    <\/code><\/pre>\n<p>Bu komut, Docker Engine&#8217;in en son kararl\u0131 s\u00fcr\u00fcm\u00fcn\u00fc, CLI arac\u0131n\u0131, containerd ve di\u011fer gerekli eklentileri y\u00fckleyecektir.<\/p>\n<li><strong>Docker&#8217;\u0131 Test Etme:<\/strong> Kurulumun ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 test etmek i\u00e7in bir &#8220;hello-world&#8221; konteynerini \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/li>\n<pre><code class=\"language-bash\">\nsudo docker run hello-world\n    <\/code><\/pre>\n<p>E\u011fer &#8220;Hello from Docker!&#8221; mesaj\u0131n\u0131 g\u00f6r\u00fcrseniz, Docker ba\u015far\u0131yla kurulmu\u015f demektir.<\/p>\n<li><strong>Docker Komutlar\u0131n\u0131 Sudo Olmadan \u00c7al\u0131\u015ft\u0131rma (\u00d6nerilen):<\/strong> Her Docker komutunu <code>sudo<\/code> ile \u00e7al\u0131\u015ft\u0131rmak zahmetli olabilir. Kullan\u0131c\u0131n\u0131z\u0131 <code>docker<\/code> grubuna ekleyerek bu k\u0131s\u0131tlamay\u0131 kald\u0131rabilirsiniz.<\/li>\n<pre><code class=\"language-bash\">\nsudo usermod -aG docker $USER\nnewgrp docker\n    <\/code><\/pre>\n<p><code>newgrp docker<\/code> komutu, mevcut oturumunuz i\u00e7in grup de\u011fi\u015fikliklerini uygular. Tamamen etkili olmas\u0131 i\u00e7in oturumu kapat\u0131p a\u00e7man\u0131z veya sistemi yeniden ba\u015flatman\u0131z gerekebilir.<\/p>\n<h3>Docker Compose Kurulumu Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Docker Compose art\u0131k Docker Engine ile birlikte <code>docker-compose-plugin<\/code> olarak geliyor. Yukar\u0131daki kurulum ad\u0131mlar\u0131nda zaten bu eklentiyi y\u00fcklemi\u015f olman\u0131z gerekiyor. Ancak, eski ba\u011f\u0131ms\u0131z Docker Compose s\u00fcr\u00fcm\u00fcn\u00fc (<code>docker-compose<\/code>) kullanmak isterseniz, a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izleyebilirsiniz. Genellikle yeni projeler i\u00e7in <code>docker compose<\/code> (plugin versiyonu) kullan\u0131lmas\u0131 \u00f6nerilir.<\/p>\n<ol>\n<li><strong>Docker Compose&#8217;u \u0130ndirme:<\/strong> GitHub&#8217;daki Docker Compose deposundan en son kararl\u0131 s\u00fcr\u00fcm\u00fc indirin.<\/li>\n<pre><code class=\"language-bash\">\nsudo curl -L \"https:\/\/github.com\/docker\/compose\/releases\/download\/v2.23.3\/docker-compose-$(uname -s)-$(uname -m)\" -o \/usr\/local\/bin\/docker-compose\n    <\/code><\/pre>\n<p><code>v2.23.3<\/code> yerine en son s\u00fcr\u00fcm\u00fc kontrol etmek i\u00e7in <a href=\"https:\/\/github.com\/docker\/compose\/releases\" target=\"_blank\" rel=\"noopener\">Docker Compose GitHub Releases<\/a> sayfas\u0131n\u0131 ziyaret edebilirsiniz.<\/p>\n<li><strong>\u00c7al\u0131\u015ft\u0131r\u0131labilir \u0130zinleri Verme:<\/strong> \u0130ndirdi\u011finiz dosyaya \u00e7al\u0131\u015ft\u0131rma izni vermeniz gerekir.<\/li>\n<pre><code class=\"language-bash\">\nsudo chmod +x \/usr\/local\/bin\/docker-compose\n    <\/code><\/pre>\n<li><strong>Kurulumu Do\u011frulama:<\/strong> Kurulumun ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol edin.<\/li>\n<pre><code class=\"language-bash\">\ndocker-compose --version\n    <\/code><\/pre>\n<p>E\u011fer bir s\u00fcr\u00fcm numaras\u0131 (\u00f6rne\u011fin, <code>Docker Compose version v2.23.3<\/code>) g\u00f6r\u00fcrseniz, Docker Compose ba\u015far\u0131yla kurulmu\u015f demektir. Yeni plugin versiyonu i\u00e7in ise komut <code>docker compose version<\/code> \u015feklindedir.<\/p>\n<pre><code class=\"language-bash\">\ndocker compose version\n    <\/code><\/pre>\n<\/ol>\n<p>Art\u0131k hem Docker Engine hem de Docker Compose sisteminizde \u00e7al\u0131\u015fmaya haz\u0131r. Bir sonraki b\u00f6l\u00fcmde, ilk Docker Compose projenizi nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131 ve \u00e7al\u0131\u015ft\u0131raca\u011f\u0131n\u0131z\u0131 \u00f6\u011frenece\u011fiz.<\/p>\n<h2>\u0130lk Docker Compose Projenizi Olu\u015fturma: Basit Bir Web Uygulamas\u0131<\/h2>\n<p>Docker ve Docker Compose&#8217;u ba\u015far\u0131yla kurdu\u011funuza g\u00f6re, \u015fimdi ilk \u00e7ok konteynerli uygulaman\u0131z\u0131 olu\u015fturma zaman\u0131. Bu b\u00f6l\u00fcmde, basit bir Python Flask web uygulamas\u0131 ve bir Redis \u00f6nbellek sunucusundan olu\u015fan bir projeyi Docker Compose ile nas\u0131l y\u00f6netece\u011finizi ad\u0131m ad\u0131m g\u00f6sterece\u011fiz. Bu \u00f6rnek, Compose&#8217;un temel i\u015flevselli\u011fini anlaman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>Proje Yap\u0131s\u0131 ve Dosyalar\u0131 Nas\u0131l Olu\u015fturulur?<\/h3>\n<p>\u0130lk olarak, projemiz i\u00e7in bir dizin olu\u015ftural\u0131m ve gerekli dosyalar\u0131 bu dizine yerle\u015ftirelim. Genellikle bir Docker Compose projesi, ana dizininde bir <code>docker-compose.yml<\/code> dosyas\u0131 ve her servis i\u00e7in ayr\u0131 bir dizin i\u00e7inde <code>Dockerfile<\/code> ve uygulama kodunu bar\u0131nd\u0131r\u0131r.<\/p>\n<pre><code class=\"language-bash\">\nmkdir my-flask-app\ncd my-flask-app\nmkdir web\n    <\/code><\/pre>\n<p>\u015eimdi <code>web<\/code> dizininin i\u00e7ine Flask uygulamam\u0131z i\u00e7in gerekli dosyalar\u0131 olu\u015ftural\u0131m:<\/p>\n<ol>\n<li><strong><code>web\/Dockerfile<\/code>:<\/strong> Flask uygulamas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131racak Docker imaj\u0131n\u0131 tan\u0131mlar.<\/li>\n<pre><code class=\"language-dockerfile\">\n# web\/Dockerfile\nFROM python:3.9-slim-buster\nWORKDIR \/app\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\nCOPY . .\nEXPOSE 5000\nCMD [\"python\", \"app.py\"]\n    <\/code><\/pre>\n<p>Bu <code>Dockerfile<\/code>, Python 3.9 tabanl\u0131 bir imaj kullan\u0131r, \u00e7al\u0131\u015fma dizinini ayarlar, ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckler, uygulama kodunu kopyalar ve Flask uygulamas\u0131n\u0131 5000 portunda ba\u015flat\u0131r.<\/p>\n<li><strong><code>web\/requirements.txt<\/code>:<\/strong> Flask uygulamas\u0131n\u0131n Python ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 i\u00e7erir.<\/li>\n<pre><code class=\"language-text\">\n# web\/requirements.txt\nFlask\nredis\n    <\/code><\/pre>\n<li><strong><code>web\/app.py<\/code>:<\/strong> Basit bir Flask uygulamas\u0131. Redis&#8217;e ba\u011flanmaya ve bir saya\u00e7 tutmaya \u00e7al\u0131\u015f\u0131r.<\/li>\n<pre><code class=\"language-python\">\n# web\/app.py\nimport time\nimport redis\nfrom flask import Flask\n\napp = Flask(__name__)\ncache = redis.Redis(host='redis', port=6379) # 'redis' hostname'i Compose taraf\u0131ndan sa\u011flanacak\n\ndef get_hit_count():\n    retries = 5\n    while True:\n        try:\n            return cache.incr('hits')\n        except redis.exceptions.ConnectionError as exc:\n            if retries == 0:\n                raise exc\n            retries -= 1\n            time.sleep(0.5)\n\n@app.route('\/')\ndef hello():\n    count = get_hit_count()\n    return 'Merhaba Docker Compose! Bu sayfa {} kez ziyaret edildi.\\n'.format(count)\n\nif __name__ == \"__main__\":\n    app.run(host=\"0.0.0.0\", port=5000, debug=True)\n    <\/code><\/pre>\n<p>Bu Flask uygulamas\u0131, her istekte Redis&#8217;teki bir sayac\u0131 art\u0131r\u0131r ve g\u00fcncel de\u011feri g\u00f6sterir. Redis sunucusuna <code>redis<\/code> ana bilgisayar ad\u0131 \u00fczerinden ba\u011flanmaya \u00e7al\u0131\u015f\u0131r, \u00e7\u00fcnk\u00fc Compose varsay\u0131lan olarak servis adlar\u0131n\u0131 DNS \u00e7\u00f6z\u00fcn\u00fcrl\u00fc\u011f\u00fc i\u00e7in kullan\u0131r.<\/p>\n<\/ol>\n<h3><code>docker-compose.yml<\/code> Dosyas\u0131 Nas\u0131l Yap\u0131land\u0131r\u0131l\u0131r?<\/h3>\n<p>\u015eimdi projemizin k\u00f6k dizininde (<code>my-flask-app<\/code>) <code>docker-compose.yml<\/code> dosyas\u0131n\u0131 olu\u015ftural\u0131m. Bu dosya, uygulamam\u0131z\u0131n servislerini tan\u0131mlayacak ve birbirleriyle nas\u0131l etkile\u015fim kuracaklar\u0131n\u0131 belirleyecektir.<\/p>\n<pre><code class=\"language-yaml\">\n# docker-compose.yml\nversion: '3.8' # Docker Compose dosya format\u0131n\u0131n s\u00fcr\u00fcm\u00fc\n\nservices:\n  web: # \u0130lk servisimiz: Flask web uygulamas\u0131\n    build: .\/web # 'web' dizinindeki Dockerfile'dan imaj olu\u015ftur\n    ports:\n      - \"5000:5000\" # Host'un 5000 portunu konteynerin 5000 portuna y\u00f6nlendir\n    volumes:\n      - .\/web:\/app # Host'taki .\/web dizinini konteynerdeki \/app dizinine ba\u011fla (geli\u015ftirme i\u00e7in faydal\u0131)\n    depends_on: # Bu servisin ba\u015flamadan \u00f6nce hangi servislerin haz\u0131r olmas\u0131n\u0131 bekledi\u011fini belirtir\n      - redis\n    environment:\n      FLASK_ENV: development\n\n  redis: # \u0130kinci servisimiz: Redis \u00f6nbellek sunucusu\n    image: \"redis:latest\" # Docker Hub'dan 'redis:latest' imaj\u0131n\u0131 kullan\n    ports:\n      - \"6379:6379\" # Redis'e d\u0131\u015far\u0131dan eri\u015fmek isterseniz bu portu a\u00e7abilirsiniz\n    volumes:\n      - redis_data:\/data # Redis verilerini kal\u0131c\u0131 hale getirmek i\u00e7in bir volume kullan\n\nvolumes: # Volume tan\u0131mlamalar\u0131\n  redis_data: # Redis i\u00e7in kal\u0131c\u0131 veri depolama birimi\n    driver: local\n    <\/code><\/pre>\n<p>Bu <code>docker-compose.yml<\/code> dosyas\u0131nda:<\/p>\n<ul>\n<li><code>version: '3.8'<\/code>: Compose dosya format\u0131n\u0131n s\u00fcr\u00fcm\u00fcn\u00fc belirtir. En son s\u00fcr\u00fcm genellikle en iyi \u00f6zellikleri sunar.<\/li>\n<li><code>services<\/code>: Uygulamam\u0131z\u0131n t\u00fcm servislerini i\u00e7erir.<\/li>\n<li><code>web<\/code> servisi:\n<ul>\n<li><code>build: .\/web<\/code>: <code>web<\/code> dizinindeki <code>Dockerfile<\/code>&#8216;\u0131 kullanarak bir Docker imaj\u0131 olu\u015fturur.<\/li>\n<li><code>ports: \"5000:5000\"<\/code>: Ana makinenin (host) 5000 portunu, <code>web<\/code> konteynerinin 5000 portuna e\u015fler. B\u00f6ylece taray\u0131c\u0131n\u0131zdan uygulamaya eri\u015febilirsiniz.<\/li>\n<li><code>volumes: .\/web:\/app<\/code>: Yerel <code>.\/web<\/code> dizinini konteyner i\u00e7indeki <code>\/app<\/code> dizinine ba\u011flar. Bu, kodunuzda de\u011fi\u015fiklik yapt\u0131\u011f\u0131n\u0131zda konteyneri yeniden olu\u015fturmaya gerek kalmadan de\u011fi\u015fikliklerin an\u0131nda yans\u0131mas\u0131n\u0131 sa\u011flar (geli\u015ftirme i\u00e7in idealdir).<\/li>\n<li><code>depends_on: - redis<\/code>: <code>web<\/code> servisinin ba\u015flamadan \u00f6nce <code>redis<\/code> servisinin ba\u015flat\u0131lmas\u0131n\u0131 bekledi\u011fini belirtir.<\/li>\n<\/ul>\n<\/li>\n<li><code>redis<\/code> servisi:\n<ul>\n<li><code>image: \"redis:latest\"<\/code>: Docker Hub&#8217;dan resmi <code>redis:latest<\/code> imaj\u0131n\u0131 kullan\u0131r.<\/li>\n<li><code>ports: \"6379:6379\"<\/code>: Redis&#8217;e ana makineden eri\u015fmek isterseniz bu portu a\u00e7ar.<\/li>\n<li><code>volumes: redis_data:\/data<\/code>: Redis verilerini kal\u0131c\u0131 olarak depolamak i\u00e7in <code>redis_data<\/code> ad\u0131nda bir Docker Volume kullan\u0131r. Bu, konteyner silinse bile verilerin kaybolmamas\u0131n\u0131 sa\u011flar.<\/li>\n<\/ul>\n<\/li>\n<li><code>volumes<\/code>: \u00d6zel olarak tan\u0131mlanm\u0131\u015f Docker Volume&#8217;lar\u0131n\u0131 listeler. Burada <code>redis_data<\/code>&#8216;y\u0131 tan\u0131ml\u0131yoruz.<\/li>\n<\/ul>\n<h3>Uygulamay\u0131 \u00c7al\u0131\u015ft\u0131rma ve Y\u00f6netme<\/h3>\n<p>T\u00fcm dosyalar\u0131 olu\u015fturduktan sonra, projemizin k\u00f6k dizininde (<code>my-flask-app<\/code>) a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131rarak uygulamam\u0131z\u0131 ba\u015flatabiliriz:<\/p>\n<pre><code class=\"language-bash\">\ndocker compose up -d\n    <\/code><\/pre>\n<ul>\n<li><code>docker compose up<\/code>: <code>docker-compose.yml<\/code> dosyas\u0131n\u0131 okur, gerekli imajlar\u0131 indirir\/olu\u015fturur ve servisleri ba\u015flat\u0131r.<\/li>\n<li><code>-d<\/code> (detach modu): Konteynerleri arka planda \u00e7al\u0131\u015ft\u0131r\u0131r, b\u00f6ylece terminaliniz serbest kal\u0131r.<\/li>\n<\/ul>\n<p>Komutu \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra, Docker Compose&#8217;un imajlar\u0131 olu\u015fturdu\u011funu ve servisleri ba\u015flatt\u0131\u011f\u0131n\u0131 g\u00f6receksiniz. Taray\u0131c\u0131n\u0131zda <code>http:\/\/localhost:5000<\/code> adresine giderek Flask uygulaman\u0131za eri\u015febilirsiniz. Sayfay\u0131 her yeniledi\u011finizde, Redis&#8217;teki saya\u00e7 de\u011ferinin artt\u0131\u011f\u0131n\u0131 g\u00f6receksiniz.<\/p>\n<p>Uygulaman\u0131n durumunu kontrol etmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">\ndocker compose ps\n    <\/code><\/pre>\n<p>Bu komut, Compose taraf\u0131ndan y\u00f6netilen t\u00fcm servislerin durumunu g\u00f6sterir.<\/p>\n<p>Uygulamay\u0131 durdurmak ve konteynerleri kald\u0131rmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">\ndocker compose down\n    <\/code><\/pre>\n<p>Bu komut, <code>docker-compose.yml<\/code> dosyas\u0131nda tan\u0131mlanan a\u011flar\u0131 ve konteynerleri durdurur ve kald\u0131r\u0131r. E\u011fer <code>-v<\/code> (<code>--volumes<\/code>) se\u00e7ene\u011fini eklerseniz, tan\u0131mlanan volume&#8217;lar\u0131 da kald\u0131r\u0131r (bu durumda <code>redis_data<\/code> volume&#8217;u da silinir, dikkatli olun!).<\/p>\n<pre><code class=\"language-bash\">\ndocker compose down -v # Volume'lar\u0131 da siler\n    <\/code><\/pre>\n<p>Bu basit \u00f6rnek, Docker Compose&#8217;un \u00e7oklu servis uygulamalar\u0131n\u0131 y\u00f6netme g\u00fcc\u00fcn\u00fc g\u00f6stermektedir. Geli\u015ftirme s\u00fcrecinizi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde h\u0131zland\u0131racak ve kolayla\u015ft\u0131racakt\u0131r.<\/p>\n<h2>\u0130leri D\u00fczey Docker Compose Kullan\u0131m\u0131 ve En \u0130yi Uygulamalar<\/h2>\n<p>Docker Compose&#8217;un temel kullan\u0131m\u0131n\u0131 anlad\u0131ktan sonra, daha karma\u015f\u0131k senaryolarda size yard\u0131mc\u0131 olacak baz\u0131 ileri d\u00fczey \u00f6zelliklere ve en iyi uygulamalara g\u00f6z atal\u0131m. Bu teknikler, Compose dosyalar\u0131n\u0131z\u0131 daha esnek, g\u00fcvenli ve y\u00f6netilebilir hale getirecektir.<\/p>\n<h3>Ortam De\u011fi\u015fkenleri ve <code>.env<\/code> Dosyalar\u0131 Nas\u0131l Kullan\u0131l\u0131r?<\/h3>\n<p>Uygulamalar genellikle veritaban\u0131 \u015fifreleri, API anahtarlar\u0131 veya farkl\u0131 ortamlar i\u00e7in (geli\u015ftirme, test, \u00fcretim) \u00f6zel ayarlar gibi hassas bilgilere veya dinamik konfig\u00fcrasyonlara ihtiya\u00e7 duyar. Bu t\u00fcr bilgileri do\u011frudan <code>docker-compose.yml<\/code> dosyas\u0131na yazmak g\u00fcvenlik ve esneklik a\u00e7\u0131s\u0131ndan iyi bir uygulama de\u011fildir. Docker Compose, ortam de\u011fi\u015fkenlerini ve <code>.env<\/code> dosyalar\u0131n\u0131 kullanarak bu sorunu \u00e7\u00f6zmenizi sa\u011flar.<\/p>\n<p>Projenizin k\u00f6k dizininde bir <code>.env<\/code> dosyas\u0131 olu\u015fturarak ortam de\u011fi\u015fkenlerini tan\u0131mlayabilirsiniz:<\/p>\n<pre><code class=\"language-text\">\n# .env\nREDIS_PASSWORD=supersecretpassword\nDB_HOST=my_database_server\nAPP_PORT=8080\n    <\/code><\/pre>\n<p>Daha sonra <code>docker-compose.yml<\/code> dosyan\u0131zda bu de\u011fi\u015fkenleri referans alabilirsiniz:<\/p>\n<pre><code class=\"language-yaml\">\n# docker-compose.yml\nversion: '3.8'\nservices:\n  web:\n    build: .\/web\n    ports:\n      - \"${APP_PORT}:5000\" # APP_PORT .env dosyas\u0131ndan al\u0131n\u0131r\n    environment:\n      - REDIS_PASSWORD=${REDIS_PASSWORD} # Ortam de\u011fi\u015fkenini servise aktar\n      - DB_HOST=${DB_HOST}\n  redis:\n    image: \"redis:latest\"\n    command: [\"redis-server\", \"--requirepass\", \"${REDIS_PASSWORD}\"] # Redis \u015fifresini kullan\n    <\/code><\/pre>\n<p>Compose, <code>docker compose up<\/code> komutu \u00e7al\u0131\u015ft\u0131\u011f\u0131nda otomatik olarak <code>.env<\/code> dosyas\u0131n\u0131 okur ve buradaki de\u011fi\u015fkenleri YAML dosyas\u0131ndaki referanslarla de\u011fi\u015ftirir. Bu yakla\u015f\u0131m, hassas bilgileri versiyon kontrol sisteminden uzak tutman\u0131za ve farkl\u0131 ortamlar i\u00e7in kolayca konfig\u00fcrasyon de\u011fi\u015ftirmenize olanak tan\u0131r.<\/p>\n<h3>Volume Y\u00f6netimi: Kal\u0131c\u0131 Veri Saklama Nas\u0131l Sa\u011flan\u0131r?<\/h3>\n<p>Konteynerler do\u011falar\u0131 gere\u011fi ge\u00e7icidir; bir konteyner silindi\u011finde i\u00e7indeki t\u00fcm veriler de kaybolur. Veritabanlar\u0131, log dosyalar\u0131 veya kullan\u0131c\u0131 taraf\u0131ndan y\u00fcklenen dosyalar gibi kal\u0131c\u0131 olmas\u0131 gereken veriler i\u00e7in Docker Volume&#8217;lar\u0131 kullan\u0131l\u0131r. \u0130ki ana volume t\u00fcr\u00fc vard\u0131r:<\/p>\n<ul>\n<li><strong>Named Volumes (Adland\u0131r\u0131lm\u0131\u015f Volume&#8217;lar):<\/strong> Docker taraf\u0131ndan y\u00f6netilen \u00f6zel bir alanda depolan\u0131r. Konteynerler silinse bile volume&#8217;lar kal\u0131r. \u00d6nceki Redis \u00f6rne\u011finde <code>redis_data<\/code> ad\u0131nda bir volume kulland\u0131k.<\/li>\n<li><strong>Bind Mounts (Ba\u011flama Noktalar\u0131):<\/strong> Ana makine dosya sistemindeki belirli bir dizini do\u011frudan konteyner i\u00e7ine ba\u011flar. Geli\u015ftirme s\u0131ras\u0131nda kod de\u011fi\u015fikliklerinin an\u0131nda yans\u0131mas\u0131 i\u00e7in idealdir. (\u00d6nceki Flask \u00f6rne\u011finde <code>.\/web:\/app<\/code> bind mount kulland\u0131k.)<\/li>\n<\/ul>\n<p>Volume&#8217;lar\u0131 kullan\u0131rken, verilerin do\u011fru \u015fekilde yedeklendi\u011finden ve gerekti\u011finde kurtar\u0131labildi\u011finden emin olmak \u00f6nemlidir.<\/p>\n<h3>A\u011f Yap\u0131land\u0131rmas\u0131: \u00d6zel A\u011flar Olu\u015fturma<\/h3>\n<p>Docker Compose, varsay\u0131lan olarak projeniz i\u00e7in \u00f6zel bir k\u00f6pr\u00fc a\u011f\u0131 (bridge network) olu\u015fturur ve t\u00fcm servisleri bu a\u011fa dahil eder. Bu sayede servisler birbirleriyle isimleriyle ileti\u015fim kurabilirler (\u00f6rne\u011fin, <code>web<\/code> servisi <code>redis<\/code> servisine <code>redis<\/code> ana bilgisayar ad\u0131yla ba\u011flanabilir). Ancak bazen daha karma\u015f\u0131k a\u011f yap\u0131land\u0131rmalar\u0131na ihtiyac\u0131n\u0131z olabilir.<\/p>\n<p>\u00d6rne\u011fin, belirli servislerin sadece belirli a\u011flarda olmas\u0131n\u0131 veya farkl\u0131 a\u011flar aras\u0131nda ileti\u015fim kurmas\u0131n\u0131 isteyebilirsiniz:<\/p>\n<pre><code class=\"language-yaml\">\n# docker-compose.yml\nversion: '3.8'\nservices:\n  web:\n    networks:\n      - frontend_network\n      - backend_network\n  api:\n    networks:\n      - backend_network\n  db:\n    networks:\n      - backend_network\n\nnetworks:\n  frontend_network:\n    driver: bridge\n  backend_network:\n    driver: bridge\n    <\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>web<\/code> servisi hem <code>frontend_network<\/code> hem de <code>backend_network<\/code>&#8216;e ba\u011fl\u0131yken, <code>api<\/code> ve <code>db<\/code> servisleri sadece <code>backend_network<\/code>&#8216;e ba\u011fl\u0131d\u0131r. Bu, a\u011f segmentasyonu sa\u011flayarak g\u00fcvenli\u011fi art\u0131rabilir ve trafik ak\u0131\u015f\u0131n\u0131 daha iyi kontrol etmenize yard\u0131mc\u0131 olabilir.<\/p>\n<h3>Sa\u011fl\u0131k Kontrolleri (Healthchecks) Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Bir servis ba\u015flat\u0131ld\u0131\u011f\u0131nda, onun hemen kullan\u0131ma haz\u0131r oldu\u011fu anlam\u0131na gelmez. \u00d6rne\u011fin, bir veritaban\u0131 konteyneri aya\u011fa kalkabilir ancak veritaban\u0131 sunucusu hen\u00fcz ba\u011flant\u0131lar\u0131 kabul etmiyor olabilir. Sa\u011fl\u0131k kontrolleri, Docker&#8217;\u0131n bir konteynerin ger\u00e7ekten &#8220;sa\u011fl\u0131kl\u0131&#8221; ve kullan\u0131ma haz\u0131r olup olmad\u0131\u011f\u0131n\u0131 belirlemesini sa\u011flar. Bu, <code>depends_on<\/code> ile birlikte kullan\u0131ld\u0131\u011f\u0131nda daha g\u00fcvenilir uygulama ba\u015flatma s\u00fcre\u00e7leri olu\u015fturur.<\/p>\n<pre><code class=\"language-yaml\">\n# docker-compose.yml\nversion: '3.8'\nservices:\n  web:\n    build: .\/web\n    ports:\n      - \"5000:5000\"\n    depends_on:\n      redis:\n        condition: service_healthy # Redis sa\u011fl\u0131kl\u0131 olana kadar bekle\n  redis:\n    image: \"redis:latest\"\n    healthcheck:\n      test: [\"CMD\", \"redis-cli\", \"ping\"] # Redis'in ping komutuna yan\u0131t verip vermedi\u011fini kontrol et\n      interval: 1s # Her 1 saniyede bir kontrol et\n      timeout: 3s # 3 saniye i\u00e7inde yan\u0131t gelmezse ba\u015far\u0131s\u0131z say\n      retries: 5 # 5 ba\u015far\u0131s\u0131z denemeden sonra sa\u011fl\u0131ks\u0131z ilan et\n    <\/code><\/pre>\n<p>Bu konfig\u00fcrasyonla, <code>web<\/code> servisi sadece <code>redis<\/code> servisi sa\u011fl\u0131k kontrol\u00fcnden ge\u00e7tikten sonra ba\u015flayacakt\u0131r. Bu, uygulama ba\u015flatma s\u0131ras\u0131nda ba\u011flant\u0131 hatalar\u0131n\u0131 \u00f6nlemeye yard\u0131mc\u0131 olur.<\/p>\n<h3>Birden Fazla Compose Dosyas\u0131 ile \u00c7al\u0131\u015fma (<code class=\"language-\">-f<\/code>)<\/h3>\n<p>Bazen farkl\u0131 ortamlar (geli\u015ftirme, test, \u00fcretim) i\u00e7in Compose dosyalar\u0131n\u0131zda k\u00fc\u00e7\u00fck farkl\u0131l\u0131klar olabilir. \u00d6rne\u011fin, geli\u015ftirme ortam\u0131nda kodunuzu ba\u011flamak i\u00e7in bind mount kullan\u0131rken, \u00fcretimde daha performansl\u0131 named volume&#8217;lar kullanmak isteyebilirsiniz. Bu durumda birden fazla Compose dosyas\u0131 kullanabilirsiniz.<\/p>\n<pre><code class=\"language-bash\">\n# Geli\u015ftirme i\u00e7in:\ndocker compose -f docker-compose.yml -f docker-compose.dev.yml up\n\n# \u00dcretim i\u00e7in (farkl\u0131 bir veritaban\u0131 konfig\u00fcrasyonu veya daha az loglama ile):\ndocker compose -f docker-compose.yml -f docker-compose.prod.yml up\n    <\/code><\/pre>\n<p>Compose, dosyalar\u0131 belirtilen s\u0131raya g\u00f6re birle\u015ftirir ve daha sonra belirtilen dosyalar \u00f6nceki dosyalardaki ayarlar\u0131 ge\u00e7ersiz k\u0131lar. Bu, temel bir <code>docker-compose.yml<\/code> dosyas\u0131na sahip olup, ortama \u00f6zel ayarlar\u0131 ayr\u0131 dosyalarda tutman\u0131za olanak tan\u0131r.<\/p>\n<p>Bu ileri d\u00fczey teknikler, Docker Compose projelerinizi daha g\u00fc\u00e7l\u00fc, esnek ve ger\u00e7ek d\u00fcnya senaryolar\u0131na uygun hale getirmenize yard\u0131mc\u0131 olacakt\u0131r. Konteynerle\u015ftirilmi\u015f uygulamalar\u0131n\u0131z\u0131n y\u00f6netimini bir \u00fcst seviyeye ta\u015f\u0131yarak, geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizde \u00f6nemli avantajlar sa\u011flayabilirsiniz.<\/p>\n<h2>Vaka Analizi: \u00dc\u00e7 Katmanl\u0131 Bir Uygulaman\u0131n Docker Compose ile Da\u011f\u0131t\u0131m\u0131<\/h2>\n<p>\u015eimdiye kadar \u00f6\u011frendiklerimizi peki\u015ftirmek ve Docker Compose&#8217;un ger\u00e7ek bir senaryoda nas\u0131l kullan\u0131labilece\u011fini g\u00f6stermek i\u00e7in, yayg\u0131n bir \u00fc\u00e7 katmanl\u0131 (three-tier) uygulaman\u0131n da\u011f\u0131t\u0131m\u0131n\u0131 inceleyelim. Bu uygulama, bir \u00f6n u\u00e7 (frontend &#8211; React), bir arka u\u00e7 API&#8217;si (backend &#8211; Node.js) ve bir veritaban\u0131 (PostgreSQL) olmak \u00fczere \u00fc\u00e7 ana bile\u015fenden olu\u015facak. Amac\u0131m\u0131z, t\u00fcm bu bile\u015fenleri Docker konteynerlerinde \u00e7al\u0131\u015ft\u0131rmak ve Docker Compose ile y\u00f6netmektir.<\/p>\n<h3>Uygulama Mimarisi ve Bile\u015fenleri<\/h3>\n<p>Uygulamam\u0131z\u0131n bile\u015fenleri ve rolleri \u015fu \u015fekildedir:<\/p>\n<ul>\n<li><strong>Frontend (Web Sunucusu):<\/strong> Bir React uygulamas\u0131ndan olu\u015fur ve Nginx taraf\u0131ndan statik dosyalar olarak sunulur. Kullan\u0131c\u0131lar\u0131n etkile\u015fimde bulundu\u011fu aray\u00fczd\u00fcr.<\/li>\n<li><strong>Backend (API Sunucusu):<\/strong> Node.js ile yaz\u0131lm\u0131\u015f bir RESTful API&#8217;dir. Veritaban\u0131 ile ileti\u015fim kurar ve frontend&#8217;den gelen istekleri i\u015fler.<\/li>\n<li><strong>Veritaban\u0131:<\/strong> PostgreSQL, uygulaman\u0131n t\u00fcm verilerini kal\u0131c\u0131 olarak depolar.<\/li>\n<\/ul>\n<p>Bu \u00fc\u00e7 bile\u015fenin her biri ayr\u0131 bir Docker konteynerinde \u00e7al\u0131\u015facak ve Docker Compose taraf\u0131ndan y\u00f6netilecektir. Bu yakla\u015f\u0131m, her bir bile\u015fenin ba\u011f\u0131ms\u0131z olarak geli\u015ftirilmesine, \u00f6l\u00e7eklenmesine ve g\u00fcncellenmesine olanak tan\u0131r.<\/p>\n<h3><code>docker-compose.yml<\/code> ile \u00dc\u00e7 Katmanl\u0131 Uygulama Konfig\u00fcrasyonu<\/h3>\n<p>Proje k\u00f6k dizininde a\u015fa\u011f\u0131daki <code>docker-compose.yml<\/code> dosyas\u0131n\u0131 olu\u015ftural\u0131m. Ayr\u0131ca, her servis i\u00e7in ayr\u0131 dizinlerde (<code>frontend<\/code>, <code>backend<\/code>) gerekli <code>Dockerfile<\/code> ve uygulama kodlar\u0131n\u0131n bulundu\u011funu varsayal\u0131m.<\/p>\n<pre><code class=\"language-yaml\">\n# docker-compose.yml\nversion: '3.8'\n\nservices:\n  # Frontend Servisi (Nginx + React)\n  frontend:\n    build: .\/frontend # frontend dizinindeki Dockerfile'dan imaj olu\u015ftur\n    ports:\n      - \"80:80\" # Host'un 80 portunu konteynerin 80 portuna y\u00f6nlendir\n    depends_on:\n      - backend # Frontend'in backend'e ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 yok ama geli\u015ftirme s\u0131ras\u0131nda faydal\u0131 olabilir\n    networks:\n      - app_network\n    volumes:\n      - .\/frontend\/nginx.conf:\/etc\/nginx\/conf.d\/default.conf:ro # Nginx konfig\u00fcrasyonunu ba\u011fla\n      # \u00dcretim i\u00e7in genellikle sadece build edilmi\u015f statik dosyalar\u0131 ba\u011flamak yeterlidir\n      # - .\/frontend\/build:\/usr\/share\/nginx\/html:ro\n\n  # Backend Servisi (Node.js API)\n  backend:\n    build: .\/backend # backend dizinindeki Dockerfile'dan imaj olu\u015ftur\n    ports:\n      - \"3001:3001\" # Host'un 3001 portunu konteynerin 3001 portuna y\u00f6nlendir\n    environment:\n      DATABASE_URL: postgres:\/\/user:password@db:5432\/mydatabase # Veritaban\u0131 ba\u011flant\u0131 dizesi\n      NODE_ENV: development\n    depends_on:\n      db:\n        condition: service_healthy # Backend'in db'nin sa\u011fl\u0131kl\u0131 olmas\u0131n\u0131 beklemesi\n    networks:\n      - app_network\n    volumes:\n      - .\/backend:\/app # Geli\u015ftirme i\u00e7in kod ba\u011flama\n      - \/app\/node_modules # node_modules'in host'a yans\u0131mamas\u0131n\u0131 sa\u011flar\n\n  # Veritaban\u0131 Servisi (PostgreSQL)\n  db:\n    image: postgres:13-alpine # Hafif bir PostgreSQL imaj\u0131\n    environment:\n      POSTGRES_DB: mydatabase\n      POSTGRES_USER: user\n      POSTGRES_PASSWORD: password\n    volumes:\n      - db_data:\/var\/lib\/postgresql\/data # Veritaban\u0131 verileri i\u00e7in kal\u0131c\u0131 volume\n    ports:\n      - \"5432:5432\" # Sadece geli\u015ftirme\/debugging i\u00e7in a\u00e7\u0131labilir, \u00fcretimde genellikle kapal\u0131d\u0131r\n    healthcheck: # Veritaban\u0131 sa\u011fl\u0131k kontrol\u00fc\n      test: [\"CMD-SHELL\", \"pg_isready -U user -d mydatabase\"]\n      interval: 5s\n      timeout: 5s\n      retries: 5\n    networks:\n      - app_network\n\nnetworks:\n  app_network:\n    driver: bridge\n\nvolumes:\n  db_data:\n    driver: local\n    <\/code><\/pre>\n<p>Bu <code>docker-compose.yml<\/code> dosyas\u0131ndaki \u00f6nemli noktalar:<\/p>\n<ul>\n<li><strong><code>frontend<\/code> servisi:<\/strong>\n<ul>\n<li><code>build: .\/frontend<\/code>: React uygulamas\u0131n\u0131n statik dosyalar\u0131n\u0131 olu\u015fturan ve Nginx ile sunan bir <code>Dockerfile<\/code>&#8216;dan imaj olu\u015fturur.<\/li>\n<li><code>ports: \"80:80\"<\/code>: Uygulamaya varsay\u0131lan HTTP portu \u00fczerinden eri\u015filmesini sa\u011flar.<\/li>\n<li><code>volumes: .\/frontend\/nginx.conf:\/etc\/nginx\/conf.d\/default.conf:ro<\/code>: Nginx&#8217;in \u00f6zel konfig\u00fcrasyon dosyas\u0131n\u0131 konteyner i\u00e7ine salt okunur (<code>ro<\/code>) olarak ba\u011flar.<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>backend<\/code> servisi:<\/strong>\n<ul>\n<li><code>build: .\/backend<\/code>: Node.js API&#8217;sini i\u00e7eren bir <code>Dockerfile<\/code>&#8216;dan imaj olu\u015fturur.<\/li>\n<li><code>environment<\/code>: Veritaban\u0131 ba\u011flant\u0131 bilgilerini ortam de\u011fi\u015fkenleri olarak ayarlar. Burada <code>db<\/code> hostname&#8217;i, Compose taraf\u0131ndan otomatik olarak olu\u015fturulan a\u011fdaki veritaban\u0131 servisinin ad\u0131d\u0131r.<\/li>\n<li><code>depends_on: db: { condition: service_healthy }<\/code>: Backend&#8217;in sadece veritaban\u0131 servisi tamamen sa\u011fl\u0131kl\u0131 oldu\u011funda ba\u015flamas\u0131n\u0131 garanti eder. Bu, ba\u011flant\u0131 hatalar\u0131n\u0131 \u00f6nler.<\/li>\n<li><code>volumes: .\/backend:\/app<\/code>: Geli\u015ftirme kolayl\u0131\u011f\u0131 i\u00e7in backend kodunu ba\u011flar. <code>\/app\/node_modules<\/code> istisnas\u0131, host&#8217;taki <code>node_modules<\/code>&#8216;in konteynerdeki ile \u00e7ak\u0131\u015fmas\u0131n\u0131 engeller.<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>db<\/code> servisi:<\/strong>\n<ul>\n<li><code>image: postgres:13-alpine<\/code>: Hafif bir PostgreSQL imaj\u0131 kullan\u0131r.<\/li>\n<li><code>environment<\/code>: PostgreSQL i\u00e7in gerekli ortam de\u011fi\u015fkenlerini (veritaban\u0131 ad\u0131, kullan\u0131c\u0131, \u015fifre) ayarlar.<\/li>\n<li><code>volumes: db_data:\/var\/lib\/postgresql\/data<\/code>: Veritaban\u0131 verilerinin kal\u0131c\u0131l\u0131\u011f\u0131n\u0131 sa\u011flamak i\u00e7in adland\u0131r\u0131lm\u0131\u015f bir Docker Volume kullan\u0131r. Bu, konteyner silinse bile verilerin g\u00fcvende kalmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><code>healthcheck<\/code>: Veritaban\u0131n\u0131n ba\u011flant\u0131lar\u0131 kabul etmeye haz\u0131r olup olmad\u0131\u011f\u0131n\u0131 kontrol eder.<\/li>\n<\/ul>\n<\/li>\n<li><strong><code>networks<\/code>:<\/strong> T\u00fcm servisleri ayn\u0131 \u00f6zel <code>app_network<\/code> a\u011f\u0131na dahil eder, b\u00f6ylece birbirleriyle kolayca ileti\u015fim kurabilirler.<\/li>\n<li><strong><code>volumes<\/code>:<\/strong> <code>db_data<\/code> ad\u0131nda bir volume tan\u0131mlar\u0131z.<\/li>\n<\/ul>\n<h3>Uygulamay\u0131 \u00c7al\u0131\u015ft\u0131rma ve Y\u00f6netme<\/h3>\n<p>Bu \u00fc\u00e7 katmanl\u0131 uygulamay\u0131 ba\u015flatmak i\u00e7in, <code>docker-compose.yml<\/code> dosyas\u0131n\u0131n bulundu\u011fu dizinde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">\ndocker compose up -d --build\n    <\/code><\/pre>\n<ul>\n<li><code>--build<\/code>: Gerekirse imajlar\u0131 yeniden olu\u015fturur (\u00f6rne\u011fin, <code>Dockerfile<\/code> veya uygulama kodunda de\u011fi\u015fiklik yapt\u0131ysan\u0131z).<\/li>\n<\/ul>\n<p>Uygulama ba\u015far\u0131yla ba\u015flat\u0131ld\u0131ktan sonra, taray\u0131c\u0131n\u0131zdan <code>http:\/\/localhost<\/code> adresine giderek frontend&#8217;e eri\u015febilirsiniz. Frontend, backend API&#8217;sine istekler g\u00f6nderecek, backend de veritaban\u0131 ile etkile\u015fime girecektir.<\/p>\n<p>Servis loglar\u0131n\u0131 takip etmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">\ndocker compose logs -f\n    <\/code><\/pre>\n<p>Belirli bir servisin loglar\u0131n\u0131 g\u00f6rmek i\u00e7in (\u00f6rne\u011fin backend):<\/p>\n<pre><code class=\"language-bash\">\ndocker compose logs -f backend\n    <\/code><\/pre>\n<p>Uygulamay\u0131 durdurmak ve t\u00fcm servisleri kald\u0131rmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">\ndocker compose down\n    <\/code><\/pre>\n<p>Veritaban\u0131 verilerini de silmek isterseniz:<\/p>\n<pre><code class=\"language-bash\">\ndocker compose down -v\n    <\/code><\/pre>\n<p>Bu vaka analizi, Docker Compose&#8217;un karma\u015f\u0131k, \u00e7ok bile\u015fenli uygulamalar\u0131 tek bir komutla nas\u0131l y\u00f6netebilece\u011fini a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Geli\u015ftirme ve test s\u00fcre\u00e7lerinizi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131r\u0131rken, uygulama bile\u015fenleri aras\u0131nda tutarl\u0131 bir ortam sa\u011flar. Bu, modern DevOps pratiklerinin temel ta\u015flar\u0131ndan biridir.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu kapsaml\u0131 rehber boyunca, Ubuntu \u00fczerinde Docker Compose&#8217;u kurmaktan, temel bir web uygulamas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmaya ve ileri d\u00fczey konfig\u00fcrasyon tekniklerini \u00f6\u011frenmeye kadar bir\u00e7ok konuyu ele ald\u0131k. Docker Compose&#8217;un, \u00e7oklu konteynerli Docker uygulamalar\u0131n\u0131 tan\u0131mlama, yap\u0131land\u0131rma ve y\u00f6netme s\u00fcre\u00e7lerini ne kadar basitle\u015ftirdi\u011fini g\u00f6rd\u00fck. Geli\u015ftirme ortamlar\u0131nda tutarl\u0131l\u0131k sa\u011flamak, yeni ekip \u00fcyelerini h\u0131zl\u0131ca projeye dahil etmek ve karma\u015f\u0131k uygulama mimarilerini tek bir YAML dosyas\u0131yla kontrol etmek gibi paha bi\u00e7ilmez avantajlar sundu\u011funu anlad\u0131k.<\/p>\n<p>Art\u0131k Docker Compose&#8217;un g\u00fcc\u00fcn\u00fc kullanarak kendi \u00e7ok servisli uygulamalar\u0131n\u0131z\u0131 kolayca y\u00f6netebilir, geli\u015ftirme s\u00fcre\u00e7lerinizi optimize edebilir ve daha verimli \u00e7al\u0131\u015fabilirsiniz. Konteynerle\u015fme yolculu\u011funuzda Docker Compose, vazge\u00e7ilmez bir yol arkada\u015f\u0131 olacakt\u0131r. \u00d6\u011frendi\u011finiz bu bilgilerle, daha karma\u015f\u0131k projelerin \u00fcstesinden gelmeye ve modern uygulama da\u011f\u0131t\u0131m pratiklerini benimsemeye haz\u0131rs\u0131n\u0131z. Unutmay\u0131n, pratik yapmak \u00f6\u011frenmenin anahtar\u0131d\u0131r; bu y\u00fczden farkl\u0131 senaryolarla denemeler yapmaktan \u00e7ekinmeyin!<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<table class=\"responsive-table\">\n<thead>\n<tr>\n<th>Soru<\/th>\n<th>Cevap<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td data-label=\"Soru\">Docker Compose nedir ve neden kullanmal\u0131y\u0131m?<\/td>\n<td data-label=\"Cevap\">Docker Compose, 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 kullanarak uygulaman\u0131z\u0131n t\u00fcm servislerini, a\u011flar\u0131n\u0131 ve volume&#8217;lar\u0131n\u0131 yap\u0131land\u0131rabilir ve tek bir komutla (<code>docker compose up<\/code>) t\u00fcm uygulamay\u0131 ba\u015flatabilirsiniz. Karma\u015f\u0131k uygulamalar\u0131n y\u00f6netimini basitle\u015ftirir, geli\u015ftirme ortamlar\u0131nda tutarl\u0131l\u0131k sa\u011flar ve uygulama da\u011f\u0131t\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/td>\n<\/tr>\n<tr>\n<td data-label=\"Soru\"><code>docker-compose<\/code> ile <code>docker compose<\/code> aras\u0131ndaki fark nedir?<\/td>\n<td data-label=\"Cevap\"><code>docker-compose<\/code>, Docker Compose&#8217;un orijinal ba\u011f\u0131ms\u0131z Python uygulamas\u0131d\u0131r. <code>docker compose<\/code> ise Docker Engine&#8217;in bir par\u00e7as\u0131 olarak gelen yeni ve entegre bir CLI eklentisidir (<code>docker-compose-plugin<\/code>). Yeni projelerde ve g\u00fcncel Docker kurulumlar\u0131nda <code>docker compose<\/code> kullan\u0131lmas\u0131 \u00f6nerilir, \u00e7\u00fcnk\u00fc daha g\u00fcncel \u00f6zelliklere sahiptir ve Docker CLI ile daha iyi entegredir.<\/td>\n<\/tr>\n<tr>\n<td data-label=\"Soru\"><code>docker compose up<\/code> ile <code>docker compose up -d<\/code> aras\u0131ndaki fark nedir?<\/td>\n<td data-label=\"Cevap\"><code>docker compose up<\/code> komutu, servisleri ba\u015flat\u0131r ve konteynerlerin loglar\u0131n\u0131 do\u011frudan terminalinizde g\u00f6sterir. Bu, geli\u015ftirme s\u0131ras\u0131nda veya sorun giderme a\u015famas\u0131nda kullan\u0131\u015fl\u0131d\u0131r. <code>docker compose up -d<\/code> (detach modu) ise servisleri arka planda ba\u015flat\u0131r ve terminalinizi serbest b\u0131rak\u0131r. Bu genellikle uygulaman\u0131z\u0131 \u00e7al\u0131\u015f\u0131r durumda b\u0131rak\u0131p ba\u015fka i\u015flerle ilgilenmek istedi\u011finizde tercih edilir.<\/td>\n<\/tr>\n<tr>\n<td data-label=\"Soru\">Docker Compose \u00fcretim ortam\u0131nda kullan\u0131lmal\u0131 m\u0131?<\/td>\n<td data-label=\"Cevap\">Docker Compose, geli\u015ftirme ve test ortamlar\u0131 i\u00e7in m\u00fckemmel bir ara\u00e7t\u0131r. K\u00fc\u00e7\u00fck \u00f6l\u00e7ekli \u00fcretim ortamlar\u0131nda veya tek sunuculu da\u011f\u0131t\u0131mlarda da kullan\u0131labilir. Ancak b\u00fcy\u00fck \u00f6l\u00e7ekli, y\u00fcksek kullan\u0131labilirlikli ve otomatik \u00f6l\u00e7eklenebilir \u00fcretim ortamlar\u0131 i\u00e7in Kubernetes gibi daha geli\u015fmi\u015f konteyner orkestrasyon ara\u00e7lar\u0131 (\u00f6rne\u011fin Kubernetes) daha uygundur. Compose, bu t\u00fcr daha karma\u015f\u0131k sistemlere ge\u00e7i\u015f i\u00e7in harika bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r.<\/td>\n<\/tr>\n<tr>\n<td data-label=\"Soru\">Konteyner verilerini kal\u0131c\u0131 hale getirmek i\u00e7in ne kullanmal\u0131y\u0131m?<\/td>\n<td data-label=\"Cevap\">Konteyner verilerini kal\u0131c\u0131 hale getirmek i\u00e7in Docker Volume&#8217;lar\u0131 kullanmal\u0131s\u0131n\u0131z. \u0130ki ana t\u00fcr\u00fc vard\u0131r: adland\u0131r\u0131lm\u0131\u015f volume&#8217;lar (named volumes) ve ba\u011flama noktalar\u0131 (bind mounts). Adland\u0131r\u0131lm\u0131\u015f volume&#8217;lar, verileri Docker taraf\u0131ndan y\u00f6netilen \u00f6zel bir alanda saklar ve konteyner silinse bile verilerin kaybolmamas\u0131n\u0131 sa\u011flar. Bind mount&#8217;lar ise ana makine dosya sistemindeki bir dizini do\u011frudan konteyner i\u00e7ine ba\u011flar ve genellikle geli\u015ftirme s\u0131ras\u0131nda kod de\u011fi\u015fikliklerinin an\u0131nda yans\u0131mas\u0131 i\u00e7in kullan\u0131l\u0131r.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Ubuntu&#8217;da Docker Compose Kurulumu ve Kullan\u0131m\u0131 Rehberi Modern uygulama geli\u015ftirme s\u00fcre\u00e7lerinde, mikroservis mimarileri ve konteyner teknolojileri h\u0131zla benimseniyor.&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-33027","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>Docker Compose&#039;u Anlamak: Neden \u0130htiyac\u0131m\u0131z Var?<\/title>\n<meta name=\"description\" content=\"Modern uygulama geli\u015ftirme s\u00fcre\u00e7lerinde, mikroservis mimarileri ve konteyner teknolojileri h\u0131zla benimseniyor. Ancak birden fazla servisten olu\u015fan bir uygulaman\u0131n t\u00fcm bile\u015fenlerini tek tek y\u00f6netmek olduk\u00e7a karma\u015f\u0131k olabilir. \u0130\u015fte tam bu noktada Docker Compose devreye girerek, \u00e7ok konteynerli Docker uygulamalar\u0131n\u0131 tan\u0131mlama ve \u00e7al\u0131\u015ft\u0131rma s\u00fcrecini basitle\u015ftiriyor. Bu kapsaml\u0131 rehberde, Ubuntu \u00fczerinde Docker Compose&#039;u nas\u0131l kuraca\u011f\u0131n\u0131z\u0131, temelden ileri d\u00fczeye nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda projelerinizi nas\u0131l y\u00f6netece\u011finizi ad\u0131m ad\u0131m \u00f6\u011freneceksiniz. Haz\u0131rsan\u0131z, konteyner orkestrasyonunun g\u00fcc\u00fcn\u00fc ke\u015ffetmeye ba\u015flayal\u0131m!\" \/>\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\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Docker Compose&#039;u Anlamak: Neden \u0130htiyac\u0131m\u0131z Var?\" \/>\n<meta property=\"og:description\" content=\"Modern uygulama geli\u015ftirme s\u00fcre\u00e7lerinde, mikroservis mimarileri ve konteyner teknolojileri h\u0131zla benimseniyor. Ancak birden fazla servisten olu\u015fan bir uygulaman\u0131n t\u00fcm bile\u015fenlerini tek tek y\u00f6netmek olduk\u00e7a karma\u015f\u0131k olabilir. \u0130\u015fte tam bu noktada Docker Compose devreye girerek, \u00e7ok konteynerli Docker uygulamalar\u0131n\u0131 tan\u0131mlama ve \u00e7al\u0131\u015ft\u0131rma s\u00fcrecini basitle\u015ftiriyor. Bu kapsaml\u0131 rehberde, Ubuntu \u00fczerinde Docker Compose&#039;u nas\u0131l kuraca\u011f\u0131n\u0131z\u0131, temelden ileri d\u00fczeye nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda projelerinizi nas\u0131l y\u00f6netece\u011finizi ad\u0131m ad\u0131m \u00f6\u011freneceksiniz. Haz\u0131rsan\u0131z, konteyner orkestrasyonunun g\u00fcc\u00fcn\u00fc ke\u015ffetmeye ba\u015flayal\u0131m!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-28T13:24: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=\"25 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Docker Compose&#8217;u Anlamak: Neden \u0130htiyac\u0131m\u0131z Var?\",\"datePublished\":\"2025-10-28T13:24:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/\"},\"wordCount\":3879,\"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\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/\",\"name\":\"Docker Compose'u Anlamak: Neden \u0130htiyac\u0131m\u0131z Var?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-28T13:24:10+00:00\",\"description\":\"Modern uygulama geli\u015ftirme s\u00fcre\u00e7lerinde, mikroservis mimarileri ve konteyner teknolojileri h\u0131zla benimseniyor. Ancak birden fazla servisten olu\u015fan bir uygulaman\u0131n t\u00fcm bile\u015fenlerini tek tek y\u00f6netmek olduk\u00e7a karma\u015f\u0131k olabilir. \u0130\u015fte tam bu noktada Docker Compose devreye girerek, \u00e7ok konteynerli Docker uygulamalar\u0131n\u0131 tan\u0131mlama ve \u00e7al\u0131\u015ft\u0131rma s\u00fcrecini basitle\u015ftiriyor. Bu kapsaml\u0131 rehberde, Ubuntu \u00fczerinde Docker Compose'u nas\u0131l kuraca\u011f\u0131n\u0131z\u0131, temelden ileri d\u00fczeye nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda projelerinizi nas\u0131l y\u00f6netece\u011finizi ad\u0131m ad\u0131m \u00f6\u011freneceksiniz. Haz\u0131rsan\u0131z, konteyner orkestrasyonunun g\u00fcc\u00fcn\u00fc ke\u015ffetmeye ba\u015flayal\u0131m!\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Docker Compose&#8217;u Anlamak: Neden \u0130htiyac\u0131m\u0131z Var?\"}]},{\"@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":"Docker Compose'u Anlamak: Neden \u0130htiyac\u0131m\u0131z Var?","description":"Modern uygulama geli\u015ftirme s\u00fcre\u00e7lerinde, mikroservis mimarileri ve konteyner teknolojileri h\u0131zla benimseniyor. Ancak birden fazla servisten olu\u015fan bir uygulaman\u0131n t\u00fcm bile\u015fenlerini tek tek y\u00f6netmek olduk\u00e7a karma\u015f\u0131k olabilir. \u0130\u015fte tam bu noktada Docker Compose devreye girerek, \u00e7ok konteynerli Docker uygulamalar\u0131n\u0131 tan\u0131mlama ve \u00e7al\u0131\u015ft\u0131rma s\u00fcrecini basitle\u015ftiriyor. Bu kapsaml\u0131 rehberde, Ubuntu \u00fczerinde Docker Compose'u nas\u0131l kuraca\u011f\u0131n\u0131z\u0131, temelden ileri d\u00fczeye nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda projelerinizi nas\u0131l y\u00f6netece\u011finizi ad\u0131m ad\u0131m \u00f6\u011freneceksiniz. Haz\u0131rsan\u0131z, konteyner orkestrasyonunun g\u00fcc\u00fcn\u00fc ke\u015ffetmeye ba\u015flayal\u0131m!","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\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/","og_locale":"tr_TR","og_type":"article","og_title":"Docker Compose'u Anlamak: Neden \u0130htiyac\u0131m\u0131z Var?","og_description":"Modern uygulama geli\u015ftirme s\u00fcre\u00e7lerinde, mikroservis mimarileri ve konteyner teknolojileri h\u0131zla benimseniyor. Ancak birden fazla servisten olu\u015fan bir uygulaman\u0131n t\u00fcm bile\u015fenlerini tek tek y\u00f6netmek olduk\u00e7a karma\u015f\u0131k olabilir. \u0130\u015fte tam bu noktada Docker Compose devreye girerek, \u00e7ok konteynerli Docker uygulamalar\u0131n\u0131 tan\u0131mlama ve \u00e7al\u0131\u015ft\u0131rma s\u00fcrecini basitle\u015ftiriyor. Bu kapsaml\u0131 rehberde, Ubuntu \u00fczerinde Docker Compose'u nas\u0131l kuraca\u011f\u0131n\u0131z\u0131, temelden ileri d\u00fczeye nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda projelerinizi nas\u0131l y\u00f6netece\u011finizi ad\u0131m ad\u0131m \u00f6\u011freneceksiniz. Haz\u0131rsan\u0131z, konteyner orkestrasyonunun g\u00fcc\u00fcn\u00fc ke\u015ffetmeye ba\u015flayal\u0131m!","og_url":"https:\/\/fatihsoysal.com\/blog\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-28T13:24:10+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"25 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Docker Compose&#8217;u Anlamak: Neden \u0130htiyac\u0131m\u0131z Var?","datePublished":"2025-10-28T13:24:10+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/"},"wordCount":3879,"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\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/","url":"https:\/\/fatihsoysal.com\/blog\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/","name":"Docker Compose'u Anlamak: Neden \u0130htiyac\u0131m\u0131z Var?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-28T13:24:10+00:00","description":"Modern uygulama geli\u015ftirme s\u00fcre\u00e7lerinde, mikroservis mimarileri ve konteyner teknolojileri h\u0131zla benimseniyor. Ancak birden fazla servisten olu\u015fan bir uygulaman\u0131n t\u00fcm bile\u015fenlerini tek tek y\u00f6netmek olduk\u00e7a karma\u015f\u0131k olabilir. \u0130\u015fte tam bu noktada Docker Compose devreye girerek, \u00e7ok konteynerli Docker uygulamalar\u0131n\u0131 tan\u0131mlama ve \u00e7al\u0131\u015ft\u0131rma s\u00fcrecini basitle\u015ftiriyor. Bu kapsaml\u0131 rehberde, Ubuntu \u00fczerinde Docker Compose'u nas\u0131l kuraca\u011f\u0131n\u0131z\u0131, temelden ileri d\u00fczeye nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda projelerinizi nas\u0131l y\u00f6netece\u011finizi ad\u0131m ad\u0131m \u00f6\u011freneceksiniz. Haz\u0131rsan\u0131z, konteyner orkestrasyonunun g\u00fcc\u00fcn\u00fc ke\u015ffetmeye ba\u015flayal\u0131m!","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/docker-composeu-anlamak-neden-ihtiyacimiz-var\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Docker Compose&#8217;u Anlamak: Neden \u0130htiyac\u0131m\u0131z Var?"}]},{"@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\/33027","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=33027"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33027\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33027"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33027"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33027"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}