{"id":37636,"date":"2026-01-11T09:40:46","date_gmt":"2026-01-11T06:40:46","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=37636"},"modified":"2026-01-11T09:40:46","modified_gmt":"2026-01-11T06:40:46","slug":"flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/","title":{"rendered":"Flask Uygulamas\u0131n\u0131 Docker ile Ubuntu 20.04 \u00dczerinde Olu\u015fturma ve Da\u011f\u0131tma Rehberi"},"content":{"rendered":"<p><body><\/p>\n<h2>Flask Uygulamas\u0131n\u0131 Docker ile Ubuntu 20.04 \u00dczerinde Olu\u015fturma ve Da\u011f\u0131tma Rehberi<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen yaz\u0131l\u0131m d\u00fcnyas\u0131nda, uygulamalar\u0131 tutarl\u0131 ve g\u00fcvenilir bir \u015fekilde da\u011f\u0131tmak ve y\u00f6netmek, geli\u015ftiriciler ve operasyon ekipleri i\u00e7in hayati \u00f6nem ta\u015f\u0131maktad\u0131r. Flask gibi hafif ve esnek bir Python web \u00e7at\u0131s\u0131 ile Docker gibi g\u00fc\u00e7l\u00fc bir konteynerizasyon platformunun birle\u015fimi, bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in m\u00fckemmel bir \u00e7\u00f6z\u00fcm sunar. Bu makalede, bir Flask uygulamas\u0131n\u0131 Ubuntu 20.04 i\u015fletim sistemi \u00fczerinde Docker kullanarak nas\u0131l olu\u015fturaca\u011f\u0131m\u0131z\u0131, konteynerize edece\u011fimizi ve da\u011f\u0131taca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m ele alaca\u011f\u0131z. Amac\u0131m\u0131z, geli\u015ftirme ortam\u0131ndan \u00fcretim ortam\u0131na kadar tutarl\u0131 bir deneyim sa\u011flamak ve uygulama da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini basitle\u015ftirmektir.<\/p>\n<p>Flask, Python tabanl\u0131 minimalist bir mikro web \u00e7at\u0131s\u0131d\u0131r. H\u0131zl\u0131 prototipleme ve k\u00fc\u00e7\u00fck ila orta \u00f6l\u00e7ekli uygulamalar i\u00e7in idealdir. Docker ise, uygulamalar\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 izole edilmi\u015f &#8220;konteynerler&#8221; i\u00e7inde paketlemeye olanak tan\u0131yan bir platformdur. Bu konteynerler, farkl\u0131 ortamlarda (geli\u015ftirme, test, \u00fcretim) tutarl\u0131 bir \u015fekilde \u00e7al\u0131\u015fmay\u0131 garanti eder. Ubuntu 20.04 ise, sunucu taraf\u0131nda yayg\u0131n olarak kullan\u0131lan sa\u011flam ve g\u00fcvenilir bir Linux da\u011f\u0131t\u0131m\u0131d\u0131r. Bu \u00fc\u00e7 teknolojinin birle\u015fimi, modern web uygulamalar\u0131 geli\u015ftirmek ve da\u011f\u0131tmak i\u00e7in g\u00fc\u00e7l\u00fc ve verimli bir ekosistem yarat\u0131r.<\/p>\n<p>Bu rehberin sonunda, kendi Flask uygulaman\u0131z\u0131 Docker kullanarak bir Ubuntu 20.04 sunucusunda ba\u015far\u0131yla \u00e7al\u0131\u015ft\u0131rabilecek ve temel da\u011f\u0131t\u0131m prensiplerini anlam\u0131\u015f olacaks\u0131n\u0131z.<\/p>\n<h3>\u00d6n Gereksinimler<\/h3>\n<p>Bu rehberi takip edebilmek i\u00e7in a\u015fa\u011f\u0131daki temel bilgilere ve ara\u00e7lara sahip olman\u0131z gerekmektedir:<\/p>\n<ul>\n<li>Ubuntu 20.04 i\u015fletim sistemi kurulu bir sunucu veya sanal makine.<\/li>\n<li>Temel Linux komut sat\u0131r\u0131 bilgisi.<\/li>\n<li><code>sudo<\/code> yetkisine sahip bir kullan\u0131c\u0131 hesab\u0131.<\/li>\n<li>\u0130nternet ba\u011flant\u0131s\u0131.<\/li>\n<li>Flask ve Python hakk\u0131nda temel bilgi (uygulama geli\u015ftirme k\u0131sm\u0131 i\u00e7in).<\/li>\n<\/ul>\n<h3>Ortam Kurulumu: Docker ve Docker Compose&#8217;u Y\u00fckleme<\/h3>\n<p>Flask uygulamam\u0131z\u0131 konteynerize etmeden \u00f6nce, Ubuntu 20.04 sistemimize Docker ve Docker Compose&#8217;u kurmam\u0131z gerekiyor.<\/p>\n<h4>Sistemi G\u00fcncelleme<\/h4>\n<p>\u0130lk ad\u0131m olarak, sistem paket listesini g\u00fcncelleyelim ve mevcut paketleri y\u00fckseltelim:<\/p>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt upgrade -y<\/code><\/pre>\n<h4>Docker Kurulumu<\/h4>\n<p>Docker Engine&#8217;i kurmak i\u00e7in resmi Docker deposunu kullanaca\u011f\u0131z. Bu, en g\u00fcncel s\u00fcr\u00fcm\u00fc edinmemizi ve gelecekte kolayca g\u00fcncelleme yapmam\u0131z\u0131 sa\u011flar.<\/p>\n<p>1.  <strong>Gerekli Paketleri Kurma:<\/strong><br \/>\n    Docker&#8217;\u0131n HTTPS \u00fczerinden depo kullanabilmesi i\u00e7in baz\u0131 \u00f6n ko\u015ful paketleri y\u00fcklememiz gerekiyor:<\/p>\n<pre><code class=\"language-bash\">sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y<\/code><\/pre>\n<p>2.  <strong>Docker&#8217;\u0131n Resmi GPG Anahtar\u0131n\u0131 Ekleme:<\/strong><br \/>\n    Docker&#8217;\u0131n resmi GPG anahtar\u0131n\u0131 sistemimize ekleyerek indirilen paketlerin do\u011frulu\u011funu sa\u011flam\u0131\u015f oluruz:<\/p>\n<pre><code class=\"language-bash\">curl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | sudo gpg --dearmor -o \/usr\/share\/keyrings\/docker-archive-keyring.gpg<\/code><\/pre>\n<p>3.  <strong>Docker Deposunu Ekleme:<\/strong><br \/>\n    \u015eimdi Docker deposunu APT kaynaklar\u0131m\u0131za ekleyebiliriz:<\/p>\n<pre><code class=\"language-bash\">echo \"deb [arch=$(dpkg --print-architecture) signed-by=\/usr\/share\/keyrings\/docker-archive-keyring.gpg] https:\/\/download.docker.com\/linux\/ubuntu $(lsb_release -cs) stable\" | sudo tee \/etc\/apt\/sources.list.d\/docker.list > \/dev\/null<\/code><\/pre>\n<p>4.  <strong>Docker Engine&#8217;i Kurma:<\/strong><br \/>\n    Depoyu ekledikten sonra, paket listesini tekrar g\u00fcncelleyip Docker Engine&#8217;i kurabiliriz:<\/p>\n<pre><code class=\"language-bash\">sudo apt update\n    sudo apt install docker-ce docker-ce-cli containerd.io -y<\/code><\/pre>\n<p>5.  <strong>Docker Kurulumunu Do\u011frulama:<\/strong><br \/>\n    Docker&#8217;\u0131n do\u011fru bir \u015fekilde kurulup kurulmad\u0131\u011f\u0131n\u0131 test etmek i\u00e7in basit bir <code>hello-world<\/code> konteyneri \u00e7al\u0131\u015ft\u0131rabiliriz:<\/p>\n<pre><code class=\"language-bash\">sudo docker run hello-world<\/code><\/pre>\n<p>    Bu komut, Docker&#8217;\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve do\u011fru \u015fekilde y\u00fcklendi\u011fini g\u00f6steren bir mesaj \u00e7\u0131kt\u0131s\u0131 vermelidir.<\/p>\n<p>6.  <strong>Docker&#8217;\u0131 Root Olmadan Kullanma:<\/strong><br \/>\n    Varsay\u0131lan olarak, Docker komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code>sudo<\/code> kullanman\u0131z gerekir. Kullan\u0131c\u0131n\u0131z\u0131 <code>docker<\/code> grubuna ekleyerek bu gereksinimi ortadan kald\u0131rabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">sudo usermod -aG docker $USER<\/code><\/pre>\n<p>    Bu komutu \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra, de\u011fi\u015fikli\u011fin etkili olmas\u0131 i\u00e7in oturumu kapat\u0131p tekrar a\u00e7man\u0131z veya sistemi yeniden ba\u015flatman\u0131z gerekebilir.<\/p>\n<pre><code class=\"language-bash\">newgrp docker # Oturumu yeniden ba\u015flatmadan test etmek i\u00e7in<\/code><\/pre>\n<h4>Docker Compose Kurulumu<\/h4>\n<p>Docker Compose, \u00e7ok konteynerli Docker uygulamalar\u0131n\u0131 tan\u0131mlamak ve \u00e7al\u0131\u015ft\u0131rmak i\u00e7in bir ara\u00e7t\u0131r. Uygulamam\u0131z birden fazla servis (\u00f6rne\u011fin, Flask uygulamas\u0131, veritaban\u0131, Nginx) i\u00e7erecekse bu \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<p>1.  <strong>Docker Compose&#8217;u \u0130ndirme:<\/strong><br \/>\n    Docker Compose&#8217;un en son kararl\u0131 s\u00fcr\u00fcm\u00fcn\u00fc GitHub deposundan indirece\u011fiz. L\u00fctfen komut i\u00e7indeki s\u00fcr\u00fcm numaras\u0131n\u0131 (\u00f6rne\u011fin, <code>v2.24.5<\/code>) en g\u00fcncel s\u00fcr\u00fcmle de\u011fi\u015ftirin. En g\u00fcncel s\u00fcr\u00fcm\u00fc https:\/\/github.com\/docker\/compose\/releases adresinden kontrol edebilirsiniz.<\/p>\n<pre><code class=\"language-bash\">sudo curl -L \"https:\/\/github.com\/docker\/compose\/releases\/download\/v2.24.5\/docker-compose-$(uname -s)-$(uname -m)\" -o \/usr\/local\/bin\/docker-compose<\/code><\/pre>\n<p>2.  <strong>Y\u00fcr\u00fct\u00fclebilir \u0130zinleri Verme:<\/strong><br \/>\n    \u0130ndirilen dosyaya y\u00fcr\u00fct\u00fclebilir izinler vermemiz gerekiyor:<\/p>\n<pre><code class=\"language-bash\">sudo chmod +x \/usr\/local\/bin\/docker-compose<\/code><\/pre>\n<p>3.  <strong>Docker Compose Kurulumunu Do\u011frulama:<\/strong><br \/>\n    Kurulumun ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in s\u00fcr\u00fcm numaras\u0131n\u0131 sorgulayabiliriz:<\/p>\n<pre><code class=\"language-bash\">docker-compose --version<\/code><\/pre>\n<p>    Bu komut, y\u00fckl\u00fc Docker Compose s\u00fcr\u00fcm\u00fcn\u00fc g\u00f6stermelidir.<\/p>\n<h3>Flask Uygulamas\u0131n\u0131 Geli\u015ftirme<\/h3>\n<p>\u015eimdi basit bir Flask uygulamas\u0131 olu\u015ftural\u0131m. Bu uygulama, Docker konteyneri i\u00e7inde \u00e7al\u0131\u015facak ve web taray\u0131c\u0131s\u0131ndan eri\u015filebilir olacak.<\/p>\n<h4>Proje Yap\u0131s\u0131<\/h4>\n<p>Projemiz i\u00e7in a\u015fa\u011f\u0131daki gibi basit bir dizin yap\u0131s\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-\">flask-docker-app\/\n\u251c\u2500\u2500 app\/\n\u2502   \u2514\u2500\u2500 app.py\n\u2514\u2500\u2500 requirements.txt<\/code><\/pre>\n<p>1.  <strong>Proje Dizini Olu\u015fturma:<\/strong><\/p>\n<pre><code class=\"language-bash\">mkdir flask-docker-app\n    cd flask-docker-app\n    mkdir app<\/code><\/pre>\n<p>2.  <strong>Flask Uygulamas\u0131 Olu\u015fturma (<code>app\/app.py<\/code>):<\/strong><br \/>\n    <code>app\/app.py<\/code> dosyas\u0131n\u0131 olu\u015fturun ve i\u00e7ine a\u015fa\u011f\u0131daki kodu ekleyin:<\/p>\n<pre><code class=\"language-python\"># app\/app.py\n    from flask import Flask\n\n    app = Flask(__name__)\n\n    @app.route('\/')\n    def hello():\n        return \"Merhaba, Docker ve Flask ile D\u00fcnya!\"\n\n    if __name__ == '__main__':\n        app.run(host='0.0.0.0', port=5000)<\/code><\/pre>\n<p>    Bu basit uygulama, k\u00f6k URL&#8217;ye (\/) gelen isteklerde &#8220;Merhaba, Docker ve Flask ile D\u00fcnya!&#8221; mesaj\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr. <code>host='0.0.0.0'<\/code> kullanmak \u00f6nemlidir, \u00e7\u00fcnk\u00fc bu, uygulaman\u0131n konteyner i\u00e7inden d\u0131\u015f d\u00fcnyaya eri\u015filebilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>3.  <strong>Ba\u011f\u0131ml\u0131l\u0131klar Dosyas\u0131 Olu\u015fturma (<code>requirements.txt<\/code>):<\/strong><br \/>\n    <code>requirements.txt<\/code> dosyas\u0131n\u0131 olu\u015fturun ve i\u00e7ine uygulaman\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 ekleyin:<\/p>\n<pre><code class=\"language-\"># requirements.txt\n    Flask==2.3.3\n    gunicorn==21.2.0<\/code><\/pre>\n<p>    Burada <code>Flask<\/code> uygulaman\u0131n kendisi i\u00e7in, <code>gunicorn<\/code> ise \u00fcretim ortam\u0131nda Flask uygulamas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131lan bir WSGI (Web Server Gateway Interface) sunucusudur. Flask&#8217;\u0131n dahili geli\u015ftirme sunucusu \u00fcretim i\u00e7in uygun de\u011fildir.<\/p>\n<h4>Uygulamay\u0131 Yerel Olarak Test Etme (Opsiyonel)<\/h4>\n<p>Docker&#8217;a ge\u00e7meden \u00f6nce uygulaman\u0131n yerel olarak \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak isteyebilirsiniz.<\/p>\n<pre><code class=\"language-bash\"># Sanal ortam olu\u015fturma ve etkinle\u015ftirme\npython3 -m venv venv\nsource venv\/bin\/activate\n\n<h2>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckleme<\/h2>\npip install -r requirements.txt\n\n<h2>Uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rma (gunicorn ile)<\/h2>\ngunicorn -w 4 app.app:app -b 0.0.0.0:5000<\/code><\/pre>\n<p>Taray\u0131c\u0131n\u0131zda <code>http:\/\/localhost:5000<\/code> adresine giderek uygulaman\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6rebilirsiniz. \u0130\u015finiz bitti\u011finde <code>Ctrl+C<\/code> ile sunucuyu durdurabilir ve <code>deactivate<\/code> ile sanal ortamdan \u00e7\u0131kabilirsiniz.<\/p>\n<h3>Flask Uygulamas\u0131n\u0131 Docker ile Konteynerize Etme<\/h3>\n<p>\u015eimdi Flask uygulamam\u0131z\u0131 bir Docker konteyneri i\u00e7ine yerle\u015ftirece\u011fiz. Bunun i\u00e7in bir <code>Dockerfile<\/code> olu\u015fturmam\u0131z gerekiyor.<\/p>\n<h4>Dockerfile Olu\u015fturma<\/h4>\n<p><code>flask-docker-app<\/code> dizininin k\u00f6k\u00fcnde <code>Dockerfile<\/code> ad\u0131nda bir dosya olu\u015fturun ve i\u00e7ine a\u015fa\u011f\u0131daki i\u00e7eri\u011fi ekleyin:<\/p>\n<pre><code class=\"language-dockerfile\"># Dockerfile\n<h2>Python'\u0131n hafif bir s\u00fcr\u00fcm\u00fcn\u00fc temel imaj olarak kullan\u0131n<\/h2>\nFROM python:3.9-slim-buster\n\n<h2>\u00c7al\u0131\u015fma dizinini ayarlay\u0131n<\/h2>\nWORKDIR \/app\n\n<h2>Ba\u011f\u0131ml\u0131l\u0131klar dosyas\u0131n\u0131 kopyalay\u0131n<\/h2>\nCOPY requirements.txt .\n\n<h2>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 kurun<\/h2>\n<h2>--no-cache-dir: pip \u00f6nbelle\u011fini kullanmaz, imaj boyutunu azalt\u0131r<\/h2>\n<h2>-r: requirements.txt dosyas\u0131ndan y\u00fckler<\/h2>\nRUN pip install --no-cache-dir -r requirements.txt\n\n<h2>Uygulama kodunu kopyalay\u0131n<\/h2>\nCOPY app\/ .\n\n<h2>Uygulaman\u0131n 5000 portunda dinleyece\u011fini belirtin<\/h2>\nEXPOSE 5000\n\n<h2>Uygulamay\u0131 Gunicorn ile ba\u015flatma komutu<\/h2>\n<h2>-w 4: 4 adet worker (i\u015f\u00e7i) s\u00fcreci kullan\u0131r<\/h2>\n<h2>app:app: app dizinindeki app.py dosyas\u0131ndaki 'app' Flask uygulamas\u0131n\u0131 belirtir<\/h2>\n<h2>-b 0.0.0.0:5000: T\u00fcm a\u011f aray\u00fczlerinde 5000 portunda dinler<\/h2>\nCMD [\"gunicorn\", \"-w\", \"4\", \"app:app\", \"-b\", \"0.0.0.0:5000\"]<\/code><\/pre>\n<p>Bu <code>Dockerfile<\/code> ad\u0131mlar\u0131 \u015fu anlama gelir:<\/p>\n<ul>\n<li><code>FROM python:3.9-slim-buster<\/code>: Python 3.9&#8217;un Debian Buster tabanl\u0131, hafif bir s\u00fcr\u00fcm\u00fcn\u00fc temel imaj olarak kullan\u0131r. Bu, nihai imaj boyutunu k\u00fc\u00e7\u00fcltmeye yard\u0131mc\u0131 olur.<\/li>\n<li><code>WORKDIR \/app<\/code>: Konteyner i\u00e7inde <code>\/app<\/code> dizinini \u00e7al\u0131\u015fma dizini olarak ayarlar. Sonraki t\u00fcm komutlar bu dizin i\u00e7inde \u00e7al\u0131\u015f\u0131r.<\/li>\n<li><code>COPY requirements.txt .<\/code>: <code>requirements.txt<\/code> dosyas\u0131n\u0131 yerel dizinden konteynerin <code>\/app<\/code> dizinine kopyalar.<\/li>\n<li><code>RUN pip install --no-cache-dir -r requirements.txt<\/code>: <code>requirements.txt<\/code> dosyas\u0131ndaki t\u00fcm Python ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kurar. <code>--no-cache-dir<\/code> se\u00e7ene\u011fi, \u00f6nbelle\u011fi temizleyerek imaj boyutunu optimize eder.<\/li>\n<li><code>COPY app\/ .<\/code>: <code>app\/<\/code> dizini i\u00e7indeki t\u00fcm uygulama kodunu konteynerin <code>\/app<\/code> dizinine kopyalar.<\/li>\n<li><code>EXPOSE 5000<\/code>: Konteynerin 5000 numaral\u0131 portu dinleyece\u011fini bildirir. Bu, d\u0131\u015far\u0131dan eri\u015fim i\u00e7in bir bildirimdir, ancak do\u011frudan portu a\u00e7maz.<\/li>\n<li><code>CMD [\"gunicorn\", \"-w\", \"4\", \"app:app\", \"-b\", \"0.0.0.0:5000\"]<\/code>: Konteyner ba\u015flat\u0131ld\u0131\u011f\u0131nda \u00e7al\u0131\u015facak komutu tan\u0131mlar. Gunicorn, Flask uygulamas\u0131n\u0131 4 worker ile t\u00fcm a\u011f aray\u00fczlerinde 5000 portunda ba\u015flat\u0131r.<\/li>\n<\/ul>\n<h4>Docker \u0130maj\u0131n\u0131 Olu\u015fturma<\/h4>\n<p><code>Dockerfile<\/code>&#8216;\u0131 olu\u015fturduktan sonra, bu dosyay\u0131 kullanarak bir Docker imaj\u0131 olu\u015fturabiliriz. <code>flask-docker-app<\/code> dizininde oldu\u011funuzdan emin olun.<\/p>\n<pre><code class=\"language-bash\">docker build -t flask-app-image .<\/code><\/pre>\n<ul>\n<li><code>docker build<\/code>: Bir Docker imaj\u0131 olu\u015fturmak i\u00e7in komut.<\/li>\n<li><code>-t flask-app-image<\/code>: Olu\u015fturulan imaja <code>flask-app-image<\/code> ad\u0131n\u0131 ve <code>latest<\/code> etiketini verir (varsay\u0131lan).<\/li>\n<li><code>.<\/code>: Dockerfile&#8217;\u0131n mevcut dizinde oldu\u011funu belirtir.<\/li>\n<\/ul>\n<p>Bu i\u015flem biraz zaman alabilir, \u00e7\u00fcnk\u00fc Python temel imaj\u0131n\u0131 indirip ba\u011f\u0131ml\u0131l\u0131klar\u0131 kuracakt\u0131r.<\/p>\n<h4>Docker Konteynerini \u00c7al\u0131\u015ft\u0131rma<\/h4>\n<p>\u0130maj ba\u015far\u0131yla olu\u015fturulduktan sonra, bu imajdan bir Docker konteyneri ba\u015flatabiliriz:<\/p>\n<pre><code class=\"language-bash\">docker run -d -p 5000:5000 --name my-flask-app flask-app-image<\/code><\/pre>\n<ul>\n<li><code>docker run<\/code>: Bir Docker konteyneri ba\u015flatmak i\u00e7in komut.<\/li>\n<li><code>-d<\/code>: Konteyneri &#8220;detached&#8221; modda, yani arka planda \u00e7al\u0131\u015ft\u0131r\u0131r.<\/li>\n<li><code>-p 5000:5000<\/code>: Host makinesinin 5000 portunu konteynerin 5000 portuna e\u015fler. B\u00f6ylece host makinesinden <code>localhost:5000<\/code> adresine eri\u015fti\u011fimizde konteynerdeki Flask uygulamas\u0131na ula\u015f\u0131r\u0131z.<\/li>\n<li><code>--name my-flask-app<\/code>: Konteynere <code>my-flask-app<\/code> ad\u0131n\u0131 verir. Bu, konteyneri daha kolay y\u00f6netmenizi sa\u011flar.<\/li>\n<li><code>flask-app-image<\/code>: \u00c7al\u0131\u015ft\u0131r\u0131lacak imaj\u0131n ad\u0131.<\/li>\n<\/ul>\n<h4>Uygulamay\u0131 Test Etme<\/h4>\n<p>Konteynerin \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">docker ps<\/code><\/pre>\n<p>\u00c7al\u0131\u015fan konteynerler listesinde <code>my-flask-app<\/code> konteynerini g\u00f6rmelisiniz.<br \/>\nArd\u0131ndan, web taray\u0131c\u0131n\u0131zda veya <code>curl<\/code> ile <code>http:\/\/localhost:5000<\/code> adresine giderek Flask uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulayabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">curl http:\/\/localhost:5000<\/code><\/pre>\n<p>\u00c7\u0131kt\u0131 olarak &#8220;Merhaba, Docker ve Flask ile D\u00fcnya!&#8221; mesaj\u0131n\u0131 almal\u0131s\u0131n\u0131z.<\/p>\n<p>Konteynerin loglar\u0131n\u0131 g\u00f6rmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">docker logs my-flask-app<\/code><\/pre>\n<p>Konteyneri durdurmak ve kald\u0131rmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">docker stop my-flask-app\ndocker rm my-flask-app<\/code><\/pre>\n<h3>Docker Compose ile Orchestrasyon<\/h3>\n<p>Uygulamam\u0131z \u015fu anda tek bir konteynerden olu\u015fuyor. Ancak, ger\u00e7ek d\u00fcnya uygulamalar\u0131 genellikle bir veritaban\u0131, bir \u00f6n u\u00e7 sunucusu (Nginx gibi) veya ba\u015fka servisler gibi birden fazla konteyner gerektirir. Docker Compose, bu t\u00fcr \u00e7ok konteynerli uygulamalar\u0131 tan\u0131mlamak ve y\u00f6netmek i\u00e7in idealdir.<\/p>\n<h4>Neden Docker Compose?<\/h4>\n<ul>\n<li><strong>Kolay Yap\u0131land\u0131rma:<\/strong> T\u00fcm servislerinizi tek bir YAML dosyas\u0131nda tan\u0131mlars\u0131n\u0131z.<\/li>\n<li><strong>Basit Y\u00f6netim:<\/strong> Tek bir komutla t\u00fcm servisleri ba\u015flatabilir, durdurabilir veya yeniden olu\u015fturabilirsiniz.<\/li>\n<li><strong>Servis Ke\u015ffi:<\/strong> Compose, servisler aras\u0131nda otomatik a\u011f olu\u015fturma ve isim \u00e7\u00f6z\u00fcmlemesi sa\u011flar.<\/li>\n<li><strong>Geli\u015ftirme Ortam\u0131:<\/strong> Geli\u015ftirme s\u0131ras\u0131nda h\u0131zl\u0131 iterasyonlar i\u00e7in idealdir (\u00f6rne\u011fin, kod de\u011fi\u015fikliklerinde otomatik yeniden y\u00fckleme).<\/li>\n<\/ul>\n<h4><code>docker-compose.yml<\/code> Dosyas\u0131 Olu\u015fturma<\/h4>\n<p><code>flask-docker-app<\/code> dizininin k\u00f6k\u00fcnde <code>docker-compose.yml<\/code> ad\u0131nda bir dosya olu\u015fturun ve i\u00e7ine a\u015fa\u011f\u0131daki i\u00e7eri\u011fi ekleyin:<\/p>\n<pre><code class=\"language-yaml\"># docker-compose.yml\nversion: '3.8' # Docker Compose dosya format\u0131n\u0131n s\u00fcr\u00fcm\u00fc\n\nservices:\n  web: # Flask uygulamam\u0131z i\u00e7in servis tan\u0131m\u0131\n    build: . # Mevcut dizindeki Dockerfile'\u0131 kullanarak imaj\u0131 olu\u015ftur\n    ports:\n      - \"5000:5000\" # Host makinesinin 5000 portunu konteynerin 5000 portuna e\u015fle\n    volumes:\n      - .\/app:\/app # Yerel 'app' dizinini konteynerdeki '\/app' dizinine ba\u011fla\n    # Bu, geli\u015ftirme s\u0131ras\u0131nda kod de\u011fi\u015fikliklerinin konteynere an\u0131nda yans\u0131mas\u0131n\u0131 sa\u011flar.\n    # \u00dcretimde bu volume ba\u011flama yerine, imaj\u0131n i\u00e7ine kopyalamak tercih edilir.\n    environment:\n      FLASK_ENV: development # Flask ortam de\u011fi\u015fkenini ayarlay\u0131n (iste\u011fe ba\u011fl\u0131)\n    restart: always # Konteynerin her zaman yeniden ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flar (hata durumunda veya host yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda)<\/code><\/pre>\n<p>Bu <code>docker-compose.yml<\/code> dosyas\u0131 \u015funlar\u0131 yapar:<\/p>\n<ul>\n<li><code>version: '3.8'<\/code>: Docker Compose dosya format\u0131n\u0131n s\u00fcr\u00fcm\u00fcn\u00fc belirtir.<\/li>\n<li><code>services<\/code>: Uygulamam\u0131zdaki t\u00fcm servisleri tan\u0131mlad\u0131\u011f\u0131m\u0131z b\u00f6l\u00fcmd\u00fcr.<\/li>\n<li><code>web<\/code>: Flask uygulamam\u0131z i\u00e7in bir servis tan\u0131mlar.<\/li>\n<li><code>build: .<\/code>: <code>web<\/code> servisi i\u00e7in imaj\u0131n mevcut dizindeki <code>Dockerfile<\/code> kullan\u0131larak olu\u015fturulaca\u011f\u0131n\u0131 belirtir.<\/li>\n<li><code>ports: - \"5000:5000\"<\/code>: Host makinesinin 5000 portunu <code>web<\/code> konteynerinin 5000 portuna e\u015fler.<\/li>\n<li><code>volumes: - .\/app:\/app<\/code>: Yerel <code>app<\/code> dizinini <code>web<\/code> konteynerindeki <code>\/app<\/code> dizinine ba\u011flar. Bu, geli\u015ftirme s\u0131ras\u0131nda kodda yapt\u0131\u011f\u0131n\u0131z de\u011fi\u015fikliklerin konteyner i\u00e7inde otomatik olarak g\u00fcncellenmesini sa\u011flar (hot-reloading). <strong>\u00dcretim ortam\u0131nda genellikle bu t\u00fcr bir volume kullanmak yerine, t\u00fcm kodun imaj\u0131n i\u00e7ine kopyaland\u0131\u011f\u0131ndan emin olmak istenir.<\/strong><\/li>\n<li><code>environment: FLASK_ENV: development<\/code>: Konteyner i\u00e7inde bir ortam de\u011fi\u015fkeni ayarlar.<\/li>\n<li><code>restart: always<\/code>: Konteynerin bir hata durumunda veya host makinesi yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda otomatik olarak yeniden ba\u015flamas\u0131n\u0131 sa\u011flar.<\/li>\n<\/ul>\n<h4>Docker Compose ile Uygulamay\u0131 \u00c7al\u0131\u015ft\u0131rma<\/h4>\n<p><code>docker-compose.yml<\/code> dosyas\u0131n\u0131 olu\u015fturduktan sonra, uygulamay\u0131 tek bir komutla ba\u015flatabiliriz:<\/p>\n<pre><code class=\"language-bash\">docker-compose up --build -d<\/code><\/pre>\n<ul>\n<li><code>docker-compose up<\/code>: <code>docker-compose.yml<\/code> dosyas\u0131nda tan\u0131mlanan servisleri ba\u015flat\u0131r.<\/li>\n<li><code>--build<\/code>: Servisler i\u00e7in imajlar\u0131 yeniden olu\u015fturur (e\u011fer <code>build<\/code> anahtar\u0131 kullan\u0131l\u0131yorsa). Bu, <code>Dockerfile<\/code>&#8216;da veya uygulama kodunda yapt\u0131\u011f\u0131n\u0131z de\u011fi\u015fikliklerin imaja dahil edilmesini sa\u011flar.<\/li>\n<li><code>-d<\/code>: Servisleri detached modda (arka planda) \u00e7al\u0131\u015ft\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Bu komut, <code>web<\/code> servisi i\u00e7in Docker imaj\u0131n\u0131 olu\u015fturacak (veya g\u00fcncelleyecek) ve ard\u0131ndan konteyneri ba\u015flatacakt\u0131r.<\/p>\n<h4>Uygulamay\u0131 Test Etme<\/h4>\n<p>Yine <code>http:\/\/localhost:5000<\/code> adresine giderek veya <code>curl<\/code> kullanarak uygulaman\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulayabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">curl http:\/\/localhost:5000<\/code><\/pre>\n<p>\u00c7\u0131kt\u0131 olarak &#8220;Merhaba, Docker ve Flask ile D\u00fcnya!&#8221; mesaj\u0131n\u0131 almal\u0131s\u0131n\u0131z.<\/p>\n<p>\u00c7al\u0131\u015fan servisleri g\u00f6rmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">docker-compose ps<\/code><\/pre>\n<p>Servislerin loglar\u0131n\u0131 g\u00f6rmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">docker-compose logs web<\/code><\/pre>\n<p>Uygulamay\u0131 durdurmak ve konteynerleri kald\u0131rmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">docker-compose down<\/code><\/pre>\n<p>Bu komut, <code>docker-compose.yml<\/code> dosyas\u0131nda tan\u0131mlanan t\u00fcm servisleri durdurur ve ilgili konteynerleri, a\u011flar\u0131 ve volume&#8217;leri (tan\u0131mlanm\u0131\u015fsa) kald\u0131r\u0131r.<\/p>\n<h3>Da\u011f\u0131t\u0131mda Dikkat Edilmesi Gerekenler<\/h3>\n<p>Uygulamam\u0131z\u0131 Docker ile ba\u015far\u0131yla \u00e7al\u0131\u015ft\u0131rd\u0131k, ancak \u00fcretim ortam\u0131nda da\u011f\u0131t\u0131m yaparken g\u00f6z \u00f6n\u00fcnde bulundurman\u0131z gereken baz\u0131 \u00f6nemli noktalar vard\u0131r.<\/p>\n<h4>1. Gunicorn\/uWSGI Kullan\u0131m\u0131<\/h4>\n<p>Geli\u015ftirme sunucular\u0131 (\u00f6rne\u011fin <code>flask run<\/code>) \u00fcretim ortam\u0131 i\u00e7in tasarlanmam\u0131\u015ft\u0131r. \u00dcretimde Gunicorn veya uWSGI gibi bir WSGI sunucusu kullanmal\u0131s\u0131n\u0131z. Bizim <code>Dockerfile<\/code> ve <code>docker-compose.yml<\/code> dosyalar\u0131m\u0131zda zaten Gunicorn kullan\u0131yoruz, bu iyi bir ba\u015flang\u0131\u00e7t\u0131r.<\/p>\n<h4>2. Ortam De\u011fi\u015fkenleri<\/h4>\n<p>Veritaban\u0131 ba\u011flant\u0131 bilgileri, API anahtarlar\u0131 gibi hassas bilgileri do\u011frudan kodunuzda veya <code>Dockerfile<\/code> i\u00e7inde tutmaktan ka\u00e7\u0131n\u0131n. Bunun yerine, ortam de\u011fi\u015fkenlerini kullan\u0131n. Docker Compose&#8217;da <code>environment<\/code> anahtar\u0131n\u0131 veya Docker&#8217;da <code>docker run -e KEY=VALUE<\/code> se\u00e7ene\u011fini kullanabilirsiniz.<\/p>\n<h4>3. Nginx ile Ters Proxy<\/h4>\n<p>\u00dcretim ortam\u0131nda, Flask uygulaman\u0131z\u0131n \u00f6n\u00fcne genellikle Nginx gibi bir ters proxy sunucusu yerle\u015ftirilir. Nginx&#8217;in faydalar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Y\u00fck Dengeleme:<\/strong> Birden fazla Flask uygulama \u00f6rne\u011fi aras\u0131nda trafi\u011fi da\u011f\u0131tabilir.<\/li>\n<li><strong>SSL\/TLS Sonland\u0131rma:<\/strong> SSL sertifikalar\u0131n\u0131 y\u00f6netir ve g\u00fcvenli HTTPS ba\u011flant\u0131lar\u0131 sa\u011flar.<\/li>\n<li><strong>Statik Dosya Sunumu:<\/strong> CSS, JavaScript, resimler gibi statik dosyalar\u0131 do\u011frudan sunarak Flask uygulamas\u0131n\u0131n y\u00fck\u00fcn\u00fc azalt\u0131r.<\/li>\n<li><strong>H\u0131z Limitleme ve G\u00fcvenlik:<\/strong> \u0130stemci isteklerini limitleyebilir ve temel g\u00fcvenlik \u00f6nlemleri alabilir.<\/li>\n<\/ul>\n<h5>Nginx ile Docker Compose \u00d6rne\u011fi<\/h5>\n<p><code>docker-compose.yml<\/code> dosyam\u0131z\u0131 Nginx&#8217;i i\u00e7erecek \u015fekilde g\u00fcncelleyelim:<\/p>\n<pre><code class=\"language-yaml\"># docker-compose.yml (Nginx ile)\nversion: '3.8'\n\nservices:\n  web:\n    build: .\n    # Nginx ile do\u011frudan d\u0131\u015far\u0131ya a\u00e7may\u0131z, Nginx \u00fczerinden eri\u015filir\n    # ports:\n    #   - \"5000:5000\"\n    volumes:\n      - .\/app:\/app\n    environment:\n      FLASK_ENV: production\n    restart: always\n\n  nginx:\n    image: nginx:latest # En son Nginx imaj\u0131n\u0131 kullan\n    ports:\n      - \"80:80\" # Host'un 80 portunu Nginx'in 80 portuna e\u015fle\n      # - \"443:443\" # SSL i\u00e7in 443 portunu da e\u015fleyebilirsiniz\n    volumes:\n      - .\/nginx\/nginx.conf:\/etc\/nginx\/nginx.conf:ro # Nginx yap\u0131land\u0131rma dosyas\u0131n\u0131 ba\u011fla\n      # - .\/nginx\/conf.d:\/etc\/nginx\/conf.d:ro # Ek yap\u0131land\u0131rmalar i\u00e7in\n    depends_on:\n      - web # Nginx'in web servisinden sonra ba\u015flamas\u0131n\u0131 sa\u011flar\n    restart: always<\/code><\/pre>\n<p>\u015eimdi <code>nginx<\/code> dizini olu\u015fturup i\u00e7ine <code>nginx.conf<\/code> dosyas\u0131n\u0131 eklememiz gerekiyor:<\/p>\n<pre><code class=\"language-bash\">mkdir nginx<\/code><\/pre>\n<p><code>nginx\/nginx.conf<\/code> dosyas\u0131:<\/p>\n<pre><code class=\"language-nginx\"># nginx\/nginx.conf\nworker_processes auto;\n\nevents {\n    worker_connections 1024;\n}\n\nhttp {\n    include       mime.types;\n    default_type  application\/octet-stream;\n\n    sendfile        on;\n    keepalive_timeout  65;\n\n    server {\n        listen 80;\n        server_name localhost; # Alan ad\u0131n\u0131z\u0131 buraya yaz\u0131n\n\n        location \/ {\n            proxy_pass http:\/\/web:5000; # 'web' servisine 5000 portundan y\u00f6nlendir\n            proxy_set_header Host $host;\n            proxy_set_header X-Real-IP $remote_addr;\n            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n            proxy_set_header X-Forwarded-Proto $scheme;\n        }\n\n        # Statik dosyalar\u0131n\u0131z varsa bu blo\u011fu kullanabilirsiniz\n        # location \/static\/ {\n        #    alias \/app\/static\/; # Flask uygulamas\u0131n\u0131n static dizinini belirtin\n        # }\n    }\n}<\/code><\/pre>\n<p>Bu Nginx yap\u0131land\u0131rmas\u0131, gelen t\u00fcm HTTP isteklerini <code>web<\/code> servisine (Docker Compose&#8217;daki servis ad\u0131) 5000 portundan y\u00f6nlendirir.<\/p>\n<p>Nginx ile uygulamay\u0131 ba\u015flatmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">docker-compose up --build -d<\/code><\/pre>\n<p>\u015eimdi <code>http:\/\/localhost<\/code> adresine giderek uygulaman\u0131za Nginx \u00fczerinden eri\u015febilirsiniz.<\/p>\n<h4>4. Veri Kal\u0131c\u0131l\u0131\u011f\u0131 (Data Persistence)<\/h4>\n<p>E\u011fer uygulaman\u0131z bir veritaban\u0131 kullan\u0131yorsa (PostgreSQL, MySQL vb.), verilerin konteyner silindi\u011finde kaybolmamas\u0131 i\u00e7in Docker Volume&#8217;lar\u0131 kullanman\u0131z gerekir.<\/p>\n<p>\u00d6rnek olarak, bir PostgreSQL veritaban\u0131 ekleyelim:<\/p>\n<pre><code class=\"language-yaml\"># docker-compose.yml (PostgreSQL ile)\nversion: '3.8'\n\nservices:\n  web:\n    build: .\n    volumes:\n      - .\/app:\/app\n    environment:\n      FLASK_ENV: production\n      DATABASE_URL: postgresql:\/\/user:password@db:5432\/mydatabase # Veritaban\u0131 ba\u011flant\u0131 URL'si\n    restart: always\n    depends_on:\n      - db # web servisi db servisinden sonra ba\u015flas\u0131n\n\n  db:\n    image: postgres:13 # 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 verilerini kal\u0131c\u0131 hale getirmek i\u00e7in volume\n    restart: always\n\n  nginx:\n    image: nginx:latest\n    ports:\n      - \"80:80\"\n    volumes:\n      - .\/nginx\/nginx.conf:\/etc\/nginx\/nginx.conf:ro\n    depends_on:\n      - web\n    restart: always\n\nvolumes:\n  db_data: # db_data ad\u0131nda bir volume tan\u0131mla<\/code><\/pre>\n<p>Bu yap\u0131land\u0131rmada, <code>db_data<\/code> ad\u0131nda bir volume olu\u015fturulur ve PostgreSQL konteynerinin <code>\/var\/lib\/postgresql\/data<\/code> dizinine ba\u011flan\u0131r. Bu sayede konteyner silinse bile veritaban\u0131 verileri kal\u0131c\u0131 olarak saklan\u0131r.<\/p>\n<h4>5. G\u00fcvenlik<\/h4>\n<ul>\n<li><strong>Minimum \u0130zinler:<\/strong> Dockerfile&#8217;da <code>root<\/code> olmayan bir kullan\u0131c\u0131 olu\u015fturun ve uygulamay\u0131 bu kullan\u0131c\u0131yla \u00e7al\u0131\u015ft\u0131r\u0131n (<code>USER<\/code> komutu).<\/li>\n<li><strong>Gereksiz Portlar\u0131 A\u00e7may\u0131n:<\/strong> Sadece uygulaman\u0131z\u0131n ihtiya\u00e7 duydu\u011fu portlar\u0131 a\u00e7\u0131n.<\/li>\n<li><strong>\u0130majlar\u0131 G\u00fcncel Tutun:<\/strong> Temel imajlar\u0131n\u0131z\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131z\u0131 d\u00fczenli olarak g\u00fcncelleyin.<\/li>\n<li><strong>Hassas Verileri Gizleyin:<\/strong> Ortam de\u011fi\u015fkenleri veya Docker Secrets\/Vault gibi ara\u00e7lar\u0131 kullanarak hassas verileri y\u00f6netin.<\/li>\n<\/ul>\n<h4>6. CI\/CD Entegrasyonu<\/h4>\n<p>\u00dcretim ortam\u0131nda, uygulamalar\u0131n\u0131z\u0131 otomatik olarak derlemek, test etmek ve da\u011f\u0131tmak i\u00e7in GitLab CI\/CD, GitHub Actions veya Jenkins gibi s\u00fcrekli entegrasyon\/s\u00fcrekli da\u011f\u0131t\u0131m (CI\/CD) ara\u00e7lar\u0131n\u0131 kullanman\u0131z \u00f6nerilir. Bu, da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini h\u0131zland\u0131r\u0131r ve insan hatas\u0131n\u0131 azalt\u0131r.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu rehberde, bir Flask uygulamas\u0131n\u0131 Docker kullanarak Ubuntu 20.04 \u00fczerinde nas\u0131l olu\u015fturaca\u011f\u0131m\u0131z\u0131 ve da\u011f\u0131taca\u011f\u0131m\u0131z\u0131 ayr\u0131nt\u0131l\u0131 olarak inceledik. \u0130lk olarak, sistemimize Docker ve Docker Compose&#8217;u kurduk. Ard\u0131ndan, basit bir Flask uygulamas\u0131 olu\u015fturup bunu bir <code>Dockerfile<\/code> ile konteynerize ettik. Son olarak, <code>docker-compose.yml<\/code> kullanarak \u00e7ok konteynerli bir uygulama yap\u0131s\u0131 kurmay\u0131 ve Nginx ile ters proxy gibi \u00fcretim ortam\u0131 da\u011f\u0131t\u0131m\u0131nda dikkat edilmesi gereken \u00f6nemli noktalar\u0131 ele ald\u0131k.<\/p>\n<p>Flask ve Docker&#8217;\u0131n birle\u015fimi, geli\u015ftiricilere h\u0131zl\u0131, tutarl\u0131 ve \u00f6l\u00e7eklenebilir uygulamalar olu\u015fturma ve da\u011f\u0131tma g\u00fcc\u00fc verir. Konteynerizasyon, &#8220;benim makinemde \u00e7al\u0131\u015f\u0131yordu&#8221; sorununu ortadan kald\u0131r\u0131r ve geli\u015ftirme ile \u00fcretim ortamlar\u0131 aras\u0131nda tutarl\u0131l\u0131k sa\u011flar. Docker Compose ise, karma\u015f\u0131k \u00e7ok servisli uygulamalar\u0131n y\u00f6netimini basitle\u015ftirir.<\/p>\n<p>Bu rehber, Flask uygulaman\u0131z\u0131 Docker ile ba\u015far\u0131l\u0131 bir \u015fekilde da\u011f\u0131tman\u0131z i\u00e7in sa\u011flam bir temel sa\u011flam\u0131\u015ft\u0131r. Daha karma\u015f\u0131k senaryolar i\u00e7in Docker Swarm veya Kubernetes gibi konteyner orkestrasyon ara\u00e7lar\u0131n\u0131, bulut platformlar\u0131n\u0131 (AWS ECS, Google Cloud Run, Azure Container Instances) ve geli\u015fmi\u015f izleme\/g\u00fcnl\u00fckleme \u00e7\u00f6z\u00fcmlerini ara\u015ft\u0131rmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz. Unutmay\u0131n, modern uygulama geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinde \u00f6\u011frenme ve adapte olma s\u00fcreklidir. Bu bilgilerle, kendi Dockerize edilmi\u015f Flask uygulamalar\u0131n\u0131z\u0131 g\u00fcvenle olu\u015fturmaya ve da\u011f\u0131tmaya haz\u0131rs\u0131n\u0131z!<br \/>\n<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Flask Uygulamas\u0131n\u0131 Docker ile Ubuntu 20.04 \u00dczerinde Olu\u015fturma ve Da\u011f\u0131tma Rehberi\nGiri\u015f\nG\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen yaz\u0131l\u0131m d\u00fcnyas\u0131nda,","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":[1468],"tags":[],"class_list":{"0":"post-37636","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ubuntu","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>Flask Uygulamas\u0131n\u0131 Docker ile Ubuntu 20.04 \u00dczerinde Olu\u015fturma ve Da\u011f\u0131tma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\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\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flask Uygulamas\u0131n\u0131 Docker ile Ubuntu 20.04 \u00dczerinde Olu\u015fturma ve Da\u011f\u0131tma Rehberi\" \/>\n<meta property=\"og:description\" content=\"Flask Uygulamas\u0131n\u0131 Docker ile Ubuntu 20.04 \u00dczerinde Olu\u015fturma ve Da\u011f\u0131tma Rehberi Giri\u015f G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen yaz\u0131l\u0131m d\u00fcnyas\u0131nda,\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-11T06:40:46+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=\"17 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Flask Uygulamas\u0131n\u0131 Docker ile Ubuntu 20.04 \u00dczerinde Olu\u015fturma ve Da\u011f\u0131tma Rehberi\",\"datePublished\":\"2026-01-11T06:40:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/\"},\"wordCount\":2506,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Ubuntu\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/\",\"name\":\"Flask Uygulamas\u0131n\u0131 Docker ile Ubuntu 20.04 \u00dczerinde Olu\u015fturma ve Da\u011f\u0131tma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-11T06:40:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Flask Uygulamas\u0131n\u0131 Docker ile Ubuntu 20.04 \u00dczerinde Olu\u015fturma ve Da\u011f\u0131tma 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":"Flask Uygulamas\u0131n\u0131 Docker ile Ubuntu 20.04 \u00dczerinde Olu\u015fturma ve Da\u011f\u0131tma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Flask Uygulamas\u0131n\u0131 Docker ile Ubuntu 20.04 \u00dczerinde Olu\u015fturma ve Da\u011f\u0131tma Rehberi","og_description":"Flask Uygulamas\u0131n\u0131 Docker ile Ubuntu 20.04 \u00dczerinde Olu\u015fturma ve Da\u011f\u0131tma Rehberi Giri\u015f G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen yaz\u0131l\u0131m d\u00fcnyas\u0131nda,","og_url":"https:\/\/fatihsoysal.com\/blog\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-11T06:40:46+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"17 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Flask Uygulamas\u0131n\u0131 Docker ile Ubuntu 20.04 \u00dczerinde Olu\u015fturma ve Da\u011f\u0131tma Rehberi","datePublished":"2026-01-11T06:40:46+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/"},"wordCount":2506,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Ubuntu"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/","name":"Flask Uygulamas\u0131n\u0131 Docker ile Ubuntu 20.04 \u00dczerinde Olu\u015fturma ve Da\u011f\u0131tma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-11T06:40:46+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/flask-uygulamasini-docker-ile-ubuntu-20-04-uzerinde-olusturma-ve-dagitma-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Flask Uygulamas\u0131n\u0131 Docker ile Ubuntu 20.04 \u00dczerinde Olu\u015fturma ve Da\u011f\u0131tma 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\/37636","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=37636"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37636\/revisions"}],"predecessor-version":[{"id":37637,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37636\/revisions\/37637"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37636"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37636"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37636"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}