{"id":32002,"date":"2025-10-16T15:41:26","date_gmt":"2025-10-16T12:41:26","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=32002"},"modified":"2025-10-16T15:41:26","modified_gmt":"2025-10-16T12:41:26","slug":"docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/","title":{"rendered":"Docker ve Docker Compose Kullanarak Ubuntu 16.04 \u00dczerinde S\u00fcrekli Entegrasyon (CI) Test Ortam\u0131 Yap\u0131land\u0131rma"},"content":{"rendered":"<p><body><\/p>\n<h2>Docker ve Docker Compose Kullanarak Ubuntu 16.04 \u00dczerinde S\u00fcrekli Entegrasyon (CI) Test Ortam\u0131 Yap\u0131land\u0131rma<\/h2>\n<p>S\u00fcrekli Entegrasyon (Continuous Integration &#8211; CI), modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinin temel ta\u015flar\u0131ndan biridir. Geli\u015ftiricilerin kod de\u011fi\u015fikliklerini d\u00fczenli olarak merkezi bir depoya entegre etmelerini ve bu entegrasyonun otomatik olarak test edilmesini sa\u011flayan bir yaz\u0131l\u0131m geli\u015ftirme uygulamas\u0131d\u0131r. Bu makalede, Docker ve Docker Compose teknolojilerini kullanarak Ubuntu 16.04 i\u015fletim sistemi \u00fczerinde nas\u0131l bir CI test ortam\u0131 kurulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Ubuntu 16.04, baz\u0131 kurumsal ortamlarda hala yayg\u0131n olarak kullan\u0131lan stabil bir s\u00fcr\u00fcm olmas\u0131 nedeniyle bu makale i\u00e7in tercih edilmi\u015ftir, ancak belirtilen ad\u0131mlar ve prensipler, daha yeni Ubuntu s\u00fcr\u00fcmleri i\u00e7in de b\u00fcy\u00fck \u00f6l\u00e7\u00fcde ge\u00e7erlidir.<\/p>\n<h3>Giri\u015f: S\u00fcrekli Entegrasyon ve Konteynerle\u015fmenin G\u00fcc\u00fc<\/h3>\n<p>Yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7leri, g\u00fcn\u00fcm\u00fczde hi\u00e7 olmad\u0131\u011f\u0131 kadar h\u0131zl\u0131 ve karma\u015f\u0131k hale gelmi\u015ftir. \u00c7ok say\u0131da geli\u015ftiricinin ayn\u0131 anda \u00e7al\u0131\u015ft\u0131\u011f\u0131 projelerde, kod entegrasyonu ve test s\u00fcre\u00e7leri b\u00fcy\u00fck zorluklar yaratabilir. \u0130\u015fte bu noktada S\u00fcrekli Entegrasyon (CI) devreye girer. CI, her kod de\u011fi\u015fikli\u011finin otomatik olarak birle\u015ftirilmesini (build) ve test edilmesini sa\u011flayarak, entegrasyon sorunlar\u0131n\u0131n erken a\u015famada tespit edilmesine olanak tan\u0131r. Bu sayede, geli\u015ftirme d\u00f6ng\u00fcs\u00fc h\u0131zlan\u0131r, hatalar daha az maliyetle d\u00fczeltilir ve yaz\u0131l\u0131m\u0131n kalitesi artar.<\/p>\n<p>CI ortamlar\u0131n\u0131n en b\u00fcy\u00fck zorluklar\u0131ndan biri, testlerin her zaman tutarl\u0131 ve izole bir ortamda \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamakt\u0131r. &#8220;Benim bilgisayar\u0131mda \u00e7al\u0131\u015f\u0131yordu!&#8221; sendromu, geli\u015ftiricilerin s\u0131kl\u0131kla kar\u015f\u0131la\u015ft\u0131\u011f\u0131 bir durumdur. Bu sorunu \u00e7\u00f6zmek i\u00e7in konteyner teknolojileri, \u00f6zellikle Docker, m\u00fckemmel bir \u00e7\u00f6z\u00fcm sunar. Docker, uygulamalar\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 hafif, ta\u015f\u0131nabilir ve izole edilmi\u015f konteynerler i\u00e7inde paketlemeyi sa\u011flar. Docker Compose ise, birden fazla Docker konteynerini i\u00e7eren uygulamalar\u0131 tan\u0131mlamak ve \u00e7al\u0131\u015ft\u0131rmak i\u00e7in bir ara\u00e7t\u0131r.<\/p>\n<p>Bu makalede, Ubuntu 16.04 \u00fczerinde Docker ve Docker Compose&#8217;u kuracak, basit bir \u00f6rnek uygulama i\u00e7in CI test ortam\u0131n\u0131 yap\u0131land\u0131racak ve bu ortam\u0131 nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m g\u00f6sterece\u011fiz. Ama\u00e7, geli\u015ftiricilere ve DevOps m\u00fchendislerine, tutarl\u0131, tekrarlanabilir ve verimli bir test altyap\u0131s\u0131 kurmalar\u0131 i\u00e7in gerekli bilgi ve ara\u00e7lar\u0131 sa\u011flamakt\u0131r.<\/p>\n<h3>\u00d6n Gereksinimler ve Ortam Kurulumu<\/h3>\n<p>CI test ortam\u0131m\u0131z\u0131 yap\u0131land\u0131rmaya ba\u015flamadan \u00f6nce, Ubuntu 16.04 sunucumuzda gerekli \u00f6n gereksinimleri kar\u015f\u0131lamam\u0131z ve Docker ile Docker Compose&#8217;u kurmam\u0131z gerekmektedir.<\/p>\n<h4>Ubuntu 16.04 Sisteminin Haz\u0131rlanmas\u0131<\/h4>\n<p>\u0130lk ad\u0131m, Ubuntu 16.04 sisteminizin g\u00fcncel oldu\u011fundan emin olmakt\u0131r. Terminali a\u00e7\u0131n ve a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt upgrade -y<\/code><\/pre>\n<p>Bu komutlar, sistemdeki paket listesini g\u00fcnceller ve mevcut t\u00fcm paketleri en son s\u00fcr\u00fcmlerine y\u00fckseltir.<\/p>\n<h4>Docker Kurulumu<\/h4>\n<p>Ubuntu 16.04 \u00fczerinde Docker CE (Community Edition) kurulumu i\u00e7in en g\u00fcvenli ve \u00f6nerilen y\u00f6ntem, Docker&#8217;\u0131n resmi deposunu kullanmakt\u0131r.<\/p>\n<h5>1. Gerekli Paketlerin Kurulumu<\/h5>\n<p>Docker deposunu kullanmak i\u00e7in baz\u0131 \u00f6nko\u015ful paketlerini y\u00fcklememiz gerekir:<\/p>\n<pre><code class=\"language-bash\">sudo apt install -y apt-transport-https ca-certificates curl software-properties-common<\/code><\/pre>\n<p>*   <code>apt-transport-https<\/code>: HTTPS \u00fczerinden depolar\u0131 kullanmak i\u00e7in.<br \/>\n*   <code>ca-certificates<\/code>: SSL\/TLS sertifikalar\u0131 i\u00e7in.<br \/>\n*   <code>curl<\/code>: URL&#8217;lerden veri almak i\u00e7in.<br \/>\n*   <code>software-properties-common<\/code>: Depo ekleme\/kald\u0131rma gibi i\u015flemleri kolayla\u015ft\u0131rmak i\u00e7in.<\/p>\n<h5>2. Docker&#8217;\u0131n GPG Anahtar\u0131n\u0131 Ekleme<\/h5>\n<p>Docker&#8217;\u0131n resmi GPG anahtar\u0131n\u0131 sistemimize ekleyerek, indirdi\u011fimiz paketlerin do\u011frulu\u011funu teyit edebiliriz:<\/p>\n<pre><code class=\"language-bash\">curl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | sudo apt-key add -<\/code><\/pre>\n<p>Bu komut, Docker&#8217;\u0131n GPG anahtar\u0131n\u0131 indirir ve <code>apt<\/code> anahtar halkas\u0131na ekler.<\/p>\n<h5>3. Docker Deposunu Ekleme<\/h5>\n<p>\u015eimdi, Docker&#8217;\u0131n kararl\u0131 (stable) deposunu Ubuntu 16.04 i\u00e7in <code>apt<\/code> kaynaklar\u0131m\u0131za ekleyebiliriz:<\/p>\n<pre><code class=\"language-bash\">sudo add-apt-repository \"deb [arch=amd64] https:\/\/download.docker.com\/linux\/ubuntu xenial stable\"<\/code><\/pre>\n<p>Burada <code>xenial<\/code>, Ubuntu 16.04&#8217;\u00fcn kod ad\u0131d\u0131r. <code>amd64<\/code> ise i\u015flemci mimarisini belirtir.<\/p>\n<h5>4. Docker CE Kurulumu<\/h5>\n<p>Depoyu ekledikten sonra, <code>apt<\/code> paket listesini tekrar g\u00fcncellemeli ve Docker CE&#8217;yi kurmal\u0131y\u0131z:<\/p>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt install -y docker-ce<\/code><\/pre>\n<p>Kurulum tamamland\u0131ktan sonra, Docker servisi otomatik olarak ba\u015flayacakt\u0131r.<\/p>\n<h5>5. Docker Servisini Kontrol Etme<\/h5>\n<p>Docker servisinin \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in a\u015fa\u011f\u0131daki komutu kullan\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl status docker<\/code><\/pre>\n<p>\u00c7\u0131kt\u0131da <code>active (running)<\/code> ifadesini g\u00f6rmelisiniz.<\/p>\n<h5>6. Docker Komutlar\u0131n\u0131 Sudo Olmadan \u00c7al\u0131\u015ft\u0131rma (\u0130ste\u011fe Ba\u011fl\u0131 ama \u00d6nerilen)<\/h5>\n<p>Her Docker komutunu \u00e7al\u0131\u015ft\u0131r\u0131rken <code>sudo<\/code> yazmaktan ka\u00e7\u0131nmak i\u00e7in, mevcut kullan\u0131c\u0131n\u0131z\u0131 <code>docker<\/code> grubuna ekleyebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">sudo usermod -aG docker $USER<\/code><\/pre>\n<p>Bu de\u011fi\u015fikli\u011fin etkili olmas\u0131 i\u00e7in oturumu kapat\u0131p tekrar a\u00e7man\u0131z veya sistemi yeniden ba\u015flatman\u0131z gerekebilir. Oturumunuzu yeniden ba\u015flatt\u0131ktan sonra, <code>sudo<\/code> kullanmadan bir Docker komutu \u00e7al\u0131\u015ft\u0131rarak test edebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">docker run hello-world<\/code><\/pre>\n<p>Bu komut, Docker&#8217;\u0131n do\u011fru \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6steren bir &#8220;Hello from Docker!&#8221; mesaj\u0131 d\u00f6nd\u00fcrmelidir.<\/p>\n<h4>Docker Compose Kurulumu<\/h4>\n<p>Docker Compose, birden fazla konteynerden olu\u015fan uygulamalar\u0131 tan\u0131mlamak ve \u00e7al\u0131\u015ft\u0131rmak i\u00e7in bir ara\u00e7t\u0131r. Kurulumu da olduk\u00e7a basittir.<\/p>\n<h5>1. Docker Compose \u0130ndirme<\/h5>\n<p>Docker Compose&#8217;un en son kararl\u0131 s\u00fcr\u00fcm\u00fcn\u00fc do\u011frudan GitHub deposundan indirebiliriz. \u00d6nce mevcut en son s\u00fcr\u00fcm\u00fc kontrol edin (\u00f6rne\u011fin, [https:\/\/github.com\/docker\/compose\/releases](https:\/\/github.com\/docker\/compose\/releases) adresinden). Bu makalenin yaz\u0131ld\u0131\u011f\u0131 an itibar\u0131yla 1.29.2 son kararl\u0131 s\u00fcr\u00fcmd\u00fcr, ancak siz her zaman en yenisini kullanmal\u0131s\u0131n\u0131z.<\/p>\n<pre><code class=\"language-bash\">sudo curl -L \"https:\/\/github.com\/docker\/compose\/releases\/download\/1.29.2\/docker-compose-$(uname -s)-$(uname -m)\" -o \/usr\/local\/bin\/docker-compose<\/code><\/pre>\n<p>Bu komut, Docker Compose ikili dosyas\u0131n\u0131 indirir ve <code>\/usr\/local\/bin<\/code> dizinine kaydeder. <code>$(uname -s)<\/code> ve <code>$(uname -m)<\/code> komutlar\u0131, s\u0131ras\u0131yla i\u015fletim sistemi ad\u0131n\u0131 (Linux) ve makine mimarisini (x86_64) otomatik olarak alg\u0131lar.<\/p>\n<h5>2. \u00c7al\u0131\u015ft\u0131rma \u0130zinleri Verme<\/h5>\n<p>\u0130ndirdi\u011fimiz dosyaya \u00e7al\u0131\u015ft\u0131rma izinleri vermemiz gerekir:<\/p>\n<pre><code class=\"language-bash\">sudo chmod +x \/usr\/local\/bin\/docker-compose<\/code><\/pre>\n<h5>3. Docker Compose Kurulumunu Do\u011frulama<\/h5>\n<p>Kurulumun ba\u015far\u0131l\u0131 oldu\u011funu do\u011frulamak i\u00e7in s\u00fcr\u00fcm kontrol\u00fc yap\u0131n:<\/p>\n<pre><code class=\"language-bash\">docker-compose --version<\/code><\/pre>\n<p>\u00c7\u0131kt\u0131da indirdi\u011finiz s\u00fcr\u00fcme benzer bir ifade g\u00f6rmelisiniz (\u00f6rn: <code>docker-compose version 1.29.2, build 5bd41ab1<\/code>).<\/p>\n<p>Art\u0131k Ubuntu 16.04 sistemimiz \u00fczerinde Docker ve Docker Compose ba\u015far\u0131yla kurulmu\u015ftur. CI test ortam\u0131m\u0131z\u0131 yap\u0131land\u0131rmak i\u00e7in haz\u0131r\u0131z.<\/p>\n<h3>S\u00fcrekli Entegrasyon (CI) Kavramlar\u0131 ve Docker ile Entegrasyonu<\/h3>\n<p>CI&#8217;\u0131n temel amac\u0131, yaz\u0131l\u0131m geli\u015ftirme s\u00fcrecindeki entegrasyon sorunlar\u0131n\u0131 m\u00fcmk\u00fcn oldu\u011funca erken tespit etmektir. Bu, geli\u015ftiricilerin s\u0131k s\u0131k (g\u00fcnde birka\u00e7 kez) kodlar\u0131n\u0131 merkezi bir depoya g\u00f6ndermeleri ve her g\u00f6nderimin ard\u0131ndan otomatik bir build ve test s\u00fcrecinin tetiklenmesiyle sa\u011flan\u0131r.<\/p>\n<h4>CI \u0130\u015f Ak\u0131\u015f\u0131<\/h4>\n<p>Tipik bir CI i\u015f ak\u0131\u015f\u0131 a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 i\u00e7erir:<\/p>\n<p>1.  <strong>Kod De\u011fi\u015fikli\u011fi:<\/strong> Geli\u015ftirici, yerel makinesinde kod de\u011fi\u015fiklikleri yapar.<br \/>\n2.  <strong>Commit ve Push:<\/strong> De\u011fi\u015fiklikler, Git gibi bir s\u00fcr\u00fcm kontrol sistemine commit edilir ve merkezi depoya (\u00f6rn. GitHub, GitLab) push edilir.<br \/>\n3.  <strong>CI Sunucusu Tetiklenmesi:<\/strong> Merkezi depoya yap\u0131lan her push, CI sunucusunu (\u00f6rn. Jenkins, GitLab CI, CircleCI) tetikler.<br \/>\n4.  <strong>Kod \u00c7ekme:<\/strong> CI sunucusu, en son kodu depodan \u00e7eker.<br \/>\n5.  <strong>Build:<\/strong> Uygulama derlenir veya paketlenir (\u00f6rn. Java i\u00e7in JAR, Node.js i\u00e7in ba\u011f\u0131ml\u0131l\u0131klar\u0131n y\u00fcklenmesi).<br \/>\n6.  <strong>Test:<\/strong> Birim testleri (unit tests), entegrasyon testleri (integration tests) ve bazen u\u00e7tan uca testler (end-to-end tests) otomatik olarak \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r.<br \/>\n7.  <strong>Raporlama:<\/strong> Test sonu\u00e7lar\u0131 toplan\u0131r ve geli\u015ftiricilere, tak\u0131ma veya bir dashboard&#8217;a raporlan\u0131r.<br \/>\n8.  <strong>Geri Bildirim:<\/strong> Testler ba\u015far\u0131s\u0131z olursa, geli\u015ftiriciye an\u0131nda geri bildirim sa\u011flan\u0131r, b\u00f6ylece sorun h\u0131zla d\u00fczeltilebilir. Testler ba\u015far\u0131l\u0131 olursa, kod bir sonraki a\u015famaya (\u00f6rn. S\u00fcrekli Da\u011f\u0131t\u0131m &#8211; CD) ge\u00e7ebilir.<\/p>\n<h4>Neden Docker CI \u0130\u00e7in \u0130dealdir?<\/h4>\n<p>Docker, CI s\u00fcre\u00e7lerine paha bi\u00e7ilmez faydalar sa\u011flar:<\/p>\n<p>*   <strong>Ortam Tutarl\u0131l\u0131\u011f\u0131:<\/strong> Docker konteynerleri, uygulaman\u0131n t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 (i\u015fletim sistemi, k\u00fct\u00fcphaneler, \u00e7al\u0131\u015fma zaman\u0131) i\u00e7erir. Bu, geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 aras\u0131nda &#8220;\u00e7al\u0131\u015fan bir \u015feyin ba\u015fka bir yerde \u00e7al\u0131\u015fmamas\u0131&#8221; sorununu ortadan kald\u0131r\u0131r. Testler her zaman ayn\u0131 ortamda \u00e7al\u0131\u015f\u0131r.<br \/>\n*   <strong>\u0130zolasyon:<\/strong> Her test \u00e7al\u0131\u015ft\u0131rmas\u0131 veya her proje i\u00e7in ayr\u0131 bir Docker konteyneri veya konteyner seti kullan\u0131labilir. Bu, testlerin birbirini etkilemesini engeller ve temiz bir ba\u015flang\u0131\u00e7 ortam\u0131 sa\u011flar.<br \/>\n*   <strong>H\u0131zl\u0131 Geri D\u00f6n\u00fc\u015fler:<\/strong> Konteynerler h\u0131zl\u0131 bir \u015fekilde ba\u015flat\u0131l\u0131p durdurulabilir. Bu, test ortam\u0131n\u0131n h\u0131zl\u0131 bir \u015fekilde kurulup kald\u0131r\u0131lmas\u0131na olanak tan\u0131r, b\u00f6ylece geli\u015ftiriciler daha h\u0131zl\u0131 geri bildirim alabilirler.<br \/>\n*   <strong>Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi:<\/strong> Veritabanlar\u0131, mesaj kuyruklar\u0131 gibi harici ba\u011f\u0131ml\u0131l\u0131klar da Docker konteynerleri olarak tan\u0131mlanabilir ve Docker Compose ile kolayca y\u00f6netilebilir. Bu, test ortam\u0131n\u0131 kurma karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 azalt\u0131r.<br \/>\n*   <strong>Ta\u015f\u0131nabilirlik:<\/strong> Dockerfile ve Docker Compose dosyalar\u0131, ortam\u0131n yap\u0131land\u0131rmas\u0131n\u0131 kod olarak tan\u0131mlar. Bu dosyalar s\u00fcr\u00fcm kontrol sisteminde tutulabilir ve farkl\u0131 makinelerde kolayca \u00e7o\u011falt\u0131labilir.<br \/>\n*   <strong>\u00d6l\u00e7eklenebilirlik:<\/strong> \u0130htiya\u00e7 duyuldu\u011funda, ayn\u0131 CI i\u015f ak\u0131\u015f\u0131n\u0131 paralel olarak birden fazla konteynerde \u00e7al\u0131\u015ft\u0131rarak testleri h\u0131zland\u0131rmak m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<h3>\u00d6rnek Bir Uygulama ve Test Senaryosu<\/h3>\n<p>CI ortam\u0131m\u0131z\u0131 somutla\u015ft\u0131rmak i\u00e7in basit bir Python Flask uygulamas\u0131 ve ona ait birim testleri kullanaca\u011f\u0131z. Ayr\u0131ca, uygulaman\u0131n bir PostgreSQL veritaban\u0131na ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 oldu\u011funu varsayaca\u011f\u0131z.<\/p>\n<h4>Uygulama Yap\u0131s\u0131<\/h4>\n<p>Proje dizinimiz a\u015fa\u011f\u0131daki gibi olacakt\u0131r:<\/p>\n<pre><code class=\"language-\">my-flask-app\/\n\u251c\u2500\u2500 app\/\n\u2502   \u251c\u2500\u2500 __init__.py\n\u2502   \u251c\u2500\u2500 app.py\n\u2502   \u2514\u2500\u2500 database.py\n\u251c\u2500\u2500 tests\/\n\u2502   \u251c\u2500\u2500 __init__.py\n\u2502   \u2514\u2500\u2500 test_app.py\n\u251c\u2500\u2500 requirements.txt\n\u251c\u2500\u2500 Dockerfile\n\u2514\u2500\u2500 docker-compose.yml<\/code><\/pre>\n<h5><code>requirements.txt<\/code><\/h5>\n<p>Uygulaman\u0131n Python ba\u011f\u0131ml\u0131l\u0131klar\u0131:<\/p>\n<pre><code class=\"language-\">Flask\npsycopg2-binary\npytest<\/code><\/pre>\n<h5><code>app\/app.py<\/code><\/h5>\n<p>Basit bir Flask uygulamas\u0131. Bir ana sayfa ve veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 kontrol eden bir u\u00e7 nokta i\u00e7erir.<\/p>\n<pre><code class=\"language-python\">from flask import Flask, jsonify\nimport os\nimport psycopg2\n\napp = Flask(__name__)\n\ndef get_db_connection():\n    conn = psycopg2.connect(\n        host=os.environ.get('DB_HOST', 'localhost'),\n        database=os.environ.get('DB_NAME', 'testdb'),\n        user=os.environ.get('DB_USER', 'testuser'),\n        password=os.environ.get('DB_PASSWORD', 'testpassword')\n    )\n    return conn\n\n@app.route('\/')\ndef hello():\n    return \"Merhaba, Docker CI D\u00fcnyas\u0131!\"\n\n@app.route('\/db_status')\ndef db_status():\n    try:\n        conn = get_db_connection()\n        cur = conn.cursor()\n        cur.execute('SELECT 1')\n        cur.close()\n        conn.close()\n        return jsonify(status=\"Veritaban\u0131 ba\u011flant\u0131s\u0131 ba\u015far\u0131l\u0131!\"), 200\n    except Exception as e:\n        return jsonify(status=f\"Veritaban\u0131 ba\u011flant\u0131 hatas\u0131: {str(e)}\"), 500\n\nif __name__ == '__main__':\n    app.run(host='0.0.0.0', port=5000)<\/code><\/pre>\n<h5><code>app\/database.py<\/code> (Basit bir veritaban\u0131 ba\u015flatma beti\u011fi)<\/h5>\n<p>Bu betik, testler i\u00e7in basit bir tablo olu\u015fturmak amac\u0131yla kullan\u0131lacak.<\/p>\n<pre><code class=\"language-python\">import psycopg2\nimport os\n\ndef init_db():\n    conn = None\n    try:\n        conn = psycopg2.connect(\n            host=os.environ.get('DB_HOST', 'localhost'),\n            database=os.environ.get('DB_NAME', 'testdb'),\n            user=os.environ.get('DB_USER', 'testuser'),\n            password=os.environ.get('DB_PASSWORD', 'testpassword')\n        )\n        cur = conn.cursor()\n        cur.execute(\"CREATE TABLE IF NOT EXISTS messages (id SERIAL PRIMARY KEY, text VARCHAR NOT NULL);\")\n        conn.commit()\n        print(\"Veritaban\u0131 ba\u015far\u0131yla ba\u015flat\u0131ld\u0131 ve tablo olu\u015fturuldu.\")\n        cur.close()\n    except Exception as e:\n        print(f\"Veritaban\u0131 ba\u015flatma hatas\u0131: {e}\")\n    finally:\n        if conn:\n            conn.close()\n\nif __name__ == '__main__':\n    init_db()<\/code><\/pre>\n<h5><code>tests\/test_app.py<\/code><\/h5>\n<p>Uygulama i\u00e7in birim ve entegrasyon testleri (Pytest kullanarak).<\/p>\n<pre><code class=\"language-python\">import pytest\nfrom app.app import app, get_db_connection\nimport os\nimport time\nimport psycopg2\n\n@pytest.fixture\ndef client():\n    app.config['TESTING'] = True\n    with app.test_client() as client:\n        yield client\n\ndef test_hello_route(client):\n    response = client.get('\/')\n    assert response.status_code == 200\n    assert b\"Merhaba, Docker CI D\u00fcnyas\u0131!\" in response.data\n\ndef test_db_status_route_success(client):\n    # Veritaban\u0131n\u0131n haz\u0131r oldu\u011fundan emin olmak i\u00e7in k\u0131sa bir bekleme\n    # Ger\u00e7ek CI ortamlar\u0131nda healthcheck veya wait-for-it scriptleri kullan\u0131l\u0131r\n    time.sleep(5) \n    \n    # Test i\u00e7in ge\u00e7ici olarak veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 sim\u00fcle edelim veya \n    # ger\u00e7ek bir veritaban\u0131 ba\u011flant\u0131s\u0131 kurmaya \u00e7al\u0131\u015fal\u0131m.\n    # Bu testin \u00e7al\u0131\u015fmas\u0131 i\u00e7in docker-compose'daki db servisi ayakta olmal\u0131.\n    \n    # Basit bir entegrasyon testi i\u00e7in, veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 kontrol edelim.\n    try:\n        conn = get_db_connection()\n        cur = conn.cursor()\n        cur.execute('SELECT 1')\n        cur.close()\n        conn.close()\n        db_connected = True\n    except Exception:\n        db_connected = False\n    \n    if db_connected:\n        response = client.get('\/db_status')\n        assert response.status_code == 200\n        assert b\"Veritaban\u0131 ba\u011flant\u0131s\u0131 ba\u015far\u0131l\u0131!\" in response.data\n    else:\n        # E\u011fer test ortam\u0131nda veritaban\u0131 yoksa, bu testin ge\u00e7mesini sa\u011flamak i\u00e7in\n        # veya farkl\u0131 bir hata kodu beklemek i\u00e7in bu k\u0131sm\u0131 d\u00fczenleyebilirsiniz.\n        # Bu senaryoda, veritaban\u0131 ba\u011flant\u0131s\u0131 ba\u015far\u0131s\u0131z olaca\u011f\u0131 i\u00e7in 500 bekleriz.\n        response = client.get('\/db_status')\n        assert response.status_code == 500\n        assert b\"Veritaban\u0131 ba\u011flant\u0131 hatas\u0131\" in response.data<\/code><\/pre>\n<h4><code>Dockerfile<\/code><\/h4>\n<p>Uygulamam\u0131z\u0131 bir Docker imaj\u0131na d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in <code>Dockerfile<\/code>:<\/p>\n<pre><code class=\"language-dockerfile\"># Temel imaj olarak Python 3.6 kullan (Ubuntu 16.04 ile uyumlu ve stabil)\nFROM python:3.6-slim-stretch\n\n<h2>\u00c7al\u0131\u015fma dizinini ayarla<\/h2>\nWORKDIR \/app\n\n<h2>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 kopyala ve kur<\/h2>\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\n\n<h2>Uygulama kodunu kopyala<\/h2>\nCOPY app\/ .\n\n<h2>Veritaban\u0131 ba\u015flatma beti\u011fini kopyala<\/h2>\nCOPY app\/database.py .\n\n<h2>Uygulama portunu a\u00e7\u0131\u011fa \u00e7\u0131kar<\/h2>\nEXPOSE 5000\n\n<h2>Veritaban\u0131n\u0131 ba\u015flat (sadece test ortam\u0131nda veya ilk \u00e7al\u0131\u015ft\u0131rmada)<\/h2>\n<h2>Bu komutu entrypoint'e koymak yerine docker-compose'da 'command' olarak kontrol etmek daha iyi<\/h2>\n<h2>CMD [\"python\", \"app.py\"]<\/code><\/pre>\n<\/h2>\n<p><strong>Not:<\/strong> Yukar\u0131daki <code>Dockerfile<\/code> sadece uygulaman\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 ve kodunu i\u00e7erir. Testleri \u00e7al\u0131\u015ft\u0131rmak i\u00e7in ayr\u0131 bir mekanizma veya ayn\u0131 imaj\u0131 farkl\u0131 bir komutla kullanaca\u011f\u0131z.<\/p>\n<h3>Docker Compose ile CI Ortam\u0131n\u0131 Tan\u0131mlama<\/h3>\n<p>\u015eimdi <code>docker-compose.yml<\/code> dosyas\u0131n\u0131 olu\u015fturarak CI test ortam\u0131m\u0131z\u0131 tan\u0131mlayaca\u011f\u0131z. Bu dosya, uygulamam\u0131z\u0131, veritaban\u0131m\u0131z\u0131 ve testlerimizi \u00e7al\u0131\u015ft\u0131racak servisleri i\u00e7erecek.<\/p>\n<h5><code>docker-compose.yml<\/code><\/h5>\n<pre><code class=\"language-yaml\">version: '3.8'\n\nservices:\n  # Uygulama servisi\n  app:\n    build:\n      context: .\n      dockerfile: Dockerfile\n    image: my-flask-app:latest # \u0130ste\u011fe ba\u011fl\u0131 olarak bir imaj ad\u0131 verilebilir\n    ports:\n      - \"5000:5000\"\n    environment:\n      # Veritaban\u0131 ba\u011flant\u0131 bilgileri\n      DB_HOST: db\n      DB_NAME: testdb\n      DB_USER: testuser\n      DB_PASSWORD: testpassword\n    depends_on:\n      db:\n        condition: service_healthy # db servisi sa\u011fl\u0131kl\u0131 olana kadar bekle\n\n  # Veritaban\u0131 servisi (PostgreSQL)\n  db:\n    image: postgres:9.6 # Ubuntu 16.04 d\u00f6neminde pop\u00fcler olan bir s\u00fcr\u00fcm\n    environment:\n      POSTGRES_DB: testdb\n      POSTGRES_USER: testuser\n      POSTGRES_PASSWORD: testpassword\n    volumes:\n      - db_data:\/var\/lib\/postgresql\/data # Veritaban\u0131 verilerini kal\u0131c\u0131 hale getir\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready -U testuser -d testdb\"]\n      interval: 5s\n      timeout: 5s\n      retries: 5\n\n  # Test servisi\n  test:\n    build:\n      context: .\n      dockerfile: Dockerfile\n    environment:\n      DB_HOST: db\n      DB_NAME: testdb\n      DB_USER: testuser\n      DB_PASSWORD: testpassword\n    depends_on:\n      app:\n        condition: service_healthy # Uygulama servisi sa\u011fl\u0131kl\u0131 olana kadar bekle\n      db:\n        condition: service_healthy # Veritaban\u0131 servisi sa\u011fl\u0131kl\u0131 olana kadar bekle\n    # Testleri \u00e7al\u0131\u015ft\u0131rmadan \u00f6nce veritaban\u0131n\u0131 ba\u015flatma beti\u011fini \u00e7al\u0131\u015ft\u0131r\n    entrypoint: [\"\/bin\/sh\", \"-c\"]\n    command:\n      - |\n        python database.py &&\n        pytest tests\/\n    volumes:\n      - .\/tests:\/app\/tests # Test dosyalar\u0131n\u0131 ba\u011fla\n      - .\/app:\/app\/app # Uygulama dosyalar\u0131n\u0131 ba\u011fla (testlerin uygulamaya eri\u015fmesi i\u00e7in)\n\nvolumes:\n  db_data:<\/code><\/pre>\n<p>Bu <code>docker-compose.yml<\/code> dosyas\u0131n\u0131 detayl\u0131 olarak inceleyelim:<\/p>\n<p>*   <strong><code>version: '3.8'<\/code><\/strong>: Docker Compose dosya format\u0131n\u0131n s\u00fcr\u00fcm\u00fcn\u00fc belirtir.<br \/>\n*   <strong><code>services<\/code><\/strong>: Uygulamam\u0131z\u0131n farkl\u0131 bile\u015fenlerini tan\u0131mlar.<br \/>\n    *   <strong><code>app<\/code> servisi<\/strong>:<br \/>\n        *   <code>build<\/code>: Uygulama kodumuzun bulundu\u011fu dizinden <code>Dockerfile<\/code> kullanarak bir Docker imaj\u0131 olu\u015fturmas\u0131n\u0131 sa\u011flar.<br \/>\n        *   <code>image<\/code>: Olu\u015fturulan imaja bir isim verir.<br \/>\n        *   <code>ports<\/code>: Konteynerin 5000 portunu host makinenin 5000 portuna e\u015fler.<br \/>\n        *   <code>environment<\/code>: Uygulaman\u0131n veritaban\u0131 ba\u011flant\u0131s\u0131 i\u00e7in gerekli ortam de\u011fi\u015fkenlerini tan\u0131mlar. <code>DB_HOST: db<\/code> ifadesi, <code>db<\/code> servisinin konteyner a\u011f\u0131ndaki ad\u0131n\u0131 kullan\u0131r.<br \/>\n        *   <code>depends_on<\/code>: <code>app<\/code> servisinin <code>db<\/code> servisine ba\u011f\u0131ml\u0131 oldu\u011funu belirtir. <code>condition: service_healthy<\/code> ile <code>db<\/code> servisi tamamen sa\u011fl\u0131kl\u0131 olana kadar <code>app<\/code> servisinin ba\u015flamas\u0131n\u0131 bekler.<br \/>\n    *   <strong><code>db<\/code> servisi<\/strong>:<br \/>\n        *   <code>image: postgres:9.6<\/code>: PostgreSQL veritaban\u0131 i\u00e7in resmi Docker imaj\u0131n\u0131 kullan\u0131r. Ubuntu 16.04&#8217;\u00fcn \u00e7\u0131kt\u0131\u011f\u0131 d\u00f6nemde pop\u00fcler olan bir PostgreSQL s\u00fcr\u00fcm\u00fcd\u00fcr.<br \/>\n        *   <code>environment<\/code>: PostgreSQL i\u00e7in veritaban\u0131 ad\u0131, kullan\u0131c\u0131 ad\u0131 ve \u015fifre gibi ortam de\u011fi\u015fkenlerini ayarlar.<br \/>\n        *   <code>volumes<\/code>: <code>db_data<\/code> ad\u0131nda bir Docker birimini <code>\/var\/lib\/postgresql\/data<\/code> dizinine ba\u011flar. Bu, veritaban\u0131 verilerinin konteyner silinse bile kal\u0131c\u0131 olmas\u0131n\u0131 sa\u011flar.<br \/>\n        *   <code>healthcheck<\/code>: Veritaban\u0131 servisinin sa\u011fl\u0131kl\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in bir komut tan\u0131mlar. <code>pg_isready<\/code> komutu, PostgreSQL&#8217;in ba\u011flant\u0131 kabul etmeye haz\u0131r olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. Bu, <code>depends_on<\/code> ile birlikte kritik bir \u00f6zelliktir.<br \/>\n    *   <strong><code>test<\/code> servisi<\/strong>:<br \/>\n        *   <code>build<\/code>: <code>app<\/code> servisiyle ayn\u0131 <code>Dockerfile<\/code>&#8216;\u0131 kullanarak bir imaj olu\u015fturur. Bu, testlerin uygulama ile ayn\u0131 ba\u011f\u0131ml\u0131l\u0131klara sahip olmas\u0131n\u0131 sa\u011flar.<br \/>\n        *   <code>environment<\/code>: <code>app<\/code> servisi gibi, testlerin de veritaban\u0131na eri\u015febilmesi i\u00e7in ortam de\u011fi\u015fkenlerini ayarlar.<br \/>\n        *   <code>depends_on<\/code>: <code>test<\/code> servisinin hem <code>app<\/code> hem de <code>db<\/code> servislerinin sa\u011fl\u0131kl\u0131 bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 bekledi\u011fini belirtir. Bu, testlerin ba\u015flamadan \u00f6nce t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n haz\u0131r olmas\u0131n\u0131 garanti eder.<br \/>\n        *   <code>entrypoint<\/code> ve <code>command<\/code>: Bu, test servisinin ana i\u015flevidir.<br \/>\n            *   <code>python database.py<\/code>: Testler ba\u015flamadan \u00f6nce veritaban\u0131nda gerekli tablolar\u0131 olu\u015fturur.<br \/>\n            *   <code>pytest tests\/<\/code>: <code>pytest<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak <code>tests\/<\/code> dizinindeki t\u00fcm testleri ba\u015flat\u0131r.<br \/>\n        *   <code>volumes<\/code>: Test dosyalar\u0131n\u0131 ve uygulama dosyalar\u0131n\u0131 konteyner i\u00e7ine ba\u011flar. Bu, <code>Dockerfile<\/code>&#8216;\u0131 her de\u011fi\u015ftirdi\u011fimizde imaj\u0131 yeniden olu\u015fturmak yerine, yerel dosyalarda yap\u0131lan de\u011fi\u015fikliklerin do\u011frudan konteyner i\u00e7inde g\u00f6r\u00fcnmesini sa\u011flar, geli\u015ftirme ve test d\u00f6ng\u00fcs\u00fcn\u00fc h\u0131zland\u0131r\u0131r.<br \/>\n*   <strong><code>volumes<\/code><\/strong>: <code>db_data<\/code> ad\u0131nda bir Docker birimini tan\u0131mlar. Bu, veritaban\u0131 verilerinin kal\u0131c\u0131l\u0131\u011f\u0131n\u0131 sa\u011flar.<\/p>\n<h3>CI \u0130\u015f Ak\u0131\u015f\u0131n\u0131 Tetikleme ve Y\u00f6netme<\/h3>\n<p><code>docker-compose.yml<\/code> dosyam\u0131z\u0131 olu\u015fturduktan sonra, CI i\u015f ak\u0131\u015f\u0131m\u0131z\u0131 manuel olarak tetikleyebiliriz.<\/p>\n<h4>Manuel Olarak Testleri \u00c7al\u0131\u015ft\u0131rma<\/h4>\n<p>Proje dizininizin k\u00f6k dizininde (yani <code>docker-compose.yml<\/code> dosyas\u0131n\u0131n bulundu\u011fu yerde) a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">docker-compose build\ndocker-compose up -d db app<\/code><\/pre>\n<p>*   <code>docker-compose build<\/code>: <code>Dockerfile<\/code> kullanarak <code>app<\/code> ve <code>test<\/code> servisleri i\u00e7in Docker imajlar\u0131n\u0131 olu\u015fturur.<br \/>\n*   <code>docker-compose up -d db app<\/code>: <code>db<\/code> ve <code>app<\/code> servislerini arka planda (<code>-d<\/code>) ba\u015flat\u0131r. <code>depends_on<\/code> ve <code>healthcheck<\/code> sayesinde, <code>app<\/code> servisi <code>db<\/code> servisi tamamen haz\u0131r olana kadar ba\u015flamayacakt\u0131r.<\/p>\n<p>Servisler \u00e7al\u0131\u015fmaya ba\u015flad\u0131ktan sonra, <code>db<\/code> ve <code>app<\/code> servislerinin sa\u011fl\u0131kl\u0131 oldu\u011funu kontrol edebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">docker-compose ps\ndocker-compose logs db app<\/code><\/pre>\n<p><code>db<\/code> ve <code>app<\/code> servisleri <code>Up (healthy)<\/code> durumuna geldi\u011finde, test servisini \u00e7al\u0131\u015ft\u0131rabiliriz:<\/p>\n<pre><code class=\"language-bash\">docker-compose run --rm test<\/code><\/pre>\n<p>*   <code>docker-compose run --rm test<\/code>: <code>test<\/code> servisini \u00e7al\u0131\u015ft\u0131r\u0131r. <code>--rm<\/code> bayra\u011f\u0131, konteynerin i\u015fi bittikten sonra otomatik olarak kald\u0131r\u0131lmas\u0131n\u0131 sa\u011flar, b\u00f6ylece temiz bir ortam b\u0131rak\u0131l\u0131r.<br \/>\n*   Bu komut, <code>test<\/code> servisinin <code>entrypoint<\/code> ve <code>command<\/code> k\u0131sm\u0131nda belirtilen <code>python database.py && pytest tests\/<\/code> komutunu \u00e7al\u0131\u015ft\u0131racakt\u0131r.<\/p>\n<p>Testler \u00e7al\u0131\u015facak ve sonu\u00e7lar\u0131 terminalde g\u00f6r\u00fcnecektir. E\u011fer t\u00fcm testler ge\u00e7erse, <code>test<\/code> servisi 0 \u00e7\u0131k\u0131\u015f koduyla sonlan\u0131r. Herhangi bir test ba\u015far\u0131s\u0131z olursa, genellikle 1 veya ba\u015fka bir s\u0131f\u0131r olmayan \u00e7\u0131k\u0131\u015f kodu d\u00f6nd\u00fcr\u00fcl\u00fcr. Bu \u00e7\u0131k\u0131\u015f kodu, bir CI arac\u0131n\u0131n (Jenkins, GitLab CI vb.) testlerin ba\u015far\u0131l\u0131 m\u0131 yoksa ba\u015far\u0131s\u0131z m\u0131 oldu\u011funu anlamas\u0131 i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p>Testler bittikten sonra, \u00e7al\u0131\u015fan servisleri durdurabilir ve olu\u015fturulan birimleri temizleyebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">docker-compose down -v<\/code><\/pre>\n<p>*   <code>docker-compose down<\/code>: T\u00fcm servisleri durdurur ve kald\u0131r\u0131r.<br \/>\n*   <code>-v<\/code>: Veritaban\u0131 verilerini i\u00e7eren <code>db_data<\/code> birimini de kald\u0131r\u0131r. Bu, bir sonraki \u00e7al\u0131\u015ft\u0131rmada tamamen temiz bir veritaban\u0131 ortam\u0131 sa\u011flar.<\/p>\n<h4>CI Sunucusu ile Entegrasyonun Mant\u0131\u011f\u0131<\/h4>\n<p>Ger\u00e7ek bir CI ortam\u0131nda, bu manuel ad\u0131mlar otomatikle\u015ftirilir. Bir CI sunucusu (Jenkins, GitLab CI, CircleCI, GitHub Actions vb.) genellikle a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izleyen bir yap\u0131land\u0131rma dosyas\u0131 (\u00f6rn. <code>Jenkinsfile<\/code>, <code>.gitlab-ci.yml<\/code>) kullan\u0131r:<\/p>\n<p>1.  <strong>Kod \u00c7ekme:<\/strong> CI sunucusu, depodan en son kodu \u00e7eker.<br \/>\n2.  <strong>Ortam\u0131 Haz\u0131rlama:<\/strong> CI sunucusu, Docker ve Docker Compose&#8217;un kurulu oldu\u011fu bir ortamda \u00e7al\u0131\u015f\u0131r.<br \/>\n3.  <strong>Build ve Test:<\/strong> CI sunucusu, proje dizinine gider ve yukar\u0131da g\u00f6sterilen <code>docker-compose build<\/code>, <code>docker-compose up -d db app<\/code>, ve <code>docker-compose run --rm test<\/code> komutlar\u0131n\u0131 s\u0131ras\u0131yla \u00e7al\u0131\u015ft\u0131r\u0131r.<br \/>\n4.  <strong>Sonu\u00e7lar\u0131 Analiz Etme:<\/strong> CI sunucusu, <code>docker-compose run --rm test<\/code> komutunun \u00e7\u0131k\u0131\u015f kodunu kontrol eder. \u00c7\u0131k\u0131\u015f kodu 0 ise testler ba\u015far\u0131l\u0131, de\u011filse ba\u015far\u0131s\u0131z olarak i\u015faretlenir.<br \/>\n5.  <strong>Raporlama:<\/strong> Test \u00e7\u0131kt\u0131lar\u0131 (loglar) ve ba\u015far\u0131\/ba\u015far\u0131s\u0131zl\u0131k durumu CI sunucusunun aray\u00fcz\u00fcnde g\u00f6sterilir ve ilgili ki\u015filere bildirim g\u00f6nderilir.<br \/>\n6.  <strong>Temizleme:<\/strong> Testler bittikten sonra, <code>docker-compose down -v<\/code> komutu ile ortam temizlenir.<\/p>\n<p>Bu yakla\u015f\u0131m, her CI \u00e7al\u0131\u015ft\u0131rmas\u0131 i\u00e7in temiz, izole ve tekrarlanabilir bir test ortam\u0131 sa\u011flar.<\/p>\n<h3>Optimizasyon ve En \u0130yi Uygulamalar<\/h3>\n<p>CI test ortam\u0131n\u0131z\u0131n verimli ve g\u00fcvenli olmas\u0131 i\u00e7in baz\u0131 optimizasyonlar ve en iyi uygulamalar mevcuttur.<\/p>\n<h4>Dockerfile Optimizasyonlar\u0131<\/h4>\n<p>*   <strong>Katmanlama (Layering):<\/strong> Dockerfile&#8217;daki her komut bir katman olu\u015fturur. S\u0131k de\u011fi\u015fmeyen katmanlar\u0131 (\u00f6rn. ba\u011f\u0131ml\u0131l\u0131k kurulumu) Dockerfile&#8217;\u0131n \u00fcst k\u0131s\u0131mlar\u0131na yerle\u015ftirerek Docker&#8217;\u0131n build \u00f6nbelle\u011fini daha etkin kullan\u0131n.<br \/>\n*   <strong><code>.dockerignore<\/code> Kullan\u0131m\u0131:<\/strong> Gereksiz dosyalar\u0131n (\u00f6rn. <code>.git<\/code>, <code>__pycache__<\/code>, <code>.env<\/code>) imaj i\u00e7ine kopyalanmas\u0131n\u0131 engellemek i\u00e7in <code>.dockerignore<\/code> dosyas\u0131 olu\u015fturun. Bu, imaj boyutunu k\u00fc\u00e7\u00fclt\u00fcr ve build s\u00fcresini h\u0131zland\u0131r\u0131r.<br \/>\n*   <strong>Minimal Temel \u0130majlar:<\/strong> <code>python:3.6-slim-stretch<\/code> gibi <code>slim<\/code> veya <code>alpine<\/code> tabanl\u0131 imajlar kullanarak imaj boyutunu minimumda tutun. Bu, indirme s\u00fcrelerini ve disk kullan\u0131m\u0131n\u0131 azalt\u0131r.<br \/>\n*   <strong>Tek Sorumluluk Prensibi:<\/strong> Her konteynerin tek bir sorumlulu\u011fu olmal\u0131d\u0131r (\u00f6rn. uygulama, veritaban\u0131, testler).<\/p>\n<h4>Docker Compose Optimizasyonlar\u0131<\/h4>\n<p>*   <strong><code>healthcheck<\/code> Kullan\u0131m\u0131:<\/strong> <code>depends_on<\/code> ile birlikte <code>healthcheck<\/code> kullanmak, servislerin ger\u00e7ekten kullan\u0131ma haz\u0131r olana kadar di\u011fer servislerin ba\u015flamas\u0131n\u0131 beklemelerini sa\u011flar. Bu, \u00f6zellikle veritabanlar\u0131 gibi ba\u015flat\u0131lmas\u0131 zaman alan servisler i\u00e7in kritiktir.<br \/>\n*   <strong><code>restart: on-failure<\/code>:<\/strong> \u00dcretim ortam\u0131nda, servislerin beklenmedik bir \u015fekilde durmas\u0131 durumunda otomatik olarak yeniden ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flayabilir. CI ortam\u0131nda bu genellikle gerekli de\u011fildir.<br \/>\n*   <strong>Ortam De\u011fi\u015fkenleri:<\/strong> Hassas bilgileri (veritaban\u0131 \u015fifreleri) <code>docker-compose.yml<\/code> dosyas\u0131na do\u011frudan yazmak yerine, CI sunucusunun ortam de\u011fi\u015fkenleri veya Docker&#8217;\u0131n secrets y\u00f6netimi arac\u0131l\u0131\u011f\u0131yla sa\u011flamak daha g\u00fcvenlidir.<br \/>\n*   <strong>Sanal A\u011flar:<\/strong> Docker Compose, servisler aras\u0131nda otomatik olarak bir k\u00f6pr\u00fc a\u011f\u0131 olu\u015fturur. Servislerin birbirleriyle isimleriyle ileti\u015fim kurabilmesi bu sayede m\u00fcmk\u00fcnd\u00fcr (\u00f6rn. <code>DB_HOST: db<\/code>).<\/p>\n<h4>Test Stratejileri<\/h4>\n<p>*   <strong>H\u0131zl\u0131 Testler \u00d6nce:<\/strong> Birim testleri en h\u0131zl\u0131 testlerdir ve CI s\u00fcrecinin ba\u015f\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131lmal\u0131d\u0131r. Hata tespiti ne kadar erken olursa, d\u00fczeltme maliyeti o kadar d\u00fc\u015f\u00fck olur.<br \/>\n*   <strong>Kademeli Testler:<\/strong> Birim testleri ba\u015far\u0131l\u0131 olduktan sonra entegrasyon testleri, ard\u0131ndan u\u00e7tan uca testler \u00e7al\u0131\u015ft\u0131r\u0131labilir. Her kademe, bir \u00f6nceki kademenin ba\u015far\u0131s\u0131na ba\u011fl\u0131 olmal\u0131d\u0131r.<br \/>\n*   <strong>Test Verileri:<\/strong> Testler i\u00e7in tutarl\u0131 ve tekrarlanabilir test verileri kullan\u0131n. <code>database.py<\/code> \u00f6rne\u011fimizdeki gibi, testlerden \u00f6nce veritaban\u0131n\u0131 belirli bir duruma getiren betikler kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h4>\u00d6nbellekleme (Caching)<\/h4>\n<p>*   <strong>Docker Build Cache:<\/strong> Docker, imaj katmanlar\u0131n\u0131 \u00f6nbelle\u011fe al\u0131r. Dockerfile&#8217;\u0131 do\u011fru yap\u0131land\u0131rarak (s\u0131k de\u011fi\u015fmeyen katmanlar\u0131 \u00fcste koyarak), build s\u00fcrelerini \u00f6nemli \u00f6l\u00e7\u00fcde azaltabilirsiniz.<br \/>\n*   <strong>CI Arac\u0131 \u00d6nbellekleri:<\/strong> Jenkins, GitLab CI gibi CI ara\u00e7lar\u0131, ba\u011f\u0131ml\u0131l\u0131klar\u0131 (\u00f6rn. <code>pip<\/code> cache) veya build \u00e7\u0131kt\u0131lar\u0131n\u0131 \u00f6nbelle\u011fe alma yetene\u011fine sahiptir. Bu, her CI \u00e7al\u0131\u015ft\u0131rmas\u0131nda her \u015feyi s\u0131f\u0131rdan indirme veya derleme ihtiyac\u0131n\u0131 azalt\u0131r.<\/p>\n<h4>Kaynak Y\u00f6netimi<\/h4>\n<p>*   CI sunucusunun yeterli CPU ve belle\u011fe sahip oldu\u011fundan emin olun. \u00c7ok say\u0131da paralel test \u00e7al\u0131\u015ft\u0131rmas\u0131 veya b\u00fcy\u00fck imajlar sistem kaynaklar\u0131n\u0131 zorlayabilir.<br \/>\n*   Docker Compose&#8217;da <code>resources<\/code> alt\u0131nda <code>limits<\/code> ve <code>reservations<\/code> kullanarak konteynerler i\u00e7in CPU ve bellek s\u0131n\u0131rlar\u0131 belirleyebilirsiniz.<\/p>\n<h4>G\u00fcvenlik<\/h4>\n<p>*   <strong>\u0130maj Tarama:<\/strong> Kullan\u0131lan Docker imajlar\u0131n\u0131n (\u00f6zellikle temel imajlar\u0131n) bilinen g\u00fcvenlik a\u00e7\u0131klar\u0131na kar\u015f\u0131 taranmas\u0131 i\u00e7in ara\u00e7lar kullan\u0131n (\u00f6rn. Trivy, Clair).<br \/>\n*   <strong>Ba\u011f\u0131ml\u0131l\u0131k G\u00fcncellemeleri:<\/strong> Uygulama ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 (Python paketleri, npm paketleri vb.) d\u00fczenli olarak g\u00fcncel tutun.<br \/>\n*   <strong>En Az Yetki Prensibi:<\/strong> Konteynerleri m\u00fcmk\u00fcn olan en d\u00fc\u015f\u00fck yetkilerle \u00e7al\u0131\u015ft\u0131r\u0131n. <code>root<\/code> kullan\u0131c\u0131s\u0131 yerine \u00f6zel bir kullan\u0131c\u0131 kullan\u0131n.<\/p>\n<h3>Sorun Giderme (Troubleshooting)<\/h3>\n<p>CI ortam\u0131 kurulumunda veya test \u00e7al\u0131\u015ft\u0131rmalar\u0131nda sorunlarla kar\u015f\u0131la\u015fmak do\u011fald\u0131r. \u0130\u015fte baz\u0131 yayg\u0131n sorunlar ve \u00e7\u00f6z\u00fcm ipu\u00e7lar\u0131:<\/p>\n<p>*   <strong>Konteyner Ba\u015flam\u0131yor:<\/strong><br \/>\n    *   <code>docker-compose logs <servis_ad\u0131><\/code> komutu ile ilgili servisin loglar\u0131n\u0131 kontrol edin. Hata mesajlar\u0131 genellikle sorunun k\u00f6kenini g\u00f6sterir.<br \/>\n    *   <code>docker-compose ps<\/code> ile servislerin durumunu kontrol edin. <code>Exited<\/code> veya <code>Restarting<\/code> durumlar\u0131 bir soruna i\u015faret eder.<br \/>\n*   <strong>Servisler Aras\u0131 Ba\u011flant\u0131 Sorunlar\u0131:<\/strong><br \/>\n    *   Ortam de\u011fi\u015fkenlerinin (\u00f6rn. <code>DB_HOST<\/code>) do\u011fru ayarland\u0131\u011f\u0131ndan ve servis adlar\u0131n\u0131n <code>docker-compose.yml<\/code> dosyas\u0131ndaki isimlerle e\u015fle\u015fti\u011finden emin olun.<br \/>\n    *   <code>depends_on<\/code> ve <code>healthcheck<\/code> yap\u0131land\u0131rmas\u0131n\u0131 g\u00f6zden ge\u00e7irin. Bir servis haz\u0131r olmadan di\u011ferinin ba\u015flamas\u0131 ba\u011flant\u0131 hatalar\u0131na yol a\u00e7abilir.<br \/>\n    *   Konteyner i\u00e7ine girip (<code>docker exec -it <konteyner_ad\u0131> bash<\/code>) <code>ping db<\/code> gibi komutlarla a\u011f ba\u011flant\u0131s\u0131n\u0131 test edebilirsiniz.<br \/>\n*   <strong>Testler Ba\u015far\u0131s\u0131z Oluyor:<\/strong><br \/>\n    *   Test servisinin loglar\u0131n\u0131 (<code>docker-compose logs test<\/code>) dikkatlice inceleyin. Pytest gibi test \u00e7er\u00e7eveleri, ba\u015far\u0131s\u0131z testler hakk\u0131nda detayl\u0131 bilgi sa\u011flar.<br \/>\n    *   Ba\u011f\u0131ml\u0131l\u0131klar\u0131n (\u00f6rn. Python paketleri) do\u011fru \u015fekilde kuruldu\u011fundan ve uygulaman\u0131n t\u00fcm gereksinimlerini kar\u015f\u0131lad\u0131\u011f\u0131ndan emin olun.<br \/>\n    *   Test verilerinin tutarl\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol edin.<br \/>\n*   <strong>\u0130maj Olu\u015fturma (Build) Hatalar\u0131:<\/strong><br \/>\n    *   <code>Dockerfile<\/code>&#8216;daki komutlar\u0131 tek tek kontrol edin. Herhangi bir <code>RUN<\/code> komutunun ba\u015far\u0131s\u0131z olmas\u0131, build&#8217;in durmas\u0131na neden olur.<br \/>\n    *   <code>requirements.txt<\/code> gibi ba\u011f\u0131ml\u0131l\u0131k dosyalar\u0131n\u0131n do\u011fru yolda oldu\u011fundan ve i\u00e7eri\u011finin ge\u00e7erli oldu\u011fundan emin olun.<br \/>\n*   <strong>Disk Alan\u0131 T\u00fckenmesi:<\/strong><br \/>\n    *   Docker imajlar\u0131 ve konteynerleri zamanla disk alan\u0131 t\u00fcketebilir. Gereksiz imajlar\u0131 ve konteynerleri temizlemek i\u00e7in <code>docker system prune -a<\/code> komutunu kullan\u0131n (dikkatli olun, t\u00fcm durdurulmu\u015f konteynerleri, a\u011flar\u0131, imajlar\u0131 ve build cache&#8217;i temizler).<br \/>\n    *   Veritaban\u0131 birimleri gibi kal\u0131c\u0131 verilerin \u00e7ok fazla yer kaplamad\u0131\u011f\u0131ndan emin olun.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, Docker ve Docker Compose kullanarak Ubuntu 16.04 \u00fczerinde nas\u0131l S\u00fcrekli Entegrasyon (CI) test ortam\u0131 kurulaca\u011f\u0131n\u0131 detayl\u0131 bir \u015fekilde inceledik. CI&#8217;\u0131n temel prensiplerinden ba\u015flayarak, Docker&#8217;\u0131n kurulumunu, Docker Compose ile \u00e7oklu konteynerli bir uygulaman\u0131n ve test ortam\u0131n\u0131n nas\u0131l tan\u0131mlanaca\u011f\u0131n\u0131 ve bu ortam\u0131n nas\u0131l \u00e7al\u0131\u015ft\u0131r\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m g\u00f6sterdik. Ayr\u0131ca, CI s\u00fcrecinizi daha verimli ve g\u00fcvenli hale getirmek i\u00e7in \u00e7e\u015fitli optimizasyonlar ve en iyi uygulamalar hakk\u0131nda bilgi verdik.<\/p>\n<p>Docker ve Docker Compose, geli\u015ftiricilere ve DevOps ekiplerine, yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde tutarl\u0131l\u0131k, izolasyon ve ta\u015f\u0131nabilirlik sa\u011flayarak CI&#8217;\u0131n ger\u00e7ek potansiyelini ortaya \u00e7\u0131karma g\u00fcc\u00fc verir. Bu ara\u00e7lar sayesinde, &#8220;benim makinemde \u00e7al\u0131\u015f\u0131yordu&#8221; sorunlar\u0131 ge\u00e7mi\u015fte kal\u0131r ve ekipler daha h\u0131zl\u0131, daha g\u00fcvenilir ve daha kaliteli yaz\u0131l\u0131m teslim edebilirler.<\/p>\n<p>Unutulmamal\u0131d\u0131r ki, Ubuntu 16.04&#8217;\u00fcn ya\u015fam d\u00f6ng\u00fcs\u00fc sona ermi\u015ftir ve g\u00fcvenlik g\u00fcncellemeleri almamaktad\u0131r. Yeni projeler i\u00e7in daha g\u00fcncel ve desteklenen bir i\u015fletim sistemi s\u00fcr\u00fcm\u00fc (\u00f6rn. Ubuntu 20.04 LTS veya 22.04 LTS) kullan\u0131lmas\u0131 \u015fiddetle tavsiye edilir. Ancak, bu makalede a\u00e7\u0131klanan temel prensipler ve Docker\/Docker Compose komutlar\u0131, \u00e7o\u011fu Linux tabanl\u0131 i\u015fletim sistemi ve Docker s\u00fcr\u00fcm\u00fc i\u00e7in ge\u00e7erlili\u011fini korumaktad\u0131r. Bu bilgileri temel alarak, kendi projeleriniz i\u00e7in sa\u011flam ve verimli bir CI test altyap\u0131s\u0131 kurabilirsiniz. Gelecek ad\u0131mlar olarak, Jenkins, GitLab CI gibi pop\u00fcler CI ara\u00e7lar\u0131yla bu Docker Compose tabanl\u0131 ortam\u0131 entegre etmeyi ve daha karma\u015f\u0131k test senaryolar\u0131n\u0131 (performans testleri, g\u00fcvenlik testleri) otomatikle\u015ftirmeyi d\u00fc\u015f\u00fcnebilirsiniz.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Docker ve Docker Compose Kullanarak Ubuntu 16.04 \u00dczerinde S\u00fcrekli Entegrasyon (CI) Test Ortam\u0131 Yap\u0131land\u0131rma\nS\u00fcrekli Entegrasyon (Continuous Int","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-32002","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>Docker ve Docker Compose Kullanarak Ubuntu 16.04 \u00dczerinde S\u00fcrekli Entegrasyon (CI) Test Ortam\u0131 Yap\u0131land\u0131rma - 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\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Docker ve Docker Compose Kullanarak Ubuntu 16.04 \u00dczerinde S\u00fcrekli Entegrasyon (CI) Test Ortam\u0131 Yap\u0131land\u0131rma\" \/>\n<meta property=\"og:description\" content=\"Docker ve Docker Compose Kullanarak Ubuntu 16.04 \u00dczerinde S\u00fcrekli Entegrasyon (CI) Test Ortam\u0131 Yap\u0131land\u0131rma S\u00fcrekli Entegrasyon (Continuous Int\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-16T12:41: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=\"24 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Docker ve Docker Compose Kullanarak Ubuntu 16.04 \u00dczerinde S\u00fcrekli Entegrasyon (CI) Test Ortam\u0131 Yap\u0131land\u0131rma\",\"datePublished\":\"2025-10-16T12:41:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/\"},\"wordCount\":3614,\"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\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/\",\"name\":\"Docker ve Docker Compose Kullanarak Ubuntu 16.04 \u00dczerinde S\u00fcrekli Entegrasyon (CI) Test Ortam\u0131 Yap\u0131land\u0131rma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-16T12:41:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Docker ve Docker Compose Kullanarak Ubuntu 16.04 \u00dczerinde S\u00fcrekli Entegrasyon (CI) Test Ortam\u0131 Yap\u0131land\u0131rma\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Docker ve Docker Compose Kullanarak Ubuntu 16.04 \u00dczerinde S\u00fcrekli Entegrasyon (CI) Test Ortam\u0131 Yap\u0131land\u0131rma - 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\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/","og_locale":"tr_TR","og_type":"article","og_title":"Docker ve Docker Compose Kullanarak Ubuntu 16.04 \u00dczerinde S\u00fcrekli Entegrasyon (CI) Test Ortam\u0131 Yap\u0131land\u0131rma","og_description":"Docker ve Docker Compose Kullanarak Ubuntu 16.04 \u00dczerinde S\u00fcrekli Entegrasyon (CI) Test Ortam\u0131 Yap\u0131land\u0131rma S\u00fcrekli Entegrasyon (Continuous Int","og_url":"https:\/\/fatihsoysal.com\/blog\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-16T12:41:26+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"24 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Docker ve Docker Compose Kullanarak Ubuntu 16.04 \u00dczerinde S\u00fcrekli Entegrasyon (CI) Test Ortam\u0131 Yap\u0131land\u0131rma","datePublished":"2025-10-16T12:41:26+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/"},"wordCount":3614,"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\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/","url":"https:\/\/fatihsoysal.com\/blog\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/","name":"Docker ve Docker Compose Kullanarak Ubuntu 16.04 \u00dczerinde S\u00fcrekli Entegrasyon (CI) Test Ortam\u0131 Yap\u0131land\u0131rma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-16T12:41:26+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/docker-ve-docker-compose-kullanarak-ubuntu-16-04-uzerinde-surekli-entegrasyon-ci-test-ortami-yapilandirma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Docker ve Docker Compose Kullanarak Ubuntu 16.04 \u00dczerinde S\u00fcrekli Entegrasyon (CI) Test Ortam\u0131 Yap\u0131land\u0131rma"}]},{"@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\/32002","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=32002"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32002\/revisions"}],"predecessor-version":[{"id":32003,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32002\/revisions\/32003"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32002"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32002"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32002"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}