{"id":36194,"date":"2025-12-10T01:01:26","date_gmt":"2025-12-09T22:01:26","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/"},"modified":"2025-12-10T01:01:26","modified_gmt":"2025-12-09T22:01:26","slug":"otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/","title":{"rendered":"Otomatik Docker Da\u011f\u0131t\u0131m Beti\u011fi Olu\u015fturma: Ba\u015flang\u0131\u00e7 Rehberi"},"content":{"rendered":"<p><body><\/p>\n<p>Uygulama geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7leri, g\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zl\u0131 tempolu yaz\u0131l\u0131m d\u00fcnyas\u0131nda s\u00fcrekli evrim ge\u00e7iriyor. Geleneksel y\u00f6ntemlerle yap\u0131lan uygulama da\u011f\u0131t\u0131mlar\u0131 genellikle yava\u015f, hatalara a\u00e7\u0131k ve tekrarlayan manuel ad\u0131mlarla dolu olabilir. \u00d6zellikle k\u00fc\u00e7\u00fck hatalar bile b\u00fcy\u00fck aksakl\u0131klara yol a\u00e7arken, her yeni s\u00fcr\u00fcmde ayn\u0131 ad\u0131mlar\u0131 tekrarlamak geli\u015ftiriciler ve operasyon ekipleri i\u00e7in ciddi bir zaman kayb\u0131 anlam\u0131na gelir. Peki, bu s\u00fcreci nas\u0131l daha verimli, daha g\u00fcvenilir ve daha h\u0131zl\u0131 hale getirebiliriz? \u0130\u015fte tam da bu noktada, Docker ve otomasyon betiklerinin g\u00fcc\u00fc devreye giriyor.<\/p>\n<p>Otomatik Docker da\u011f\u0131t\u0131m\u0131, bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm sunar. Uygulamalar\u0131n\u0131z\u0131 Docker konteynerlerine ta\u015f\u0131yarak, &#8220;bir kez yaz, her yerde \u00e7al\u0131\u015ft\u0131r&#8221; felsefesini benimseyebilir ve da\u011f\u0131t\u0131m ortam\u0131n\u0131z ne olursa olsun tutarl\u0131 bir \u00e7al\u0131\u015fma garantisi elde edersiniz. Ancak Docker&#8217;\u0131 kullanmak sadece bir ba\u015flang\u0131\u00e7t\u0131r; as\u0131l verimlilik, da\u011f\u0131t\u0131m s\u00fcrecini otomatikle\u015ftirmekle sa\u011flan\u0131r. Otomatik da\u011f\u0131t\u0131m betikleri sayesinde, bir butona basarak veya bir kod de\u011fi\u015fikli\u011fi alg\u0131land\u0131\u011f\u0131nda uygulaman\u0131z\u0131n \u00fcretim ortam\u0131na sorunsuz bir \u015fekilde ta\u015f\u0131nmas\u0131n\u0131 sa\u011flayabilirsiniz. Bu makale, bu heyecan verici d\u00fcnyaya ilk ad\u0131m\u0131n\u0131 atmak isteyenler i\u00e7in kapsaml\u0131 bir rehber niteli\u011findedir. S\u0131f\u0131rdan ba\u015flayarak, Docker&#8217;\u0131 ve otomasyon betiklerini temel seviyede anlayacak, kendi otomatik da\u011f\u0131t\u0131m beti\u011finizi olu\u015fturacak ve hatta ileri d\u00fczey ipu\u00e7lar\u0131yla bilginizi peki\u015ftireceksiniz. Haz\u0131rsan\u0131z, uygulama da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi d\u00f6n\u00fc\u015ft\u00fcrmeye ba\u015flayal\u0131m!<\/p>\n<h2>Temel Kavramlar: Docker ve Betik Tabanl\u0131 Otomasyon Nedir?<\/h2>\n<p>Otomatik Docker da\u011f\u0131t\u0131m betikleri olu\u015fturmaya ba\u015flamadan \u00f6nce, temel ta\u015flar\u0131 iyi anlamak kritik \u00f6neme sahiptir. Bu b\u00f6l\u00fcmde, Docker&#8217;\u0131n ne oldu\u011funu ve neden bu kadar pop\u00fcler oldu\u011funu, otomasyon betiklerinin genel mant\u0131\u011f\u0131n\u0131 ve bu yolculu\u011fa ba\u015flamak i\u00e7in hangi temel gereksinimlere ihtiya\u00e7 duydu\u011fumuzu ele alaca\u011f\u0131z. Bu kavramlar\u0131 sa\u011flam bir \u015fekilde kavrad\u0131\u011f\u0131n\u0131zda, karma\u015f\u0131k g\u00f6r\u00fcnen s\u00fcre\u00e7lerin asl\u0131nda ne kadar mant\u0131kl\u0131 oldu\u011funu g\u00f6receksiniz.<\/p>\n<h3>Docker Nedir ve Neden Kullan\u0131l\u0131r?<\/h3>\n<p>Docker, uygulamalar\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 izole edilmi\u015f, hafif ve ta\u015f\u0131nabilir birimler olan &#8220;konteynerler&#8221; i\u00e7inde paketlemeyi sa\u011flayan a\u00e7\u0131k kaynakl\u0131 bir platformdur. Geleneksel sanal makinelerden (VM) farkl\u0131 olarak, Docker konteynerleri i\u015fletim sistemi kernelini payla\u015f\u0131r ve bu sayede \u00e7ok daha h\u0131zl\u0131 ba\u015flar, daha az kaynak t\u00fcketir ve daha verimlidir. Bir Docker konteyneri, uygulaman\u0131z\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gereken t\u00fcm kodlar\u0131, \u00e7al\u0131\u015fma zaman\u0131n\u0131, sistem ara\u00e7lar\u0131n\u0131, sistem k\u00fct\u00fcphanelerini ve ayarlar\u0131 i\u00e7erir. Bu, geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 aras\u0131nda tutarl\u0131l\u0131k sa\u011flamak i\u00e7in kritik bir \u00f6zelliktir. Art\u0131k &#8220;benim makinemde \u00e7al\u0131\u015f\u0131yordu&#8221; gibi sorunlarla kar\u015f\u0131la\u015fma olas\u0131l\u0131\u011f\u0131n\u0131z minimuma iner.<\/p>\n<p>Docker&#8217;\u0131n temelini olu\u015fturan iki ana bile\u015fen vard\u0131r: Docker \u0130majlar\u0131 ve Docker Konteynerleri. Docker \u0130maj\u0131, bir uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gerekli her \u015feyi i\u00e7eren statik, salt okunur bir \u015fablondur. Bir imaj, bir veya daha fazla konteyneri ba\u015flatmak i\u00e7in kullan\u0131lan bir &#8220;yap\u0131 plan\u0131&#8221; gibidir. Docker Konteyneri ise bu imaj\u0131n \u00e7al\u0131\u015fan bir \u00f6rne\u011fidir. \u0130majlar bir kez olu\u015fturulur ve y\u00fczlerce kez \u00e7al\u0131\u015ft\u0131r\u0131labilir. Bu izolasyon ve ta\u015f\u0131nabilirlik \u00f6zellikleri, modern yaz\u0131l\u0131m geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinin vazge\u00e7ilmez bir par\u00e7as\u0131 haline gelmi\u015ftir. Docker sayesinde, uygulamalar\u0131n\u0131z\u0131 herhangi bir bulut sa\u011flay\u0131c\u0131s\u0131nda, yerel sunucunuzda veya geli\u015ftirme ortam\u0131n\u0131zda ayn\u0131 tutarl\u0131l\u0131kla \u00e7al\u0131\u015ft\u0131rabilirsiniz. Uygulama da\u011f\u0131t\u0131m\u0131 art\u0131k karma\u015f\u0131k ba\u011f\u0131ml\u0131l\u0131k sorunlar\u0131yla u\u011fra\u015fmak yerine, standart bir format \u00fczerinden \u00e7ok daha basit hale gelir.<\/p>\n<h3>Otomasyon Betikleri Ne \u0130\u015fe Yarar?<\/h3>\n<p>Otomasyon betikleri, belirli g\u00f6revleri otomatik olarak ger\u00e7ekle\u015ftirmek i\u00e7in yaz\u0131lan komut dizileridir. Genellikle Shell betikleri (Bash, Zsh gibi) veya Python gibi betik dilleriyle olu\u015fturulurlar. Bu betikler, tekrarlayan ve zaman al\u0131c\u0131 manuel g\u00f6revleri ortadan kald\u0131rarak yaz\u0131l\u0131m geli\u015ftirme ya\u015fam d\u00f6ng\u00fcs\u00fcne muazzam bir de\u011fer katarlar. Uygulama derleme, test \u00e7al\u0131\u015ft\u0131rma, sunuculara dosya kopyalama, hizmetleri yeniden ba\u015flatma ve tabii ki uygulama da\u011f\u0131t\u0131m\u0131 gibi bir\u00e7ok alanda kullan\u0131labilirler. Bir kez do\u011fru \u015fekilde yaz\u0131ld\u0131\u011f\u0131nda, bir otomasyon beti\u011fi her seferinde ayn\u0131 ad\u0131mlar\u0131, ayn\u0131 tutarl\u0131l\u0131kla ve insan hatas\u0131 riski olmadan ger\u00e7ekle\u015ftirir.<\/p>\n<p>\u00d6rne\u011fin, bir uygulaman\u0131n Docker imaj\u0131n\u0131 olu\u015fturmak, bu imaj\u0131 bir kay\u0131t defterine g\u00f6ndermek, mevcut konteyneri durdurup kald\u0131rmak ve yeni bir konteyneri ba\u015flatmak gibi ad\u0131mlar, elle yap\u0131ld\u0131\u011f\u0131nda her biri ayr\u0131 ayr\u0131 komutlarla girilir. Bu s\u00fcre\u00e7te bir yaz\u0131m hatas\u0131 veya unutulan bir ad\u0131m, da\u011f\u0131t\u0131m\u0131n ba\u015far\u0131s\u0131z olmas\u0131na yol a\u00e7abilir. Ancak t\u00fcm bu ad\u0131mlar\u0131 tek bir betik alt\u0131nda toplad\u0131\u011f\u0131n\u0131zda, tek bir komutla t\u00fcm s\u00fcreci tetikleyebilir ve sonu\u00e7tan emin olabilirsiniz. Bu, hem zaman tasarrufu sa\u011flar hem de da\u011f\u0131t\u0131m\u0131n g\u00fcvenilirli\u011fini art\u0131r\u0131r. Ayr\u0131ca, betikler s\u00fcr\u00fcm kontrol sistemlerinde (Git gibi) saklanabilir, bu da de\u011fi\u015fikliklerin izlenebilir olmas\u0131n\u0131 ve ekip \u00fcyeleri aras\u0131nda kolayca payla\u015f\u0131lmas\u0131n\u0131 sa\u011flar. Bu sayede, DevOps prensiplerinin temelini olu\u015fturan &#8220;kod olarak altyap\u0131&#8221; yakla\u015f\u0131m\u0131na da yakla\u015fm\u0131\u015f olursunuz.<\/p>\n<h3>Gereksinimler: Ba\u015flamak \u0130\u00e7in Ne Laz\u0131m?<\/h3>\n<p>Bu rehberdeki ad\u0131mlar\u0131 takip etmek i\u00e7in birka\u00e7 temel \u015feye ihtiyac\u0131n\u0131z olacak:<\/p>\n<ul>\n<li><strong>Docker Engine veya Docker Desktop:<\/strong> Docker konteynerlerini yerel makinenizde \u00e7al\u0131\u015ft\u0131rabilmeniz i\u00e7in bu ara\u00e7lardan birinin kurulu olmas\u0131 gerekmektedir. E\u011fer Linux kullan\u0131yorsan\u0131z Docker Engine, macOS veya Windows kullan\u0131yorsan\u0131z Docker Desktop tercih edebilirsiniz.<\/li>\n<li><strong>Bir Metin D\u00fczenleyici\/IDE:<\/strong> Kod ve betik dosyalar\u0131n\u0131 yazmak i\u00e7in Visual Studio Code, Sublime Text, Atom gibi bir metin d\u00fczenleyiciye veya IDE&#8217;ye ihtiyac\u0131n\u0131z olacak. Bu ara\u00e7lar, s\u00f6zdizimi vurgulama ve otomasyon \u00f6zellikleri ile i\u015finizi kolayla\u015ft\u0131racakt\u0131r.<\/li>\n<li><strong>Temel Komut Sat\u0131r\u0131 (CLI) Bilgisi:<\/strong> Linux\/Unix tabanl\u0131 sistemlerde kullan\u0131lan <code>cd<\/code>, <code>ls<\/code>, <code>mkdir<\/code>, <code>echo<\/code> gibi temel komutlara ve Shell betikleri \u00e7al\u0131\u015ft\u0131rmaya a\u015fina olman\u0131z beklenmektedir. Bu, betiklerle daha rahat \u00e7al\u0131\u015fman\u0131z\u0131 sa\u011flayacakt\u0131r.<\/li>\n<li><strong>Biraz Sab\u0131r ve \u00d6\u011frenme \u0130ste\u011fi:<\/strong> Yeni bir teknolojiye adapte olmak zaman ve \u00e7aba gerektirir. Kar\u015f\u0131la\u015faca\u011f\u0131n\u0131z sorunlara kar\u015f\u0131 sab\u0131rl\u0131 olun ve her hatay\u0131 bir \u00f6\u011frenme f\u0131rsat\u0131 olarak g\u00f6r\u00fcn.<\/li>\n<\/ul>\n<p>Bu gereksinimleri kar\u015f\u0131lad\u0131\u011f\u0131n\u0131z s\u00fcrece, otomatik Docker da\u011f\u0131t\u0131m betikleri olu\u015fturma yolculu\u011funa haz\u0131rs\u0131n\u0131z demektir. Unutmay\u0131n, pratik yapmak en iyi \u00f6\u011frenme y\u00f6ntemidir.<\/p>\n<h2>Ad\u0131m Ad\u0131m \u0130lk Docker Uygulaman\u0131z\u0131 Haz\u0131rlama: Bir \u00d6rnek Uygulama<\/h2>\n<p>Otomatik da\u011f\u0131t\u0131m beti\u011fi olu\u015fturmaya ba\u015flamadan \u00f6nce, da\u011f\u0131taca\u011f\u0131m\u0131z bir Docker uygulamas\u0131n\u0131 haz\u0131r etmemiz gerekiyor. Bu b\u00f6l\u00fcmde, basit bir Python Flask web uygulamas\u0131n\u0131 ele alaca\u011f\u0131z, bu uygulamay\u0131 bir Docker imaj\u0131na d\u00f6n\u00fc\u015ft\u00fcrecek bir Dockerfile yazacak ve son olarak imaj\u0131 derleyip bir konteyner i\u00e7inde nas\u0131l \u00e7al\u0131\u015ft\u0131raca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m g\u00f6rece\u011fiz. Bu pratik \u00f6rnek, Docker&#8217;\u0131n temel i\u015fleyi\u015fini anlaman\u0131za yard\u0131mc\u0131 olacak ve sonraki ad\u0131mlarda otomasyon betiklerini in\u015fa etmek i\u00e7in sa\u011flam bir zemin olu\u015fturacakt\u0131r.<\/p>\n<h3>Basit Bir Web Uygulamas\u0131 Olu\u015fturma (Python\/Flask \u00d6rne\u011fi)<\/h3>\n<p>\u00d6ncelikle, da\u011f\u0131tmak istedi\u011fimiz \u00e7ok basit bir web uygulamas\u0131 olu\u015ftural\u0131m. Bu \u00f6rnek i\u00e7in Python ve Flask framework&#8217;\u00fcn\u00fc kullanaca\u011f\u0131z, ancak bu konseptler herhangi bir programlama dili veya framework ile kolayca uyarlanabilir. \u00c7al\u0131\u015fma dizininizde <code>my-docker-app<\/code> ad\u0131nda bir klas\u00f6r olu\u015fturun ve i\u00e7ine a\u015fa\u011f\u0131daki iki dosyay\u0131 ekleyin:<\/p>\n<p><strong><code>app.py<\/code> dosyas\u0131:<\/strong><\/p>\n<pre><code>\nfrom flask import Flask\n\napp = Flask(__name__)\n\n@app.route(\"\/\")\ndef hello():\n    return \"<h1>Merhaba Docker D\u00fcnyas\u0131!<\/h1><p>Uygulamam\u0131z sorunsuz \u00e7al\u0131\u015f\u0131yor.<\/p>\"\n\nif __name__ == \"__main__\":\n    app.run(host=\"0.0.0.0\", port=5000)\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu Python kodu, Flask kullanarak 5000 numaral\u0131 portta \u00e7al\u0131\u015fan basit bir web sunucusu olu\u015fturur. Ana sayfaya yap\u0131lan bir istekte \"Merhaba Docker D\u00fcnyas\u0131!\" mesaj\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr.<\/p>\n<p><strong><code>requirements.txt<\/code> dosyas\u0131:<\/strong><\/p>\n<pre><code>\nFlask==2.0.2\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu dosya, Python uygulamas\u0131n\u0131n ihtiya\u00e7 duydu\u011fu ba\u011f\u0131ml\u0131l\u0131klar\u0131 (bu durumda sadece Flask) listeler. Docker, bu dosyay\u0131 kullanarak konteyner i\u00e7inde gerekli k\u00fct\u00fcphaneleri kuracakt\u0131r.<\/p>\n<p>Bu iki dosya, uygulaman\u0131z\u0131n temelini olu\u015fturur. \u015eimdi bu uygulamay\u0131 Dockerize etme zaman\u0131.<\/p>\n<h3>Dockerfile Yaz\u0131m\u0131: Uygulaman\u0131z\u0131 Kapsay\u0131c\u0131 Hale Getirme<\/h3>\n<p>Uygulaman\u0131z\u0131 bir Docker imaj\u0131na d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in bir <code>Dockerfile<\/code> olu\u015fturman\u0131z gerekir. Bu dosya, Docker'\u0131n imaj\u0131 nas\u0131l olu\u015fturaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m anlatan bir talimat listesidir. <code>app.py<\/code> ve <code>requirements.txt<\/code> dosyalar\u0131n\u0131n bulundu\u011fu dizine <code>Dockerfile<\/code> ad\u0131nda bir dosya olu\u015fturun ve i\u00e7ine a\u015fa\u011f\u0131daki i\u00e7eri\u011fi ekleyin:<\/p>\n<pre><code>\n# Python 3.9 tabanl\u0131 resmi bir imaj\u0131 ba\u015flang\u0131\u00e7 noktas\u0131 olarak kullan\nFROM python:3.9-slim-buster\n\n# \u00c7al\u0131\u015fma dizinini \/app olarak ayarla\nWORKDIR \/app\n\n# requirements.txt dosyas\u0131n\u0131 \u00e7al\u0131\u015fma dizinine kopyala\nCOPY requirements.txt .\n\n# Gerekli Python ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00fckle\nRUN pip install -r requirements.txt\n\n# Uygulama kodunu \u00e7al\u0131\u015fma dizinine kopyala\nCOPY . .\n\n# Uygulaman\u0131n 5000 numaral\u0131 portu kullanaca\u011f\u0131n\u0131 Docker'a bildir\nEXPOSE 5000\n\n# Konteyner ba\u015flat\u0131ld\u0131\u011f\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131lacak komut\nCMD [\"python\", \"app.py\"]\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu <code>Dockerfile<\/code> a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 ger\u00e7ekle\u015ftirir:<\/p>\n<ul>\n<li><code>FROM python:3.9-slim-buster<\/code>: Python 3.9'un hafif bir s\u00fcr\u00fcm\u00fcn\u00fc i\u00e7eren resmi Docker imaj\u0131n\u0131 temel al\u0131r. Bu, imaj boyutunu k\u00fc\u00e7\u00fck tutar.<\/li>\n<li><code>WORKDIR \/app<\/code>: Konteyner i\u00e7inde \u00e7al\u0131\u015faca\u011f\u0131m\u0131z dizini <code>\/app<\/code> olarak belirler. Sonraki t\u00fcm komutlar bu dizin i\u00e7inde y\u00fcr\u00fct\u00fcl\u00fcr.<\/li>\n<li><code>COPY requirements.txt .<\/code>: Yerel <code>requirements.txt<\/code> dosyas\u0131n\u0131 konteynerin <code>\/app<\/code> dizinine kopyalar.<\/li>\n<li><code>RUN pip install -r requirements.txt<\/code>: Kopyalanan <code>requirements.txt<\/code> dosyas\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckler.<\/li>\n<li><code>COPY . .<\/code>: Uygulaman\u0131z\u0131n t\u00fcm kodunu (bu durumda <code>app.py<\/code>) konteynerin <code>\/app<\/code> dizinine kopyalar.<\/li>\n<li><code>EXPOSE 5000<\/code>: Uygulaman\u0131n 5000 numaral\u0131 port \u00fczerinden hizmet verece\u011fini belirtir. Bu sadece bir dok\u00fcmantasyondur, ger\u00e7ek port e\u015flemesini <code>docker run<\/code> komutuyla yapar\u0131z.<\/li>\n<li><code>CMD [\"python\", \"app.py\"]<\/code>: Konteyner ba\u015flat\u0131ld\u0131\u011f\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131lacak ana komutu tan\u0131mlar. Bu, Flask uygulaman\u0131z\u0131 ba\u015flat\u0131r.<\/li>\n<\/ul>\n<p>Ayr\u0131ca, gereksiz dosyalar\u0131n (\u00f6rne\u011fin <code>.git<\/code> klas\u00f6r\u00fc, <code>__pycache__<\/code>) Docker imaj\u0131na kopyalanmas\u0131n\u0131 engellemek i\u00e7in <code>Dockerfile<\/code> ile ayn\u0131 dizine bir <code>.dockerignore<\/code> dosyas\u0131 ekleyebilirsiniz. Bu, imaj boyutunu optimize eder ve g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 azalt\u0131r. \u00d6rne\u011fin:<\/p>\n<pre><code>\n.git\n__pycache__\/\n*.pyc\n*.log\n.vscode\/\n  <\/pre>\n<p><\/code><\/p>\n<h3>Docker \u0130maj\u0131 Olu\u015fturma ve \u00c7al\u0131\u015ft\u0131rma<\/h3>\n<p>\u015eimdi <code>Dockerfile<\/code>'\u0131 kullanarak bir Docker imaj\u0131 olu\u015ftural\u0131m ve uygulamam\u0131z\u0131 bir konteyner i\u00e7inde \u00e7al\u0131\u015ft\u0131ral\u0131m. Komut sat\u0131r\u0131n\u0131z\u0131 a\u00e7\u0131n ve <code>Dockerfile<\/code> ile <code>app.py<\/code> dosyalar\u0131n\u0131n bulundu\u011fu <code>my-docker-app<\/code> dizinine gidin.<\/p>\n<ol>\n<li><strong>Docker \u0130maj\u0131n\u0131 Olu\u015fturma:<\/strong>\n<p>A\u015fa\u011f\u0131daki komutla imaj\u0131n\u0131z\u0131 derleyin. <code>-t<\/code> parametresi imaja bir etiket (isim ve iste\u011fe ba\u011fl\u0131 s\u00fcr\u00fcm) verir. <code>.<\/code> ise Dockerfile'\u0131n mevcut dizinde oldu\u011funu belirtir.<\/p>\n<pre><code>\ndocker build -t my-flask-app:1.0 .\n      <\/pre>\n<p><\/code><\/p>\n<p>Bu komut \u00e7al\u0131\u015ft\u0131ktan sonra, t\u00fcm ad\u0131mlar\u0131 tek tek g\u00f6receksiniz. \u0130\u015flem tamamland\u0131\u011f\u0131nda, <code>my-flask-app:1.0<\/code> ad\u0131nda yeni bir Docker imaj\u0131n\u0131z olacak.<\/p>\n<\/li>\n<li><strong>Docker Konteynerini \u00c7al\u0131\u015ft\u0131rma:<\/strong>\n<p>\u0130majdan bir konteyner ba\u015flatmak i\u00e7in a\u015fa\u011f\u0131daki komutu kullan\u0131n:<\/p>\n<pre><code>\ndocker run -d -p 5000:5000 --name my-running-app my-flask-app:1.0\n      <\/pre>\n<p><\/code><\/p>\n<ul>\n<li><code>-d<\/code>: Konteyneri arka planda (detached mode) \u00e7al\u0131\u015ft\u0131r\u0131r.<\/li>\n<li><code>-p 5000:5000<\/code>: Konteynerin 5000 numaral\u0131 portunu yerel makinenizin 5000 numaral\u0131 portuna e\u015fler. B\u00f6ylece uygulaman\u0131za taray\u0131c\u0131n\u0131zdan eri\u015febilirsiniz.<\/li>\n<li><code>--name my-running-app<\/code>: Konteynera okunabilir bir isim verir.<\/li>\n<li><code>my-flask-app:1.0<\/code>: Hangi imaj\u0131n kullan\u0131laca\u011f\u0131n\u0131 belirtir.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Uygulamay\u0131 Kontrol Etme:<\/strong>\n<p>Taray\u0131c\u0131n\u0131z\u0131 a\u00e7\u0131n ve <a href=\"http:\/\/localhost:5000\" target=\"_blank\">http:\/\/localhost:5000<\/a> adresine gidin. \"Merhaba Docker D\u00fcnyas\u0131!\" mesaj\u0131n\u0131 g\u00f6rmelisiniz. Bu, uygulaman\u0131z\u0131n Docker konteyneri i\u00e7inde ba\u015far\u0131yla \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6sterir.<\/p>\n<\/li>\n<\/ol>\n<p>Tebrikler! \u0130lk Docker uygulaman\u0131z\u0131 ba\u015far\u0131yla haz\u0131rlad\u0131n\u0131z ve \u00e7al\u0131\u015ft\u0131rd\u0131n\u0131z. Art\u0131k bu ad\u0131mlar\u0131 otomatikle\u015ftirecek bir betik olu\u015fturmaya haz\u0131r\u0131z.<\/p>\n<h2>Otomatik Da\u011f\u0131t\u0131m Beti\u011fi Olu\u015fturma: \u0130lk Ad\u0131mlar\u0131n\u0131z Neler Olmal\u0131?<\/h2>\n<p>\u00d6nceki b\u00f6l\u00fcmde Docker uygulaman\u0131z\u0131 manuel olarak haz\u0131rlay\u0131p \u00e7al\u0131\u015ft\u0131rd\u0131n\u0131z. Ancak her de\u011fi\u015fiklikte bu komutlar\u0131 tek tek girmek hem s\u0131k\u0131c\u0131 hem de hataya a\u00e7\u0131k bir s\u00fcre\u00e7tir. \u0130\u015fte bu noktada otomasyon betikleri devreye giriyor. Bu b\u00f6l\u00fcmde, t\u00fcm bu ad\u0131mlar\u0131 tek bir \u00e7al\u0131\u015ft\u0131r\u0131labilir dosyada toplayacak basit bir Shell beti\u011fi olu\u015fturaca\u011f\u0131z. Bu betik, Docker imaj\u0131n\u0131z\u0131 derleyecek, eski konteyneri durdurup kald\u0131racak ve uygulaman\u0131z\u0131n yeni s\u00fcr\u00fcm\u00fcn\u00fc sorunsuz bir \u015fekilde ba\u015flatacakt\u0131r.<\/p>\n<h3>Neden Bir Betik Yazmal\u0131y\u0131z?<\/h3>\n<p>Manuel da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinin birka\u00e7 temel dezavantaj\u0131 vard\u0131r:<\/p>\n<ul>\n<li><strong>\u0130nsan Hatas\u0131 Riski:<\/strong> Komutlar\u0131 elle girerken yap\u0131lan k\u00fc\u00e7\u00fck bir yaz\u0131m hatas\u0131 veya unutulan bir parametre, da\u011f\u0131t\u0131m\u0131n ba\u015far\u0131s\u0131z olmas\u0131na yol a\u00e7abilir.<\/li>\n<li><strong>Tekrarlanabilirlik Eksikli\u011fi:<\/strong> Her da\u011f\u0131t\u0131m, farkl\u0131 bir ki\u015fi taraf\u0131ndan veya farkl\u0131 bir s\u0131rayla yap\u0131ld\u0131\u011f\u0131nda, sonu\u00e7lar tutarl\u0131 olmayabilir.<\/li>\n<li><strong>Zaman Kayb\u0131:<\/strong> Her seferinde ayn\u0131 uzun komut dizilerini yazmak veya kopyalay\u0131p yap\u0131\u015ft\u0131rmak \u00f6nemli bir zaman kayb\u0131na neden olur.<\/li>\n<li><strong>Bilgi Silosu:<\/strong> Da\u011f\u0131t\u0131m s\u00fcreci hakk\u0131nda bilgi, sadece onu yapan ki\u015finin zihninde kalabilir, bu da ekip i\u00e7inde payla\u015f\u0131m\u0131 zorla\u015ft\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Bir da\u011f\u0131t\u0131m beti\u011fi yazarak bu sorunlar\u0131n \u00fcstesinden gelebiliriz. Betik, t\u00fcm ad\u0131mlar\u0131 \u00f6nceden tan\u0131mlanm\u0131\u015f bir s\u0131rayla ve hatas\u0131z bir \u015fekilde ger\u00e7ekle\u015ftiren \"tek kaynakl\u0131 bir do\u011fruluk\" sa\u011flar. Bu, \u00f6zellikle s\u00fcrekli entegrasyon\/s\u00fcrekli teslimat (CI\/CD) boru hatlar\u0131na entegrasyon i\u00e7in hayati \u00f6nem ta\u015f\u0131r, \u00e7\u00fcnk\u00fc otomatik sistemler her zaman ayn\u0131 beti\u011fi kullanarak tutarl\u0131 sonu\u00e7lar elde edebilirler.<\/p>\n<h3>Beti\u011fin Temel Yap\u0131s\u0131: Shell Script \u00d6rne\u011fi<\/h3>\n<p>\u015eimdi <code>my-docker-app<\/code> dizininizin k\u00f6k\u00fcnde <code>deploy.sh<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m ve i\u00e7ine a\u015fa\u011f\u0131daki Shell beti\u011fini ekleyelim. Bu betik, daha \u00f6nce manuel olarak yapt\u0131\u011f\u0131n\u0131z ad\u0131mlar\u0131 otomatikle\u015ftirecektir:<\/p>\n<pre><code>\n#!\/bin\/bash\n\n# Hata durumunda beti\u011fi durdur\nset -e\n\n# Uygulaman\u0131n ad\u0131 ve versiyonu\nAPP_NAME=my-flask-app\nAPP_VERSION=1.0 # \u0130leride bunu dinamik hale getirebiliriz\nCONTAINER_NAME=my-running-app\nPORT=5000\n\necho \"[ADIM 1\/4] Docker imaj\u0131 olu\u015fturuluyor...\"\ndocker build -t ${APP_NAME}:${APP_VERSION} .\n\necho \"[ADIM 2\/4] Mevcut konteyner kontrol ediliyor ve durduruluyor (varsa)...\"\n# Konteynerin var olup olmad\u0131\u011f\u0131n\u0131 kontrol et\nif docker ps -a --format &#39;{{.Names}}&#39; | grep -q ${CONTAINER_NAME}; then\n    echo \"Mevcut &#39;${CONTAINER_NAME}&#39; konteyneri bulunuyor. Durduruluyor ve kald\u0131r\u0131l\u0131yor...\"\n    docker stop ${CONTAINER_NAME}\n    docker rm ${CONTAINER_NAME}\nelse\n    echo \"Mevcut &#39;${CONTAINER_NAME}&#39; konteyneri bulunamad\u0131.\"\nfi\n\necho \"[ADIM 3\/4] Yeni Docker konteyneri ba\u015flat\u0131l\u0131yor...\"\ndocker run -d -p ${PORT}:${PORT} --name ${CONTAINER_NAME} ${APP_NAME}:${APP_VERSION}\n\necho \"[ADIM 4\/4] Uygulama da\u011f\u0131t\u0131m\u0131 tamamland\u0131! Kontrol etmek i\u00e7in: http:\/\/localhost:${PORT}\"\n\necho \"\u00c7al\u0131\u015fan Docker konteynerleri:\"\ndocker ps\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu betikteki \u00f6nemli noktalar:<\/p>\n<ul>\n<li><code>#!\/bin\/bash<\/code>: Beti\u011fin hangi Shell yorumlay\u0131c\u0131s\u0131 ile \u00e7al\u0131\u015ft\u0131r\u0131laca\u011f\u0131n\u0131 belirtir.<\/li>\n<li><code>set -e<\/code>: Bu komut, betik i\u00e7indeki herhangi bir komut hata verdi\u011finde (s\u0131f\u0131rdan farkl\u0131 bir \u00e7\u0131k\u0131\u015f kodu d\u00f6nd\u00fcrd\u00fc\u011f\u00fcnde) beti\u011fin derhal durmas\u0131n\u0131 sa\u011flar. Bu, da\u011f\u0131t\u0131m s\u00fcrecinde bir hata olu\u015ftu\u011funda beti\u011fin tutars\u0131z bir durumda devam etmesini engeller.<\/li>\n<li>De\u011fi\u015fkenler: <code>APP_NAME<\/code>, <code>APP_VERSION<\/code>, <code>CONTAINER_NAME<\/code>, <code>PORT<\/code> gibi de\u011fi\u015fkenler kullanarak beti\u011fi daha okunabilir ve y\u00f6netilebilir hale getirdik. De\u011fi\u015fiklik yapmak istedi\u011finizde sadece bu de\u011fi\u015fkenleri g\u00fcncellemeniz yeterlidir.<\/li>\n<li>Mevcut Konteyner Y\u00f6netimi: <code>docker ps -a<\/code> komutuyla mevcut konteynerin var olup olmad\u0131\u011f\u0131n\u0131 kontrol ederiz. E\u011fer ayn\u0131 isimde bir konteyner \u00e7al\u0131\u015f\u0131yorsa veya durdurulmu\u015f bir \u015fekilde varsa, <code>docker stop<\/code> ile durdurup <code>docker rm<\/code> ile kald\u0131r\u0131r\u0131z. Bu, yeni s\u00fcr\u00fcm\u00fc sorunsuz bir \u015fekilde da\u011f\u0131tmak i\u00e7in eski s\u00fcr\u00fcm\u00fcn temizlenmesini sa\u011flar.<\/li>\n<li>Bilgilendirme Mesajlar\u0131: <code>echo<\/code> komutlar\u0131yla beti\u011fin hangi ad\u0131mda oldu\u011funu belirten mesajlar eklemek, s\u00fcreci takip etmeyi kolayla\u015ft\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Beti\u011fi \u00e7al\u0131\u015ft\u0131r\u0131labilir yapmak i\u00e7in \u015fu komutu kullan\u0131n:<\/p>\n<pre><code>\nchmod +x deploy.sh\n  <\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi beti\u011fi \u00e7al\u0131\u015ft\u0131rabilirsiniz:<\/p>\n<pre><code>\n.\/deploy.sh\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu komut, t\u00fcm da\u011f\u0131t\u0131m s\u00fcrecini otomatik olarak ba\u015flatacak ve uygulaman\u0131z\u0131n g\u00fcncel s\u00fcr\u00fcm\u00fcn\u00fc \u00e7al\u0131\u015f\u0131r duruma getirecektir. Taray\u0131c\u0131n\u0131zdan <a href=\"http:\/\/localhost:5000\" target=\"_blank\">http:\/\/localhost:5000<\/a> adresini kontrol ederek uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olabilirsiniz.<\/p>\n<div class=\"interactive-tip\">\n    Uzman \u0130pucu: Da\u011f\u0131t\u0131m betiklerinizde her zaman <code>set -e<\/code> kullanmaya \u00f6zen g\u00f6sterin. Bu, beklenmedik hatalar\u0131n t\u00fcm da\u011f\u0131t\u0131m s\u00fcrecini bozmas\u0131n\u0131 engeller ve daha g\u00fcvenilir otomasyon sa\u011flar. Ayr\u0131ca, betiklerinizi <code>git<\/code> gibi s\u00fcr\u00fcm kontrol sistemlerinde saklayarak de\u011fi\u015fiklikleri takip edebilir ve ekibinizle kolayca payla\u015fabilirsiniz.\n  <\/div>\n<h3>Ortam De\u011fi\u015fkenleri ve G\u00fcvenlik: Hassas Bilgileri Nas\u0131l Y\u00f6netiriz?<\/h3>\n<p>Yukar\u0131daki beti\u011fimizde baz\u0131 bilgileri (uygulama ad\u0131, port) do\u011frudan beti\u011fin i\u00e7ine yazd\u0131k. Ancak veritaban\u0131 \u015fifreleri, API anahtarlar\u0131 veya di\u011fer hassas bilgiler gibi kritik veriler s\u00f6z konusu oldu\u011funda, bunlar\u0131 do\u011frudan betik i\u00e7ine yazmak veya s\u00fcr\u00fcm kontrol sistemine y\u00fcklemek ciddi bir g\u00fcvenlik riski olu\u015fturur. Bu t\u00fcr bilgileri y\u00f6netmenin en iyi yolu, ortam de\u011fi\u015fkenlerini veya \u00f6zel gizli y\u00f6netim ara\u00e7lar\u0131n\u0131 kullanmakt\u0131r.<\/p>\n<p><strong>Ortam De\u011fi\u015fkenleri Kullan\u0131m\u0131:<\/strong><\/p>\n<p>Da\u011f\u0131t\u0131m betiklerinizde hassas bilgileri ortam de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla sa\u011flamak olduk\u00e7a yayg\u0131n ve g\u00fcvenli bir y\u00f6ntemdir. \u00d6rne\u011fin, <code>deploy.sh<\/code> beti\u011finizden \u00f6nce <code>export DB_PASSWORD=\"secret\"<\/code> gibi bir komutla ortam de\u011fi\u015fkenini ayarlayabilir, ard\u0131ndan betik i\u00e7inde <code>$DB_PASSWORD<\/code> olarak bu de\u011fere eri\u015febilirsiniz. Daha d\u00fczenli bir yakla\u015f\u0131m i\u00e7in, <code>.env<\/code> ad\u0131nda bir dosya olu\u015fturup i\u00e7ine de\u011fi\u015fkenlerinizi yazabilirsiniz:<\/p>\n<p><strong><code>.env<\/code> dosyas\u0131:<\/strong><\/p>\n<pre><code>\nDB_PASSWORD=cokgizlisifrem\nAPI_KEY=benim-api-anahtarim-123\n  <\/pre>\n<p><\/code><\/p>\n<p>Daha sonra <code>deploy.sh<\/code> beti\u011finizde bu <code>.env<\/code> dosyas\u0131n\u0131 kaynak olarak g\u00f6sterebilirsiniz:<\/p>\n<pre><code>\n#!\/bin\/bash\nset -e\n\n# .env dosyas\u0131n\u0131 oku ve ortam de\u011fi\u015fkenlerini y\u00fckle (varsa)\nif [ -f .env ]; then\n    source .env\nfi\n\n# \u00d6rnek kullan\u0131m\necho \"Veritaban\u0131 \u015fifresi: ${DB_PASSWORD}\"\necho \"API anahtar\u0131: ${API_KEY}\"\n\n# ... da\u011f\u0131t\u0131m komutlar\u0131 devam eder ...\n  <\/pre>\n<p><\/code><\/p>\n<p><strong>\u00d6nemli Not:<\/strong> <code>.env<\/code> dosyas\u0131n\u0131 asla s\u00fcr\u00fcm kontrol sisteminize (Git) dahil etmeyin! Bu dosyay\u0131 <code>.gitignore<\/code>'a ekleyerek hassas bilgilerin yanl\u0131\u015fl\u0131kla herkese a\u00e7\u0131k hale gelmesini engelleyin. Ortam de\u011fi\u015fkenleri, CI\/CD ara\u00e7lar\u0131 taraf\u0131ndan veya sunucuda el ile ayarlanarak g\u00fcvenli bir \u015fekilde sa\u011flanabilir. Bu y\u00f6ntem, betiklerinizin esnekli\u011fini art\u0131r\u0131rken, g\u00fcvenlik standartlar\u0131n\u0131 da y\u00fckseltir.<\/p>\n<h2>Geli\u015fmi\u015f Da\u011f\u0131t\u0131m Senaryolar\u0131 ve En \u0130yi Uygulamalar: Beti\u011finizi G\u00fc\u00e7lendirin<\/h2>\n<p>Basit bir Docker uygulamas\u0131n\u0131 otomatikle\u015ftirmeyi \u00f6\u011frendiniz. Ancak ger\u00e7ek d\u00fcnya uygulamalar\u0131 genellikle birden fazla servisten olu\u015fur (web sunucusu, veritaban\u0131, \u00f6nbellek gibi) ve daha karma\u015f\u0131k da\u011f\u0131t\u0131m senaryolar\u0131 gerektirir. Bu b\u00f6l\u00fcmde, beti\u011finizi daha g\u00fc\u00e7l\u00fc hale getirecek geli\u015fmi\u015f teknikleri, en iyi uygulamalar\u0131 ve modern DevOps yakla\u015f\u0131mlar\u0131n\u0131 ke\u015ffedece\u011fiz. B\u00f6ylece sadece tek bir konteyneri de\u011fil, t\u00fcm uygulama y\u0131\u011f\u0131n\u0131n\u0131 etkili bir \u015fekilde y\u00f6netebileceksiniz.<\/p>\n<h3>Docker Compose ile \u00c7ok Kapsay\u0131c\u0131l\u0131 Uygulamalar\u0131 Y\u00f6netme<\/h3>\n<p>Tek bir konteyner da\u011f\u0131tmak kolayd\u0131r, ancak \u00e7o\u011fu modern uygulama genellikle birka\u00e7 farkl\u0131 servisten olu\u015fur. \u00d6rne\u011fin, bir web uygulamas\u0131 genellikle bir veritaban\u0131na, belki bir \u00f6nbellek sunucusuna ve hatta bir arka plan g\u00f6rev i\u015fleyicisine ihtiya\u00e7 duyar. Bu farkl\u0131 servislerin her birini ayr\u0131 Docker konteynerlerinde \u00e7al\u0131\u015ft\u0131rmak ve birbirleriyle ileti\u015fim kurmalar\u0131n\u0131 sa\u011flamak karma\u015f\u0131k olabilir. \u0130\u015fte bu noktada Docker Compose devreye girer.<\/p>\n<p>Docker Compose, \u00e7ok kapsay\u0131c\u0131l\u0131 Docker uygulamalar\u0131n\u0131 tan\u0131mlamak ve \u00e7al\u0131\u015ft\u0131rmak i\u00e7in bir ara\u00e7t\u0131r. Tek bir <code>docker-compose.yml<\/code> dosyas\u0131 kullanarak uygulaman\u0131z\u0131n t\u00fcm servislerini, a\u011flar\u0131n\u0131 ve depolama birimlerini yap\u0131land\u0131rabilirsiniz. Bu dosya, t\u00fcm uygulama y\u0131\u011f\u0131n\u0131n\u0131z\u0131n \"kod olarak altyap\u0131\" tan\u0131m\u0131n\u0131 i\u00e7erir. <code>docker-compose.yml<\/code> dosyas\u0131 genellikle uygulaman\u0131z\u0131n k\u00f6k dizininde bulunur ve YAML format\u0131nda yaz\u0131l\u0131r.<\/p>\n<p><strong>\u00d6rnek <code>docker-compose.yml<\/code> dosyas\u0131:<\/strong><\/p>\n<pre><code>\nversion: &#39;3.8&#39;\nservices:\n  web:\n    build: .\n    ports:\n      - \"5000:5000\"\n    volumes:\n      - .:\/app # Geli\u015ftirme i\u00e7in canl\u0131 kod e\u015fle\u015ftirme\n    environment:\n      FLASK_ENV: development\n    depends_on:\n      - db\n  db:\n    image: postgres:13\n    environment:\n      POSTGRES_DB: mydatabase\n      POSTGRES_USER: user\n      POSTGRES_PASSWORD: password\n    volumes:\n      - db_data:\/var\/lib\/postgresql\/data\n\nvolumes:\n  db_data:\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnek, bir Flask web uygulamas\u0131n\u0131 (<code>web<\/code> servisi) ve bir PostgreSQL veritaban\u0131n\u0131 (<code>db<\/code> servisi) tan\u0131mlar. Web servisi, mevcut dizindeki <code>Dockerfile<\/code>'dan olu\u015fturulur ve 5000 numaral\u0131 portu d\u0131\u015far\u0131ya a\u00e7ar. Veritaban\u0131 servisi ise resmi PostgreSQL imaj\u0131n\u0131 kullan\u0131r. <code>volumes<\/code> ve <code>environment<\/code> gibi b\u00f6l\u00fcmlerle depolama ve ortam de\u011fi\u015fkenlerini yap\u0131land\u0131rabilirsiniz. <code>depends_on<\/code> ile servisler aras\u0131 ba\u011f\u0131ml\u0131l\u0131klar\u0131 tan\u0131mlamak, servislerin do\u011fru s\u0131rada ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Da\u011f\u0131t\u0131m beti\u011finizi Docker Compose ile entegre etmek olduk\u00e7a basittir. Beti\u011finizde <code>docker build<\/code> ve <code>docker run<\/code> yerine, uygulaman\u0131z\u0131n k\u00f6k dizininde a\u015fa\u011f\u0131daki komutlar\u0131 kullan\u0131rs\u0131n\u0131z:<\/p>\n<pre><code>\n# Mevcut servisleri durdur ve kald\u0131r\ndocker-compose down\n\n# Servisleri olu\u015ftur ve arka planda \u00e7al\u0131\u015ft\u0131r\ndocker-compose up -d --build\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu komutlar, <code>docker-compose.yml<\/code> dosyan\u0131zdaki tan\u0131mlara g\u00f6re t\u00fcm servislerinizi derleyecek, eski konteynerleri kald\u0131racak ve yeni s\u00fcr\u00fcmleri ba\u015flatacakt\u0131r. Docker Compose'un kullan\u0131m\u0131, \u00f6zellikle \u00e7oklu servis mimarilerinde da\u011f\u0131t\u0131m s\u00fcrecini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir ve otomasyon betiklerinizin g\u00fcc\u00fcn\u00fc art\u0131r\u0131r.<\/p>\n<h3>S\u00fcr\u00fcm Kontrol\u00fc ve Etiketleme Stratejileri: Uygulamalar\u0131n\u0131z\u0131 Nas\u0131l Takip Edersiniz?<\/h3>\n<p>Otomatik da\u011f\u0131t\u0131m\u0131n en \u00f6nemli y\u00f6nlerinden biri, uygulaman\u0131z\u0131n farkl\u0131 s\u00fcr\u00fcmlerini etkili bir \u015fekilde y\u00f6netebilmektir. Docker imajlar\u0131n\u0131z\u0131 do\u011fru bir \u015fekilde etiketlemek, hangi imaj\u0131n hangi koda kar\u015f\u0131l\u0131k geldi\u011fini izlemenizi, sorunlu bir s\u00fcr\u00fcm\u00fc h\u0131zl\u0131ca geri alman\u0131z\u0131 (rollback) ve farkl\u0131 ortamlar i\u00e7in belirli s\u00fcr\u00fcmleri kullanman\u0131z\u0131 sa\u011flar. En iyi etiketleme uygulamalar\u0131 \u015funlar\u0131 i\u00e7erir:<\/p>\n<ul>\n<li><strong>Semantik Versiyonlama:<\/strong> <code>v1.0.0<\/code>, <code>v1.0.1<\/code>, <code>v2.0.0<\/code> gibi anlaml\u0131 s\u00fcr\u00fcm numaralar\u0131 kullan\u0131n. Bu, de\u011fi\u015fikliklerin t\u00fcr\u00fcn\u00fc (maj\u00f6r, min\u00f6r, yama) belirtir.<\/li>\n<li><strong>Git Commit Hash:<\/strong> Her Git commit'inin k\u0131sa hash'ini (\u00f6rn. <code>a1b2c3d<\/code>) etiket olarak kullanmak, imaj\u0131 do\u011frudan belirli bir kod s\u00fcr\u00fcm\u00fcne ba\u011flaman\u0131n en kesin yoludur. Bu, \u00f6zellikle hata ay\u0131klama ve denetlenebilirlik i\u00e7in \u00e7ok de\u011ferlidir.<\/li>\n<li><strong><code>latest<\/code> Etiketi:<\/strong> Genellikle en son kararl\u0131 s\u00fcr\u00fcm\u00fc i\u015faret etmek i\u00e7in kullan\u0131l\u0131r. Ancak \u00fcretim ortam\u0131nda belirli bir s\u00fcr\u00fcm etiketini kullanmak, <code>latest<\/code> etiketinin aniden de\u011fi\u015fme riskine kar\u015f\u0131 daha g\u00fcvenlidir.<\/li>\n<li><strong>Ortama \u00d6zel Etiketler:<\/strong> Geli\u015ftirme (<code>dev<\/code>), test (<code>test<\/code>), \u00fcretim (<code>prod<\/code>) gibi ortamlara \u00f6zel etiketler kullanmak, her ortam i\u00e7in uygun imaj\u0131n kullan\u0131lmas\u0131n\u0131 sa\u011flar.<\/li>\n<\/ul>\n<p>Da\u011f\u0131t\u0131m betiklerinizde, bu etiketleme stratejilerini dinamik olarak uygulayabilirsiniz. \u00d6rne\u011fin, Git commit hash'ini otomatik olarak al\u0131p Docker imaj\u0131 etiketinde kullanabilirsiniz:<\/p>\n<pre><code>\n#!\/bin\/bash\nset -e\n\nAPP_NAME=my-flask-app\nGIT_COMMIT_HASH=$(git rev-parse --short HEAD) # Git commit hash&#39;ini al\nAPP_VERSION=${GIT_COMMIT_HASH} # Etiket olarak kullan\n\necho \"[ADIM 1\/4] Docker imaj\u0131 olu\u015fturuluyor (Etiket: ${APP_NAME}:${APP_VERSION})...\"\ndocker build -t ${APP_NAME}:${APP_VERSION} .\ndocker tag ${APP_NAME}:${APP_VERSION} ${APP_NAME}:latest # latest etiketini de ekle\n\n# ... di\u011fer da\u011f\u0131t\u0131m ad\u0131mlar\u0131 ...\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu \u015fekilde, her da\u011f\u0131t\u0131m\u0131n\u0131z otomatik olarak do\u011fru Git commit'iyle ili\u015fkilendirilir, bu da izlenebilirli\u011fi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<h3>Otomatik G\u00fcncelleme ve Geri Alma (Rollback) Mekanizmalar\u0131<\/h3>\n<p>Otomatik da\u011f\u0131t\u0131m sadece yeni s\u00fcr\u00fcmleri y\u00fcklemekle kalmaz, ayn\u0131 zamanda sorunlu g\u00fcncellemeler durumunda h\u0131zl\u0131 ve g\u00fcvenli geri alma yetene\u011fini de i\u00e7ermelidir. Da\u011f\u0131t\u0131m betiklerinizde, yeni bir s\u00fcr\u00fcm\u00fc da\u011f\u0131t\u0131rken eski konteyneri durdurup yenisini ba\u015flat\u0131rs\u0131n\u0131z. Ancak geri alma, eski, bilinen iyi bir imaja h\u0131zla geri d\u00f6nebilme yetene\u011fi anlam\u0131na gelir. Etiketleme stratejiniz burada kritik rol oynar.<\/p>\n<p>Geri alma i\u015flemini kolayla\u015ft\u0131rmak i\u00e7in, beti\u011finizin yeni bir s\u00fcr\u00fcm\u00fc da\u011f\u0131t\u0131rken \u00f6nceki \u00e7al\u0131\u015fan imaj\u0131n etiketini bir kenara not etmesi veya bir da\u011f\u0131t\u0131m ge\u00e7mi\u015fi tutmas\u0131 faydal\u0131 olabilir. Bir sorun tespit edildi\u011finde, basit bir komutla (\u00f6rne\u011fin <code>rollback.sh v1.0.0<\/code>) belirlenen eski bir imaj\u0131n tekrar \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 sa\u011flayabilirsiniz. Modern CI\/CD ara\u00e7lar\u0131 genellikle bu t\u00fcr geri alma yeteneklerini yerle\u015fik olarak sunar.<\/p>\n<p>Kesinti s\u00fcresini (downtime) azaltmak i\u00e7in \"mavi\/ye\u015fil da\u011f\u0131t\u0131m\" veya \"kanarya da\u011f\u0131t\u0131m\u0131\" gibi daha geli\u015fmi\u015f stratejiler de mevcuttur. Mavi\/ye\u015fil da\u011f\u0131t\u0131mda, uygulaman\u0131n yeni s\u00fcr\u00fcm\u00fc (ye\u015fil) eski s\u00fcr\u00fcmle (mavi) ayn\u0131 anda ayr\u0131 bir ortamda \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r. Yeni s\u00fcr\u00fcm test edildikten sonra, trafik tamamen yeni s\u00fcr\u00fcme y\u00f6nlendirilir ve eski s\u00fcr\u00fcm kapat\u0131l\u0131r. Bu, neredeyse s\u0131f\u0131r kesinti s\u00fcresi sa\u011flar. Kanarya da\u011f\u0131t\u0131m\u0131nda ise, yeni s\u00fcr\u00fcm trafi\u011fin k\u00fc\u00e7\u00fck bir y\u00fczdesine y\u00f6nlendirilir ve sorun ya\u015fanmazsa kademeli olarak daha fazla kullan\u0131c\u0131ya a\u00e7\u0131l\u0131r.<\/p>\n<h3>S\u00fcrekli Entegrasyon ve S\u00fcrekli Teslimat (CI\/CD) Entegrasyonu<\/h3>\n<p>Otomatik da\u011f\u0131t\u0131m betikleriniz, modern CI\/CD boru hatlar\u0131n\u0131n kalbinde yer al\u0131r. S\u00fcrekli Entegrasyon (CI), geli\u015ftiricilerin kodlar\u0131n\u0131 s\u0131k s\u0131k bir ana depoya birle\u015ftirmesi ve her birle\u015ftirmenin otomatik olarak test edilmesidir. S\u00fcrekli Teslimat (CD), CI'\u0131n bir uzant\u0131s\u0131d\u0131r; ba\u015far\u0131l\u0131 testlerden ge\u00e7en kod de\u011fi\u015fikliklerinin otomatik olarak bir test veya \u00fcretim ortam\u0131na da\u011f\u0131t\u0131labilece\u011fi anlam\u0131na gelir.<\/p>\n<p>Da\u011f\u0131t\u0131m betikleriniz, GitLab CI\/CD, GitHub Actions, Jenkins, CircleCI gibi pop\u00fcler CI\/CD ara\u00e7lar\u0131 taraf\u0131ndan otomatik olarak tetiklenebilir. \u00d6rne\u011fin, her kod g\u00f6nderiminde (push), CI\/CD boru hatt\u0131 otomatik olarak tetiklenir:<\/p>\n<ol>\n<li>Kod \u00e7ekilir.<\/li>\n<li>Unit ve entegrasyon testleri \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r.<\/li>\n<li>Testler ba\u015far\u0131l\u0131 olursa, Docker imaj\u0131 derlenir.<\/li>\n<li>\u0130maj bir Docker kay\u0131t defterine (Docker Hub, GitLab Registry vb.) g\u00f6nderilir.<\/li>\n<li>Son olarak, bizim <code>deploy.sh<\/code> beti\u011fimiz \u00e7al\u0131\u015ft\u0131r\u0131larak uygulama bir sunucuya veya Kubernetes k\u00fcmesine da\u011f\u0131t\u0131l\u0131r.<\/li>\n<\/ol>\n<p>Bu entegrasyon, yaz\u0131l\u0131m geli\u015ftirme s\u00fcrecini son derece h\u0131zland\u0131r\u0131r, hatalar\u0131 erken yakalar ve yeni \u00f6zelliklerin kullan\u0131c\u0131lara \u00e7ok daha h\u0131zl\u0131 ula\u015fmas\u0131n\u0131 sa\u011flar. Otomatik da\u011f\u0131t\u0131m betikleriniz, bu sorunsuz i\u015f ak\u0131\u015f\u0131n\u0131n temel yap\u0131 ta\u015f\u0131d\u0131r.<\/p>\n<h2>Vaka Analizi: K\u00fc\u00e7\u00fck Bir Proje \u0130\u00e7in Otomatik Da\u011f\u0131t\u0131m Beti\u011fi<\/h2>\n<p>\u015eimdiye kadar teorik bilgileri ve temel \u00f6rnekleri ele ald\u0131k. Gelin, \u00f6\u011frendiklerimizi ger\u00e7ek\u00e7i bir senaryoda uygulayal\u0131m: Basit bir blog uygulamas\u0131n\u0131n (daha \u00f6nce olu\u015fturdu\u011fumuz Flask uygulamas\u0131n\u0131 geni\u015fletti\u011fimizi varsayal\u0131m) uzak bir sunucuya otomatik olarak da\u011f\u0131t\u0131lmas\u0131. Amac\u0131m\u0131z, geli\u015ftiricinin her kod de\u011fi\u015fikli\u011finden sonra SSH ile sunucuya ba\u011flan\u0131p manuel komutlar \u00e7al\u0131\u015ft\u0131rma y\u00fck\u00fcnden kurtulmakt\u0131r. Bunun yerine, yerel makineden \u00e7al\u0131\u015ft\u0131r\u0131lan tek bir betik, t\u00fcm da\u011f\u0131t\u0131m s\u00fcrecini halledecektir.<\/p>\n<h3>Senaryo: Uzak Sunucuya Otomatik Da\u011f\u0131t\u0131m<\/h3>\n<p>Hayal edelim ki <code>my-flask-app<\/code> adl\u0131 blog uygulamam\u0131z var ve bu uygulama uzak bir Linux sunucusunda \u00e7al\u0131\u015f\u0131yor. Her yeni \u00f6zellik veya hata d\u00fczeltmesi eklendi\u011finde, bu g\u00fcncellemeleri uzak sunucuya da\u011f\u0131tmak istiyoruz. Da\u011f\u0131t\u0131m s\u00fcrecini otomatikle\u015ftirmek i\u00e7in a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izleyece\u011fiz:<\/p>\n<ol>\n<li>Yerel makinemizde uygulaman\u0131n Docker imaj\u0131n\u0131 derleyece\u011fiz.<\/li>\n<li>Bu imaj\u0131 Docker Hub gibi bir genel veya \u00f6zel Docker kay\u0131t defterine g\u00f6nderece\u011fiz.<\/li>\n<li>SSH \u00fczerinden uzak sunucuya ba\u011flanaca\u011f\u0131z.<\/li>\n<li>Uzak sunucuda mevcut \u00e7al\u0131\u015fan konteyneri durdurup kald\u0131raca\u011f\u0131z.<\/li>\n<li>Yeni imaj\u0131 Docker kay\u0131t defterinden uzak sunucuya \u00e7ekece\u011fiz.<\/li>\n<li>Yeni imajdan bir Docker konteyneri ba\u015flataca\u011f\u0131z.<\/li>\n<\/ol>\n<p>Bu senaryo, \u00fcretim ortam\u0131na da\u011f\u0131t\u0131m yaparken yayg\u0131n olarak kullan\u0131lan bir modeli temsil eder. G\u00fcvenli\u011fi sa\u011flamak i\u00e7in SSH anahtarlar\u0131n\u0131n kullan\u0131ld\u0131\u011f\u0131n\u0131 ve uzak sunucuda Docker'\u0131n kurulu oldu\u011funu varsay\u0131yoruz.<\/p>\n<h3>\u00d6rnek Uzak Da\u011f\u0131t\u0131m Beti\u011fi (<code>remote_deploy.sh<\/code>)<\/h3>\n<p>A\u015fa\u011f\u0131daki betik, yukar\u0131daki ad\u0131mlar\u0131 otomatik olarak ger\u00e7ekle\u015ftirecektir. Bu beti\u011fi <code>my-docker-app<\/code> dizininizin k\u00f6k\u00fcnde <code>remote_deploy.sh<\/code> ad\u0131yla kaydedin.<\/p>\n<pre><code>\n#!\/bin\/bash\n\nset -e\n\n# --- Ayarlanabilir De\u011fi\u015fkenler ---\nAPP_NAME=my-flask-app\n# \u0130maj etiketini dinamik olarak almak i\u00e7in Git commit hash&#39;ini kullanabiliriz\n# Ya da parametre olarak alabiliriz. \u015eimdilik sabit bir s\u00fcr\u00fcm kullanal\u0131m.\n# GIT_COMMIT_HASH=$(git rev-parse --short HEAD)\n# IMAGE_TAG=${GIT_COMMIT_HASH}\nIMAGE_TAG=1.0 # Manuel olarak belirlenmi\u015f imaj etiketi\nDOCKER_HUB_USERNAME=kullaniciadiniz # Docker Hub kullan\u0131c\u0131 ad\u0131n\u0131z\n\nREMOTE_USER=ubuntu\nREMOTE_HOST=54.123.45.67 # Uzak sunucunuzun IP adresi veya hostname\nREMOTE_PORT=5000 # Uygulaman\u0131n uzak sunucuda \u00e7al\u0131\u015faca\u011f\u0131 port\n\nCONTAINER_NAME=my-running-app_prod # Uzak sunucudaki konteyner ad\u0131\n\n# --- Do\u011frulama ---\nif [ -z \"$DOCKER_HUB_USERNAME\" ] || [ \"$DOCKER_HUB_USERNAME\" == \"kullaniciadiniz\" ]; then\n    echo \"HATA: L\u00fctfen DOCKER_HUB_USERNAME de\u011fi\u015fkenini Docker Hub kullan\u0131c\u0131 ad\u0131n\u0131zla g\u00fcncelleyin.\"\n    exit 1\nfi\n\nif [ -z \"$REMOTE_HOST\" ] || [ \"$REMOTE_HOST\" == \"54.123.45.67\" ]; then\n    echo \"HATA: L\u00fctfen REMOTE_HOST de\u011fi\u015fkenini uzak sunucunuzun IP adresi veya hostname&#39;i ile g\u00fcncelleyin.\"\n    exit 1\nfi\n\n# --- ADIM 1: Yerel Docker \u0130maj\u0131n\u0131 Olu\u015ftur ---\necho \"[ADIM 1\/6] Yerel Docker imaj\u0131 olu\u015fturuluyor: ${APP_NAME}:${IMAGE_TAG}\"\ndocker build -t ${APP_NAME}:${IMAGE_TAG} .\n\n# --- ADIM 2: \u0130maj\u0131 Docker Hub&#39;a G\u00f6nder ---\necho \"[ADIM 2\/6] Docker Hub&#39;a giri\u015f yap\u0131l\u0131yor ve imaj g\u00f6nderiliyor...\"\n# E\u011fer daha \u00f6nce giri\u015f yapmad\u0131ysan\u0131z docker login komutunu manuel \u00e7al\u0131\u015ft\u0131rman\u0131z gerekebilir.\n# Ya da CI\/CD ortam\u0131nda DOCKER_PASSWORD ortam de\u011fi\u015fkeni ile otomatik giri\u015f sa\u011flanabilir.\ndocker tag ${APP_NAME}:${IMAGE_TAG} ${DOCKER_HUB_USERNAME}\/${APP_NAME}:${IMAGE_TAG}\ndocker push ${DOCKER_HUB_USERNAME}\/${APP_NAME}:${IMAGE_TAG}\n\necho \"[ADIM 3\/6] Uzak sunucuya SSH \u00fczerinden ba\u011flan\u0131l\u0131yor ve da\u011f\u0131t\u0131m ba\u015flat\u0131l\u0131yor...\"\n# SSH \u00fczerinden uzak sunucuda komutlar\u0131 \u00e7al\u0131\u015ft\u0131r\nssh ${REMOTE_USER}@${REMOTE_HOST} \"\n    set -e\n    echo \"Uzak sunucuda: Mevcut &#39;${CONTAINER_NAME}&#39; konteyneri kontrol ediliyor ve durduruluyor (varsa)...\"\n    if docker ps -a --format &#39;{{.Names}}&#39; | grep -q ${CONTAINER_NAME}; then\n        docker stop ${CONTAINER_NAME}\n        docker rm ${CONTAINER_NAME}\n    else\n        echo \"Uzak sunucuda: Mevcut &#39;${CONTAINER_NAME}&#39; konteyneri bulunamad\u0131.\"\n    fi\n\n    echo \"Uzak sunucuda: Yeni Docker imaj\u0131 \u00e7ekiliyor: ${DOCKER_HUB_USERNAME}\/${APP_NAME}:${IMAGE_TAG}\"\n    docker pull ${DOCKER_HUB_USERNAME}\/${APP_NAME}:${IMAGE_TAG}\n\n    echo \"Uzak sunucuda: Yeni Docker konteyneri ba\u015flat\u0131l\u0131yor...\"\n    docker run -d -p ${REMOTE_PORT}:${REMOTE_PORT} --name ${CONTAINER_NAME} ${DOCKER_HUB_USERNAME}\/${APP_NAME}:${IMAGE_TAG}\n\n    echo \"Uzak sunucuda: Uygulama ba\u015far\u0131yla ba\u015flat\u0131ld\u0131!\"\n    docker ps\n\"\n\necho \"[ADIM 6\/6] Da\u011f\u0131t\u0131m tamamland\u0131! Uygulamay\u0131 kontrol etmek i\u00e7in: http:\/\/${REMOTE_HOST}:${REMOTE_PORT}\"\n  <\/pre>\n<p><\/code><\/p>\n<p><strong>Bu beti\u011fi kullanmadan \u00f6nce dikkat etmeniz gerekenler:<\/strong><\/p>\n<ul>\n<li><code>DOCKER_HUB_USERNAME<\/code>, <code>REMOTE_USER<\/code> ve <code>REMOTE_HOST<\/code> de\u011fi\u015fkenlerini kendi bilgilerinizle g\u00fcncelleyin.<\/li>\n<li>Uzak sunucunuzda Docker kurulu ve <code>docker<\/code> komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rabilen bir kullan\u0131c\u0131n\u0131z (<code>REMOTE_USER<\/code>) olmal\u0131.<\/li>\n<li>Yerel makinenizden uzak sunucuya parola girmeden SSH ba\u011flant\u0131s\u0131 kurabilmek i\u00e7in SSH anahtarlar\u0131 kurman\u0131z \u00f6nerilir. Aksi takdirde, her SSH komutunda parola girmeniz istenecektir.<\/li>\n<li>E\u011fer Docker Hub'a daha \u00f6nce giri\u015f yapmad\u0131ysan\u0131z, <code>docker push<\/code> komutundan \u00f6nce yerel makinenizde <code>docker login<\/code> komutunu \u00e7al\u0131\u015ft\u0131rman\u0131z gerekebilir. CI\/CD ortamlar\u0131nda bu genellikle ortam de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla halledilir.<\/li>\n<\/ul>\n<p>Beti\u011fi \u00e7al\u0131\u015ft\u0131r\u0131labilir yapmak i\u00e7in <code>chmod +x remote_deploy.sh<\/code> komutunu kullan\u0131n ve ard\u0131ndan <code>.\/remote_deploy.sh<\/code> ile \u00e7al\u0131\u015ft\u0131r\u0131n. Bu betik, lokaldeki imaj\u0131 derleyecek, Docker Hub'a g\u00f6nderecek ve ard\u0131ndan SSH \u00fczerinden uzak sunucunuzda yeni imaj\u0131 \u00e7ekip uygulaman\u0131z\u0131 yeniden ba\u015flatacakt\u0131r. Bu sayede, tek bir komutla uygulaman\u0131z\u0131 \u00fcretim ortam\u0131na da\u011f\u0131tabileceksiniz. Bu vaka analizi, otomatik da\u011f\u0131t\u0131m betiklerinin ne kadar g\u00fc\u00e7l\u00fc ve zaman tasarrufu sa\u011flayan ara\u00e7lar olabilece\u011fini a\u00e7\u0131k\u00e7a g\u00f6stermektedir.<\/p>\n<h2>Sonu\u00e7: Otomatik Docker Da\u011f\u0131t\u0131m\u0131nda Ustala\u015fmak ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu kapsaml\u0131 rehber boyunca, manuel uygulama da\u011f\u0131t\u0131m\u0131n\u0131n zorluklar\u0131ndan, Docker'\u0131n sundu\u011fu \u00e7\u00f6z\u00fcmlere ve nihayetinde otomatik da\u011f\u0131t\u0131m betiklerinin nas\u0131l olu\u015fturulaca\u011f\u0131na kadar geni\u015f bir yelpazeyi ele ald\u0131k. Temel Docker kavramlar\u0131n\u0131 anlad\u0131k, basit bir Flask uygulamas\u0131n\u0131 Dockerize ettik ve bu s\u00fcreci otomatikle\u015ftiren bir Shell beti\u011fi yazd\u0131k. Ayr\u0131ca, Docker Compose ile \u00e7ok servisli uygulamalar\u0131n y\u00f6netiminden, s\u00fcr\u00fcm kontrol\u00fc ve etiketleme stratejilerine, hatta CI\/CD entegrasyonuna kadar ileri d\u00fczey konulara da de\u011findik. Bir vaka analiziyle, uzak bir sunucuya otomatik da\u011f\u0131t\u0131m\u0131n nas\u0131l yap\u0131labilece\u011fini pratik bir \u00f6rnekle g\u00f6sterdik.<\/p>\n<p>Otomatik Docker da\u011f\u0131t\u0131m\u0131, yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinizi k\u00f6kten de\u011fi\u015ftirebilecek g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Daha h\u0131zl\u0131, daha g\u00fcvenilir ve daha tutarl\u0131 da\u011f\u0131t\u0131mlar sayesinde, geli\u015ftirme ekipleri daha az operasyonel y\u00fckle kar\u015f\u0131la\u015f\u0131r ve daha \u00e7ok yenilik yapmaya odaklanabilirler. \u0130nsan hatas\u0131 riski azal\u0131rken, \u00fcretim ortam\u0131ndaki kesinti s\u00fcreleri minimuma iner. Bu yetenekler, modern DevOps k\u00fclt\u00fcr\u00fcn\u00fcn temelini olu\u015fturur ve g\u00fcn\u00fcm\u00fcz\u00fcn rekabet\u00e7i teknoloji d\u00fcnyas\u0131nda vazge\u00e7ilmez bir avantaj sa\u011flar.<\/p>\n<p>Bu makale, otomatik Docker da\u011f\u0131t\u0131m\u0131na ba\u015flamak i\u00e7in size sa\u011flam bir temel sunsa da, bu alan s\u00fcrekli geli\u015fmektedir. Bir sonraki ad\u0131m olarak, farkl\u0131 CI\/CD ara\u00e7lar\u0131n\u0131 (Jenkins, GitLab CI, GitHub Actions) ke\u015ffedebilir, Kubernetes gibi konteyner orkestrasyon ara\u00e7lar\u0131n\u0131 inceleyebilir ve daha karma\u015f\u0131k da\u011f\u0131t\u0131m stratejilerini (mavi\/ye\u015fil, kanarya) derinlemesine ara\u015ft\u0131rabilirsiniz. Unutmay\u0131n, pratik yapmak ve s\u00fcrekli \u00f6\u011frenmek, bu alanda ustala\u015fman\u0131n anahtar\u0131d\u0131r. Ba\u015far\u0131lar dileriz!<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS):<\/h3>\n<ul>\n<li>\n      <strong>S: Da\u011f\u0131t\u0131m betiklerimi nerede saklamal\u0131y\u0131m?<\/strong><\/p>\n<p>C: Genellikle da\u011f\u0131t\u0131m betiklerinizi, ili\u015fkili olduklar\u0131 uygulaman\u0131n kaynak koduyla birlikte Git gibi bir s\u00fcr\u00fcm kontrol sisteminde saklamal\u0131s\u0131n\u0131z. Bu, betiklerin uygulaman\u0131n kod taban\u0131yla birlikte versiyonlanmas\u0131n\u0131 sa\u011flar, de\u011fi\u015fikliklerin izlenebilirli\u011fini art\u0131r\u0131r ve ekip \u00fcyeleri aras\u0131nda i\u015fbirli\u011fini kolayla\u015ft\u0131r\u0131r. Ancak hassas bilgileri (API anahtarlar\u0131, \u015fifreler) betik i\u00e7inde tutmak yerine ortam de\u011fi\u015fkenleri, <code>.env<\/code> dosyalar\u0131 (veya bulut sa\u011flay\u0131c\u0131lar\u0131n\u0131n gizli y\u00f6netim hizmetleri) kullanarak g\u00fcvenli\u011fi sa\u011flamal\u0131s\u0131n\u0131z. <code>.env<\/code> dosyas\u0131n\u0131 ise <code>.gitignore<\/code>'a ekleyerek asla s\u00fcr\u00fcm kontrol\u00fcne dahil etmeyin.<\/p>\n<\/li>\n<li>\n      <strong>S: Beti\u011fim neden \u00e7al\u0131\u015fm\u0131yor? Hata ay\u0131klama ipu\u00e7lar\u0131 nelerdir?<\/strong><\/p>\n<p>C: Betiklerin \u00e7al\u0131\u015fmamas\u0131n\u0131n en yayg\u0131n nedenleri s\u00f6zdizimi hatalar\u0131, dosya izinleri veya eksik ba\u011f\u0131ml\u0131l\u0131klard\u0131r. \u0130lk olarak, beti\u011fin \u00e7al\u0131\u015ft\u0131r\u0131labilir oldu\u011fundan emin olun (<code>chmod +x script.sh<\/code>). Hata ay\u0131klama i\u00e7in beti\u011fi <code>bash -x deploy.sh<\/code> komutuyla \u00e7al\u0131\u015ft\u0131r\u0131n. <code>-x<\/code> parametresi, Shell'in her komutu y\u00fcr\u00fctmeden \u00f6nce ekrana yazd\u0131rmas\u0131n\u0131 sa\u011flar, bu da sorunun nerede oldu\u011funu anlaman\u0131za yard\u0131mc\u0131 olur. Ayr\u0131ca, her komutun d\u00f6n\u00fc\u015f kodunu (<code>echo $?<\/code>) kontrol etmek, hangi komutun ba\u015far\u0131s\u0131z oldu\u011funu anlamak i\u00e7in \u00f6nemlidir. Genellikle beti\u011fin ba\u015f\u0131nda <code>set -e<\/code> kullanmak, hata durumunda beti\u011fin durmas\u0131n\u0131 sa\u011flayarak sorunu daha erken fark etmenize yard\u0131mc\u0131 olur.<\/p>\n<\/li>\n<li>\n      <strong>S: Farkl\u0131 ortamlar (geli\u015ftirme, test, \u00fcretim) i\u00e7in ayn\u0131 beti\u011fi kullanabilir miyim?<\/strong><\/p>\n<p>C: Evet, kesinlikle! Bu, otomatik da\u011f\u0131t\u0131m\u0131n en b\u00fcy\u00fck avantajlar\u0131ndan biridir ve DevOps felsefesinin temel prensiplerindendir. Beti\u011finizin i\u00e7ine ko\u015fullu mant\u0131k (<code>if-else<\/code> yap\u0131lar\u0131) ekleyebilir veya ortam de\u011fi\u015fkenleri (<code>export ENVIRONMENT=production<\/code>) kullanarak farkl\u0131 ortamlar i\u00e7in \u00f6zelle\u015ftirmeler yapabilirsiniz. \u00d6rne\u011fin, <code>REMOTE_HOST<\/code> veya <code>IMAGE_TAG<\/code> gibi de\u011fi\u015fkenleri beti\u011fi \u00e7al\u0131\u015ft\u0131r\u0131rken parametre olarak veya ortam de\u011fi\u015fkenleri olarak ileterek farkl\u0131 hedefler i\u00e7in ayn\u0131 beti\u011fi kullanabilirsiniz. Bu yakla\u015f\u0131m, t\u00fcm ortamlar aras\u0131nda tutarl\u0131l\u0131\u011f\u0131 art\u0131r\u0131r ve \"\u00e7al\u0131\u015fan\" bir \u00e7\u00f6z\u00fcm\u00fcn her ortamda ayn\u0131 \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 garanti eder.<\/p>\n<\/li>\n<li>\n      <strong>S: Docker imajlar\u0131m\u0131 ne s\u0131kl\u0131kla g\u00fcncellemeli ve etiketlemeliyim?<\/strong><\/p>\n<p>C: Her yeni \u00f6zellik, hata d\u00fczeltmesi veya \u00f6nemli bir kod de\u011fi\u015fikli\u011fi i\u00e7in yeni bir Docker imaj\u0131 olu\u015fturmal\u0131 ve bu imaj\u0131 benzersiz bir etiketle i\u015faretlemelisiniz. Semantik versiyonlama (<code>v1.2.3<\/code>), Git commit hash'leri (<code>a1b2c3d<\/code>) veya her ikisinin bir kombinasyonu (<code>v1.2.3-a1b2c3d<\/code>) bu etiketleme i\u00e7in iyi y\u00f6ntemlerdir. <code>latest<\/code> etiketini sadece en son kararl\u0131 s\u00fcr\u00fcm\u00fc belirtmek i\u00e7in kullanmak iyi bir uygulama olsa da, \u00fcretim ortam\u0131nda da\u011f\u0131t\u0131m yaparken spesifik, versiyonlu etiketleri kullanmak geri alma (rollback) i\u015flemlerini \u00e7ok daha g\u00fcvenli ve \u00f6ng\u00f6r\u00fclebilir hale getirir. Bu, hangi kodun hangi imaja kar\u015f\u0131l\u0131k geldi\u011fini her zaman bilmenizi sa\u011flar.<\/p>\n<\/li>\n<\/ul>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Uygulama geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7leri, g\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zl\u0131 tempolu yaz\u0131l\u0131m d\u00fcnyas\u0131nda s\u00fcrekli evrim ge\u00e7iriyor. Geleneksel y\u00f6ntemlerle yap\u0131lan uygulama da\u011f\u0131t\u0131mlar\u0131&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-36194","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>Otomatik Docker Da\u011f\u0131t\u0131m Beti\u011fi Olu\u015fturma: Ba\u015flang\u0131\u00e7 Rehberi<\/title>\n<meta name=\"description\" content=\"Uygulama geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7leri, g\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zl\u0131 tempolu yaz\u0131l\u0131m d\u00fcnyas\u0131nda s\u00fcrekli evrim ge\u00e7iriyor. Geleneksel y\u00f6ntemlerle yap\u0131lan uygulama da\u011f\u0131t\u0131mlar\u0131 genellikle yava\u015f, hatalara a\u00e7\u0131k ve tekrarlayan manuel ad\u0131mlarla dolu olabilir. \u00d6zellikle k\u00fc\u00e7\u00fck hatalar bile b\u00fcy\u00fck aksakl\u0131klara yol a\u00e7arken, her yeni s\u00fcr\u00fcmde ayn\u0131 ad\u0131mlar\u0131 tekrarlamak geli\u015ftiriciler ve operasyon ekipleri i\u00e7in ciddi bir zaman kayb\u0131 anlam\u0131na gelir. Peki, bu s\u00fcreci nas\u0131l daha verimli, daha g\u00fcvenilir ve daha h\u0131zl\u0131 hale getirebiliriz? \u0130\u015fte tam da bu noktada, Docker ve otomasyon betiklerinin g\u00fcc\u00fc devreye giriyor.\" \/>\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\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Otomatik Docker Da\u011f\u0131t\u0131m Beti\u011fi Olu\u015fturma: Ba\u015flang\u0131\u00e7 Rehberi\" \/>\n<meta property=\"og:description\" content=\"Uygulama geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7leri, g\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zl\u0131 tempolu yaz\u0131l\u0131m d\u00fcnyas\u0131nda s\u00fcrekli evrim ge\u00e7iriyor. Geleneksel y\u00f6ntemlerle yap\u0131lan uygulama da\u011f\u0131t\u0131mlar\u0131 genellikle yava\u015f, hatalara a\u00e7\u0131k ve tekrarlayan manuel ad\u0131mlarla dolu olabilir. \u00d6zellikle k\u00fc\u00e7\u00fck hatalar bile b\u00fcy\u00fck aksakl\u0131klara yol a\u00e7arken, her yeni s\u00fcr\u00fcmde ayn\u0131 ad\u0131mlar\u0131 tekrarlamak geli\u015ftiriciler ve operasyon ekipleri i\u00e7in ciddi bir zaman kayb\u0131 anlam\u0131na gelir. Peki, bu s\u00fcreci nas\u0131l daha verimli, daha g\u00fcvenilir ve daha h\u0131zl\u0131 hale getirebiliriz? \u0130\u015fte tam da bu noktada, Docker ve otomasyon betiklerinin g\u00fcc\u00fc devreye giriyor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-09T22:01:26+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=\"31 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Otomatik Docker Da\u011f\u0131t\u0131m Beti\u011fi Olu\u015fturma: Ba\u015flang\u0131\u00e7 Rehberi\",\"datePublished\":\"2025-12-09T22:01:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/\"},\"wordCount\":5235,\"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\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/\",\"name\":\"Otomatik Docker Da\u011f\u0131t\u0131m Beti\u011fi Olu\u015fturma: Ba\u015flang\u0131\u00e7 Rehberi\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-09T22:01:26+00:00\",\"description\":\"Uygulama geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7leri, g\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zl\u0131 tempolu yaz\u0131l\u0131m d\u00fcnyas\u0131nda s\u00fcrekli evrim ge\u00e7iriyor. Geleneksel y\u00f6ntemlerle yap\u0131lan uygulama da\u011f\u0131t\u0131mlar\u0131 genellikle yava\u015f, hatalara a\u00e7\u0131k ve tekrarlayan manuel ad\u0131mlarla dolu olabilir. \u00d6zellikle k\u00fc\u00e7\u00fck hatalar bile b\u00fcy\u00fck aksakl\u0131klara yol a\u00e7arken, her yeni s\u00fcr\u00fcmde ayn\u0131 ad\u0131mlar\u0131 tekrarlamak geli\u015ftiriciler ve operasyon ekipleri i\u00e7in ciddi bir zaman kayb\u0131 anlam\u0131na gelir. Peki, bu s\u00fcreci nas\u0131l daha verimli, daha g\u00fcvenilir ve daha h\u0131zl\u0131 hale getirebiliriz? \u0130\u015fte tam da bu noktada, Docker ve otomasyon betiklerinin g\u00fcc\u00fc devreye giriyor.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Otomatik Docker Da\u011f\u0131t\u0131m Beti\u011fi Olu\u015fturma: Ba\u015flang\u0131\u00e7 Rehberi\"}]},{\"@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":"Otomatik Docker Da\u011f\u0131t\u0131m Beti\u011fi Olu\u015fturma: Ba\u015flang\u0131\u00e7 Rehberi","description":"Uygulama geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7leri, g\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zl\u0131 tempolu yaz\u0131l\u0131m d\u00fcnyas\u0131nda s\u00fcrekli evrim ge\u00e7iriyor. Geleneksel y\u00f6ntemlerle yap\u0131lan uygulama da\u011f\u0131t\u0131mlar\u0131 genellikle yava\u015f, hatalara a\u00e7\u0131k ve tekrarlayan manuel ad\u0131mlarla dolu olabilir. \u00d6zellikle k\u00fc\u00e7\u00fck hatalar bile b\u00fcy\u00fck aksakl\u0131klara yol a\u00e7arken, her yeni s\u00fcr\u00fcmde ayn\u0131 ad\u0131mlar\u0131 tekrarlamak geli\u015ftiriciler ve operasyon ekipleri i\u00e7in ciddi bir zaman kayb\u0131 anlam\u0131na gelir. Peki, bu s\u00fcreci nas\u0131l daha verimli, daha g\u00fcvenilir ve daha h\u0131zl\u0131 hale getirebiliriz? \u0130\u015fte tam da bu noktada, Docker ve otomasyon betiklerinin g\u00fcc\u00fc devreye giriyor.","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\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Otomatik Docker Da\u011f\u0131t\u0131m Beti\u011fi Olu\u015fturma: Ba\u015flang\u0131\u00e7 Rehberi","og_description":"Uygulama geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7leri, g\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zl\u0131 tempolu yaz\u0131l\u0131m d\u00fcnyas\u0131nda s\u00fcrekli evrim ge\u00e7iriyor. Geleneksel y\u00f6ntemlerle yap\u0131lan uygulama da\u011f\u0131t\u0131mlar\u0131 genellikle yava\u015f, hatalara a\u00e7\u0131k ve tekrarlayan manuel ad\u0131mlarla dolu olabilir. \u00d6zellikle k\u00fc\u00e7\u00fck hatalar bile b\u00fcy\u00fck aksakl\u0131klara yol a\u00e7arken, her yeni s\u00fcr\u00fcmde ayn\u0131 ad\u0131mlar\u0131 tekrarlamak geli\u015ftiriciler ve operasyon ekipleri i\u00e7in ciddi bir zaman kayb\u0131 anlam\u0131na gelir. Peki, bu s\u00fcreci nas\u0131l daha verimli, daha g\u00fcvenilir ve daha h\u0131zl\u0131 hale getirebiliriz? \u0130\u015fte tam da bu noktada, Docker ve otomasyon betiklerinin g\u00fcc\u00fc devreye giriyor.","og_url":"https:\/\/fatihsoysal.com\/blog\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-09T22:01:26+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"31 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Otomatik Docker Da\u011f\u0131t\u0131m Beti\u011fi Olu\u015fturma: Ba\u015flang\u0131\u00e7 Rehberi","datePublished":"2025-12-09T22:01:26+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/"},"wordCount":5235,"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\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/","name":"Otomatik Docker Da\u011f\u0131t\u0131m Beti\u011fi Olu\u015fturma: Ba\u015flang\u0131\u00e7 Rehberi","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-09T22:01:26+00:00","description":"Uygulama geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7leri, g\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zl\u0131 tempolu yaz\u0131l\u0131m d\u00fcnyas\u0131nda s\u00fcrekli evrim ge\u00e7iriyor. Geleneksel y\u00f6ntemlerle yap\u0131lan uygulama da\u011f\u0131t\u0131mlar\u0131 genellikle yava\u015f, hatalara a\u00e7\u0131k ve tekrarlayan manuel ad\u0131mlarla dolu olabilir. \u00d6zellikle k\u00fc\u00e7\u00fck hatalar bile b\u00fcy\u00fck aksakl\u0131klara yol a\u00e7arken, her yeni s\u00fcr\u00fcmde ayn\u0131 ad\u0131mlar\u0131 tekrarlamak geli\u015ftiriciler ve operasyon ekipleri i\u00e7in ciddi bir zaman kayb\u0131 anlam\u0131na gelir. Peki, bu s\u00fcreci nas\u0131l daha verimli, daha g\u00fcvenilir ve daha h\u0131zl\u0131 hale getirebiliriz? \u0130\u015fte tam da bu noktada, Docker ve otomasyon betiklerinin g\u00fcc\u00fc devreye giriyor.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/otomatik-docker-dagitim-betigi-olusturma-baslangic-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Otomatik Docker Da\u011f\u0131t\u0131m Beti\u011fi Olu\u015fturma: Ba\u015flang\u0131\u00e7 Rehberi"}]},{"@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\/36194","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=36194"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36194\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36194"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36194"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36194"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}