{"id":31739,"date":"2025-10-13T12:01:30","date_gmt":"2025-10-13T09:01:30","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/"},"modified":"2025-10-13T12:01:30","modified_gmt":"2025-10-13T09:01:30","slug":"veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/","title":{"rendered":"Veri M\u00fchendisli\u011finde Konteynerle\u015ftirme: Docker ve Docker Compose ile Pratik Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<p>Veri m\u00fchendisli\u011fi projelerinizin kurulumu, y\u00f6netimi ve da\u011f\u0131t\u0131m\u0131 karma\u015f\u0131k m\u0131? Ba\u011f\u0131ml\u0131l\u0131k sorunlar\u0131, ortam tutars\u0131zl\u0131klar\u0131 ve \u00f6l\u00e7eklenebilirlik zorluklar\u0131yla m\u0131 bo\u011fu\u015fuyorsunuz? Docker ve Docker Compose ile bu zorluklar\u0131 nas\u0131l a\u015faca\u011f\u0131n\u0131z\u0131 ke\u015ffedin, veri altyap\u0131n\u0131z\u0131 standartla\u015ft\u0131r\u0131n ve projelerinizi tutarl\u0131, ta\u015f\u0131nabilir ve \u00f6l\u00e7eklenebilir hale getirin. Bu kapsaml\u0131 rehber, konuya yeni ba\u015flayanlardan deneyimli veri m\u00fchendislerine kadar herkes i\u00e7in pratik bilgiler sunuyor.<\/p>\n<p>Modern veri m\u00fchendisli\u011fi projeleri, genellikle birbiriyle entegre \u00e7al\u0131\u015fan \u00e7ok say\u0131da farkl\u0131 teknoloji ve araca ihtiya\u00e7 duyar. Python&#8217;\u0131n belirli bir s\u00fcr\u00fcm\u00fc, Apache Spark&#8217;\u0131n \u00f6zel bir da\u011f\u0131t\u0131m\u0131, bir PostgreSQL veritaban\u0131, Apache Kafka mesaj kuyru\u011fu veya Airflow i\u015f ak\u0131\u015f\u0131 y\u00f6neticisi gibi bile\u015fenler, bir veri pipeline&#8217;\u0131n\u0131n temel ta\u015flar\u0131 olabilir. Ancak, bu bile\u015fenleri tek bir geli\u015ftirme ortam\u0131nda veya \u00fcretim sunucusunda bir araya getirmek, \u00e7o\u011fu zaman bir kabusa d\u00f6n\u00fc\u015febilir. Ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131, farkl\u0131 i\u015fletim sistemleri aras\u0131ndaki uyumsuzluklar ve s\u00fcr\u00fcm farkl\u0131l\u0131klar\u0131, geli\u015ftiricilerin saatlerini hatta g\u00fcnlerini alabilen hatalara yol a\u00e7abilir. \u00d6rne\u011fin, bir veri bilimci Python 3.8 ile \u00e7al\u0131\u015f\u0131rken, bir di\u011feri 3.9 kullan\u0131yor olabilir ve bu, belirli k\u00fct\u00fcphanelerin uyumlulu\u011fu a\u00e7\u0131s\u0131ndan ciddi sorunlar yaratabilir. \u00dcstelik, geli\u015ftirme ortam\u0131nda sorunsuz \u00e7al\u0131\u015fan bir pipeline&#8217;\u0131n \u00fcretimde ayn\u0131 performans\u0131 g\u00f6stermemesi veya hi\u00e7 \u00e7al\u0131\u015fmamas\u0131, veri m\u00fchendislerinin s\u0131k\u00e7a kar\u015f\u0131la\u015ft\u0131\u011f\u0131 bir durumdur. Bu durum, &#8220;Benim bilgisayar\u0131mda \u00e7al\u0131\u015f\u0131yordu!&#8221; sendromu olarak da bilinir ve genellikle ortam farkl\u0131l\u0131klar\u0131ndan kaynaklan\u0131r. Bir ba\u015fka \u00f6nemli zorluk ise yeni bir ekibin projeye dahil olmas\u0131yla ortaya \u00e7\u0131kar. T\u00fcm bu ara\u00e7lar\u0131n manuel olarak kurulmas\u0131 ve yap\u0131land\u0131r\u0131lmas\u0131, ba\u015flang\u0131\u00e7 s\u00fcrecini olduk\u00e7a uzat\u0131r ve verimlili\u011fi d\u00fc\u015f\u00fcr\u00fcr. \u0130\u015fte tam da bu noktada, konteynerle\u015ftirme teknolojileri devreye girerek bu karma\u015f\u0131kl\u0131\u011f\u0131 y\u00f6netilebilir bir hale getirir ve veri m\u00fchendisli\u011fi s\u00fcre\u00e7lerinde devrimsel bir yakla\u015f\u0131m sunar. Konteynerler, bir uygulaman\u0131n ve onun t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n izole bir ortamda paketlenmesini sa\u011flayarak, &#8220;benim bilgisayar\u0131mda \u00e7al\u0131\u015f\u0131yordu&#8221; problemini ortadan kald\u0131r\u0131r ve ekipler aras\u0131 i\u015f birli\u011fini kolayla\u015ft\u0131r\u0131r.<\/p>\n<h2>Temel Kavramlar: Docker ve Konteynerle\u015ftirme Tam Olarak Nedir?<\/h2>\n<p>Konteynerle\u015ftirme, yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, \u00f6zellikle de da\u011f\u0131t\u0131k sistemler ve veri m\u00fchendisli\u011fi alan\u0131nda devrim yaratan bir yakla\u015f\u0131md\u0131r. En basit tan\u0131m\u0131yla, bir uygulamay\u0131 t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 (k\u00fct\u00fcphaneler, ayarlar, kod vb.) ile birlikte bir paket halinde izole bir ortamda \u00e7al\u0131\u015ft\u0131rma y\u00f6ntemidir. Bu, uygulaman\u0131n farkl\u0131 ortamlarda (geli\u015ftirme, test, \u00fcretim) her zaman ayn\u0131 \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 garanti eder. Bu yakla\u015f\u0131m\u0131n en pop\u00fcler uygulay\u0131c\u0131s\u0131 ise \u015f\u00fcphesiz Docker&#8217;d\u0131r.<\/p>\n<p>Peki, Docker nedir? Docker, uygulamalar\u0131 konteynerler i\u00e7inde olu\u015fturmak, da\u011f\u0131tmak ve \u00e7al\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131lan a\u00e7\u0131k kaynakl\u0131 bir platformdur. Geli\u015ftiricilerin uygulamalar\u0131n\u0131, k\u00fct\u00fcphanelerini ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 tek bir &#8220;Docker imaj\u0131&#8221; olarak paketlemesine olanak tan\u0131r. Bu imajlar, \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda bir &#8220;Docker konteyneri&#8221; haline gelir. Bir Docker konteyneri, hafif, ta\u015f\u0131nabilir ve kendi kendine yeten bir \u00e7al\u0131\u015fma birimidir. Sanal makinelerden (VM) farkl\u0131 olarak, konteynerler kendi i\u015fletim sistemlerini i\u00e7ermez; bunun yerine ana makinenin \u00e7ekirde\u011fini payla\u015f\u0131r ve bu da onlar\u0131 \u00e7ok daha hafif ve h\u0131zl\u0131 hale getirir. Sanal makineler, fiziksel donan\u0131m\u0131 sanalla\u015ft\u0131rarak her bir VM i\u00e7in ayr\u0131 bir i\u015fletim sistemi (misafir OS) \u00e7al\u0131\u015ft\u0131r\u0131rken, konteynerler i\u015fletim sistemi d\u00fczeyinde sanalla\u015ft\u0131rma kullan\u0131r ve ana makinenin i\u015fletim sisteminin \u00e7ekirde\u011fini (kernel) payla\u015f\u0131r. Bu mimari fark\u0131, konteynerlerin daha az kaynak t\u00fcketmesini ve saniyeler i\u00e7inde ba\u015flat\u0131labilmesini sa\u011flar. Konteynerler, ortamlar aras\u0131 tutarl\u0131l\u0131k sorununu k\u00f6kten \u00e7\u00f6zd\u00fc\u011f\u00fc i\u00e7in veri m\u00fchendisli\u011fi projeleri i\u00e7in kritik bir \u00f6neme sahiptir. \u00d6rne\u011fin, bir veri pipeline&#8217;\u0131n\u0131n t\u00fcm bile\u015fenleri (veri \u00e7ekme scripti, veri i\u015fleme motoru, veritaban\u0131 ba\u011flay\u0131c\u0131s\u0131) ayr\u0131 ayr\u0131 konteynerlerde \u00e7al\u0131\u015ft\u0131r\u0131labilir ve bu, her bile\u015fenin kendi \u00f6zel ba\u011f\u0131ml\u0131l\u0131k setine sahip olabilece\u011fi anlam\u0131na gelir. Bu izolasyon, &#8220;dependency hell&#8221; olarak bilinen ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131n\u0131 ortadan kald\u0131r\u0131r ve her bile\u015fenin stabil bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 garanti eder.<\/p>\n<p>Docker imajlar\u0131, uygulaman\u0131z i\u00e7in bir &#8220;yap\u0131 plan\u0131&#8221; gibidir. Bir Dockerfile ad\u0131 verilen metin tabanl\u0131 bir dosya ile olu\u015fturulur. Bu Dockerfile, imaj\u0131n nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131, hangi temel i\u015fletim sistemi imaj\u0131n\u0131n kullan\u0131laca\u011f\u0131n\u0131, hangi k\u00fct\u00fcphanelerin kurulaca\u011f\u0131n\u0131 ve uygulaman\u0131z\u0131n ba\u015flang\u0131\u00e7 komutunu ad\u0131m ad\u0131m tan\u0131mlar. Olu\u015fturulan imajlar, Docker Hub gibi herkese a\u00e7\u0131k veya \u00f6zel kay\u0131t defterlerinde depolanabilir ve di\u011fer kullan\u0131c\u0131larla veya sunucularla payla\u015f\u0131labilir. Bu, bir ekibin bir uygulaman\u0131n ayn\u0131 versiyonunu her zaman, herhangi bir yerde kullanabilmesini sa\u011flar. K\u0131sacas\u0131, konteynerle\u015ftirme ve Docker, veri m\u00fchendisli\u011fi projelerini daha y\u00f6netilebilir, daha tutarl\u0131 ve daha \u00f6l\u00e7eklenebilir hale getiren vazge\u00e7ilmez ara\u00e7lard\u0131r. Bu teknoloji sayesinde, veri altyap\u0131s\u0131 geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7leri \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zlan\u0131r ve basitle\u015fir.<\/p>\n<h2>Veri M\u00fchendisli\u011finde Neden Docker Kullanmal\u0131y\u0131z? Ger\u00e7ek D\u00fcnya Senaryolar\u0131<\/h2>\n<p>Veri m\u00fchendisli\u011fi, dinamik ve s\u00fcrekli de\u011fi\u015fen bir alan olup, bir\u00e7ok farkl\u0131 bile\u015fenin uyum i\u00e7inde \u00e7al\u0131\u015fmas\u0131n\u0131 gerektirir. Docker, bu karma\u015f\u0131k ortamda tutarl\u0131l\u0131k, ta\u015f\u0131nabilirlik ve \u00f6l\u00e7eklenebilirlik sa\u011flamak i\u00e7in vazge\u00e7ilmez bir ara\u00e7 haline gelmi\u015ftir. \u0130\u015fte Docker&#8217;\u0131n veri m\u00fchendisli\u011fi alan\u0131ndaki kullan\u0131m\u0131n\u0131 g\u00f6steren baz\u0131 ger\u00e7ek d\u00fcnya senaryolar\u0131:<\/p>\n<h3>Senaryo 1: Tutarl\u0131 Geli\u015ftirme ve Test Ortamlar\u0131 Nas\u0131l Sa\u011flan\u0131r?<\/h3>\n<p>B\u00fcy\u00fck veri projelerinde, farkl\u0131 veri m\u00fchendisleri veya veri bilimcileri genellikle ayn\u0131 anda farkl\u0131 \u00f6zellikler veya modeller \u00fczerinde \u00e7al\u0131\u015f\u0131r. Herkesin yerel ortam\u0131nda ayn\u0131 Python k\u00fct\u00fcphane versiyonlar\u0131na, Spark yap\u0131land\u0131rmalar\u0131na veya veritaban\u0131 s\u00fcr\u00fcc\u00fclerine sahip olmas\u0131n\u0131 sa\u011flamak, manuel y\u00f6ntemlerle neredeyse imkans\u0131zd\u0131r. Docker, bu sorunu Dockerfile&#8217;lar arac\u0131l\u0131\u011f\u0131yla ortadan kald\u0131r\u0131r. Bir veri m\u00fchendisi, \u00f6rne\u011fin, Spark 3.2, Python 3.9 ve belirli bir dizi ba\u011f\u0131ml\u0131l\u0131k i\u00e7eren bir Docker imaj\u0131 olu\u015fturabilir. Bu imaj Docker Hub&#8217;a y\u00fcklendi\u011finde, ekipteki herkes bu imaj\u0131 \u00e7ekip kendi yerel makinesinde ayn\u0131 ortam\u0131 an\u0131nda olu\u015fturabilir. Bu, &#8220;benim bilgisayar\u0131mda \u00e7al\u0131\u015f\u0131yordu&#8221; sorununu ortadan kald\u0131r\u0131r ve geli\u015ftirme ile test ortamlar\u0131 aras\u0131nda tam bir tutarl\u0131l\u0131k sa\u011flar. \u00d6zellikle yeni bir ekibin projeye dahil olmas\u0131 durumunda, t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve ara\u00e7lar\u0131 dakikalar i\u00e7inde haz\u0131r hale getirmek, onboarding s\u00fcrecini ciddi \u015fekilde h\u0131zland\u0131r\u0131r ve \u00fcretkenli\u011fi art\u0131r\u0131r.<\/p>\n<h3>Senaryo 2: ETL\/ELT Pipeline&#8217;lar\u0131n\u0131n Da\u011f\u0131t\u0131m\u0131 ve Y\u00f6netimi Nas\u0131l Kolayla\u015f\u0131r?<\/h3>\n<p>Veri m\u00fchendisli\u011finin kalbi olan ETL (Extract, Transform, Load) veya ELT pipeline&#8217;lar\u0131, genellikle veri kaynaklar\u0131ndan veri \u00e7ekme, i\u015fleme ve hedef depolara y\u00fckleme gibi ad\u0131mlar\u0131 i\u00e7erir. Bu ad\u0131mlar\u0131n her biri, farkl\u0131 uygulamalar veya servisler olabilir (\u00f6rne\u011fin, bir Python script&#8217;i, bir Apache Spark i\u015fi, bir Kafka producer\/consumer). Bu bile\u015fenleri ayr\u0131 ayr\u0131 konteynerize etmek, onlar\u0131n birbirinden ba\u011f\u0131ms\u0131z olarak \u00f6l\u00e7eklenebilmesini ve y\u00f6netilebilmesini sa\u011flar. \u00d6rne\u011fin, bir veri \u00e7ekme servisinin daha fazla kayna\u011fa ihtiyac\u0131 oldu\u011funda, sadece o servisin konteynerini \u00f6l\u00e7eklendirmek yeterli olur. Apache Airflow gibi i\u015f ak\u0131\u015f\u0131 y\u00f6neticileri ile entegre edildi\u011finde, her bir Airflow g\u00f6revi (task) bir Docker konteyneri i\u00e7inde \u00e7al\u0131\u015ft\u0131r\u0131labilir. Bu, her g\u00f6revin kendi izole ortam\u0131nda, belirli bir k\u00fct\u00fcphane versiyonu veya yap\u0131land\u0131rma ile \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. Bu sayede, karma\u015f\u0131k veri ak\u0131\u015flar\u0131 daha mod\u00fcler, hataya dayan\u0131kl\u0131 ve y\u00f6netilebilir hale gelir. Ayr\u0131ca, farkl\u0131 ortamlarda (geli\u015ftirme, haz\u0131rl\u0131k, \u00fcretim) ayn\u0131 pipeline&#8217;\u0131 \u00e7al\u0131\u015ft\u0131rmak, konteynerle\u015ftirme sayesinde sorunsuz bir \u015fekilde ger\u00e7ekle\u015ftirilir.<\/p>\n<h3>Senaryo 3: Geli\u015ftirme ve Test \u0130\u00e7in H\u0131zl\u0131 Veritaban\u0131 ve Mesaj Kuyru\u011fu Kurulumlar\u0131 Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Veri m\u00fchendisleri, genellikle PostgreSQL, MySQL, Apache Kafka, Redis veya Apache Cassandra gibi veritabanlar\u0131 ve mesaj kuyruklar\u0131 ile \u00e7al\u0131\u015f\u0131r. Bu servislerin yerel makinelere veya test sunucular\u0131na manuel olarak kurulmas\u0131 ve yap\u0131land\u0131r\u0131lmas\u0131 zaman al\u0131c\u0131 ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7tir. Docker, bu servislerin saniyeler i\u00e7inde aya\u011fa kald\u0131r\u0131lmas\u0131n\u0131 sa\u011flar. \u00d6rne\u011fin, sadece bir <code>docker run postgres<\/code> komutu ile bir PostgreSQL veritaban\u0131 an\u0131nda \u00e7al\u0131\u015f\u0131r hale getirilebilir. Docker Compose ile birden fazla servis (\u00f6rne\u011fin, bir PostgreSQL veritaban\u0131, bir Kafka broker&#8217;\u0131 ve bir Python veri i\u015fleme uygulamas\u0131) tek bir komutla topluca ba\u015flat\u0131labilir. Bu, \u00f6zellikle veri pipeline&#8217;lar\u0131 i\u00e7in u\u00e7tan uca entegrasyon testleri yaparken inan\u0131lmaz bir kolayl\u0131k sa\u011flar. Her test \u00e7al\u0131\u015ft\u0131rmas\u0131 i\u00e7in temiz bir veritaban\u0131 veya mesaj kuyru\u011fu ortam\u0131 h\u0131zla olu\u015fturulabilir ve test bitiminde kolayca kald\u0131r\u0131labilir. Bu, geli\u015ftirme s\u00fcre\u00e7lerini h\u0131zland\u0131r\u0131r ve testlerin g\u00fcvenilirli\u011fini art\u0131r\u0131r.<\/p>\n<h3>Senaryo 4: Tekrarlanabilir Ara\u015ft\u0131rma ve Geli\u015ftirme Ortamlar\u0131 Nas\u0131l Olu\u015fturulur?<\/h3>\n<p>Veri bilimi ve makine \u00f6\u011frenimi alan\u0131nda yap\u0131lan ara\u015ft\u0131rmalar, genellikle belirli Python veya R k\u00fct\u00fcphanelerinin \u00f6zel versiyonlar\u0131na, CUDA s\u00fcr\u00fcc\u00fclerine veya belirli veri setlerine ba\u011f\u0131ml\u0131d\u0131r. Bir ara\u015ft\u0131rman\u0131n veya modelin sonu\u00e7lar\u0131n\u0131n tekrarlanabilir olmas\u0131, bilimsel \u00e7al\u0131\u015fmalar\u0131n temel prensibidir. Docker, t\u00fcm bu ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve hatta kullan\u0131lan veri setlerini (belki bir volume mount ile) tek bir konteyner imaj\u0131na paketleyerek, ara\u015ft\u0131rman\u0131n tam olarak hangi ortamda yap\u0131ld\u0131\u011f\u0131n\u0131 dondurmay\u0131 sa\u011flar. Bu sayede, ayn\u0131 ara\u015ft\u0131rman\u0131n y\u0131llar sonra bile ayn\u0131 sonu\u00e7lar\u0131 verecek \u015fekilde tekrar \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 m\u00fcmk\u00fcn olur. Bu yakla\u015f\u0131m, hem akademik ara\u015ft\u0131rmalarda hem de end\u00fcstriyel Ar-Ge projelerinde g\u00fcvenilirli\u011fi ve \u015feffafl\u0131\u011f\u0131 art\u0131r\u0131r.<\/p>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere, Docker veri m\u00fchendisli\u011fi projelerinin bir\u00e7ok a\u015famas\u0131nda kritik bir rol oynamaktad\u0131r. Ortam tutarl\u0131l\u0131\u011f\u0131ndan da\u011f\u0131t\u0131m kolayl\u0131\u011f\u0131na, test s\u00fcre\u00e7lerinin h\u0131zlanmas\u0131ndan tekrarlanabilirli\u011fe kadar bir\u00e7ok avantaj sunarak modern veri altyap\u0131lar\u0131n\u0131n temelini olu\u015fturmaktad\u0131r.<\/p>\n<h2>Docker Compose ile \u00c7oklu Servis Y\u00f6netimi Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>Veri m\u00fchendisli\u011fi projeleri nadiren tek bir bile\u015fenden olu\u015fur. Genellikle bir veritaban\u0131, bir veri i\u015fleme motoru, bir mesaj kuyru\u011fu ve belki bir izleme arac\u0131 gibi birden fazla servisin bir araya gelmesiyle karma\u015f\u0131k bir yap\u0131 ortaya \u00e7\u0131kar. Bu \u00e7oklu servis mimarisini y\u00f6netmek, her bir servisi manuel olarak ba\u015flat\u0131p durdurmak yerine daha entegre bir yakla\u015f\u0131ma ihtiya\u00e7 duyar. \u0130\u015fte tam da bu noktada Docker Compose devreye girer.<\/p>\n<p>Docker Compose, \u00e7oklu konteyner Docker uygulamalar\u0131n\u0131 tan\u0131mlamak ve \u00e7al\u0131\u015ft\u0131rmak i\u00e7in bir ara\u00e7t\u0131r. Tek bir YAML dosyas\u0131 kullanarak, uygulaman\u0131z\u0131n t\u00fcm servislerini, a\u011flar\u0131n\u0131 ve veri birimlerini (volumes) yap\u0131land\u0131rabilirsiniz. Bu dosya sayesinde, t\u00fcm y\u0131\u011f\u0131n\u0131 tek bir komutla aya\u011fa kald\u0131rabilir, durdurabilir ve y\u00f6netebilirsiniz. Bu, \u00f6zellikle geli\u015ftirme ve test ortamlar\u0131nda inan\u0131lmaz bir kolayl\u0131k sa\u011flar. Docker Compose&#8217;un temel amac\u0131, birden fazla ba\u011f\u0131ml\u0131 servisten olu\u015fan bir uygulamay\u0131 tek bir birim olarak ele almakt\u0131r. \u00d6rne\u011fin, bir veri pipeline&#8217;\u0131 i\u00e7in bir PostgreSQL veritaban\u0131, verileri i\u015fleyen bir Python Flask uygulamas\u0131 ve i\u015flem sonu\u00e7lar\u0131n\u0131 g\u00f6steren bir Jupyter Notebook servisi gibi \u00fc\u00e7 farkl\u0131 bile\u015feni ayn\u0131 anda ve do\u011fru s\u0131rayla ba\u015flatmak isteyebilirsiniz. Docker Compose, bu senaryoyu basit bir yap\u0131land\u0131rma dosyas\u0131yla m\u00fcmk\u00fcn k\u0131lar.<\/p>\n<p>Bir <code>docker-compose.yml<\/code> dosyas\u0131n\u0131n temel yap\u0131s\u0131 \u015f\u00f6yledir:<\/p>\n<pre><code>\nversion: '3.8' # Docker Compose dosya format\u0131 versiyonu\nservices:\n  veritabani: # Servis ad\u0131\n    image: postgres:14 # Kullan\u0131lacak Docker imaj\u0131\n    environment:\n      POSTGRES_DB: veridb\n      POSTGRES_USER: user\n      POSTGRES_PASSWORD: password\n    ports:\n      - \"5432:5432\" # Ana makine portu:konteyner portu e\u015fle\u015fmesi\n    volumes:\n      - pgdata:\/var\/lib\/postgresql\/data # Kal\u0131c\u0131 veri depolama\n  \n  veri-isleyici: # Servis ad\u0131\n    build: .\/app # Dockerfile'\u0131n bulundu\u011fu dizin\n    ports:\n      - \"5000:5000\"\n    depends_on:\n      - veritabani # Bu servisin 'veritabani' servisine ba\u011f\u0131ml\u0131 oldu\u011funu belirtir\n    environment:\n      DATABASE_URL: postgresql:\/\/user:password@veritabani:5432\/veridb # Veritaban\u0131 ba\u011flant\u0131 URL'si\n  \n  jupyter-notebook: # Servis ad\u0131\n    image: jupyter\/scipy-notebook:latest\n    ports:\n      - \"8888:8888\"\n    volumes:\n      - .\/notebooks:\/home\/jovyan\/work\n    depends_on:\n      - veri-isleyici\n    environment:\n      JUPYTER_ENABLE_LAB: \"yes\"\n\nvolumes:\n  pgdata: # pgdata ad\u0131nda bir volume tan\u0131mlamas\u0131\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte:<\/p>\n<ul>\n<li><code>version<\/code>: Docker Compose dosyas\u0131n\u0131n format s\u00fcr\u00fcm\u00fcn\u00fc belirtir.<\/li>\n<li><code>services<\/code>: Uygulaman\u0131zdaki her bir bile\u015feni tan\u0131mlad\u0131\u011f\u0131m\u0131z b\u00f6l\u00fcmd\u00fcr.<\/li>\n<li><code>veritabani<\/code>: PostgreSQL veritaban\u0131 servisimizi tan\u0131mlar. <code>image<\/code> anahtar\u0131 ile Docker Hub'dan \u00e7ekilecek imaj\u0131, <code>environment<\/code> ile ortam de\u011fi\u015fkenlerini, <code>ports<\/code> ile port e\u015fle\u015ftirmelerini ve <code>volumes<\/code> ile veritaban\u0131 verilerinin kal\u0131c\u0131 olarak saklanaca\u011f\u0131 bir veri birimini belirtiriz.<\/li>\n<li><code>veri-isleyici<\/code>: Kendi yazd\u0131\u011f\u0131m\u0131z bir veri i\u015fleme uygulamas\u0131n\u0131 i\u00e7eren bir servistir. <code>build: .\/app<\/code> ifadesi, bu servisin imaj\u0131n\u0131n <code>.\/app<\/code> dizinindeki Dockerfile kullan\u0131larak olu\u015fturulaca\u011f\u0131n\u0131 s\u00f6yler. <code>depends_on<\/code> ifadesi, bu servisin <code>veritabani<\/code> servisi ba\u015flamadan \u00e7al\u0131\u015fmamas\u0131 gerekti\u011fini belirtir.<\/li>\n<li><code>jupyter-notebook<\/code>: Veri analizi i\u00e7in bir Jupyter Notebook ortam\u0131 sa\u011flar. Kendi not defterlerimizi saklamak i\u00e7in <code>volumes<\/code> kullan\u0131r\u0131z.<\/li>\n<li><code>volumes<\/code>: Konteynerlerin verilerini kal\u0131c\u0131 olarak depolamak i\u00e7in kullan\u0131lan isimlendirilmi\u015f veri birimlerini (named volumes) tan\u0131mlar. Bu sayede konteynerler silinse bile verileriniz kaybolmaz.<\/li>\n<\/ul>\n<p>Bu <code>docker-compose.yml<\/code> dosyas\u0131n\u0131 olu\u015fturduktan sonra, t\u00fcm servisleri ba\u015flatmak i\u00e7in tek yapman\u0131z gereken dosyan\u0131n bulundu\u011fu dizinde \u015fu komutu \u00e7al\u0131\u015ft\u0131rmakt\u0131r:<\/p>\n<pre><code>\ndocker compose up -d\n<\/pre>\n<p><\/code><\/p>\n<p><code>-d<\/code> bayra\u011f\u0131, konteynerleri arka planda (detached mode) \u00e7al\u0131\u015ft\u0131rman\u0131z\u0131 sa\u011flar. Servisleri durdurmak ve kald\u0131rmak i\u00e7in ise:<\/p>\n<pre><code>\ndocker compose down\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komutlar, veri m\u00fchendisli\u011fi projelerinizdeki birden fazla bile\u015feni y\u00f6netmeyi inan\u0131lmaz derecede basitle\u015ftirir. Geli\u015ftirme ortam\u0131n\u0131zdaki t\u00fcm veritabanlar\u0131n\u0131, mesaj kuyruklar\u0131n\u0131 ve uygulama servislerini tek bir dosyayla kontrol edebilir, b\u00f6ylece proje kurulumunu h\u0131zland\u0131rabilir ve tutarl\u0131l\u0131\u011f\u0131 sa\u011flayabilirsiniz. Docker Compose, \u00f6zellikle karma\u015f\u0131k mikroservis mimarilerine sahip veri platformlar\u0131n\u0131n yerel geli\u015ftirme ve test s\u00fcre\u00e7lerinde vazge\u00e7ilmez bir ara\u00e7t\u0131r. Bu ara\u00e7 sayesinde, geli\u015ftiriciler kendi makinelerinde \u00fcretim ortam\u0131n\u0131n k\u00fc\u00e7\u00fck bir sim\u00fclasyonunu kolayca olu\u015fturabilir ve uygulamalar\u0131n\u0131 daha g\u00fcvenli bir \u015fekilde test edebilirler.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: \u00c7oklu konteyner uygulamalar\u0131nda servisler aras\u0131 ileti\u015fimi yap\u0131land\u0131rmak i\u00e7in Docker Compose'un otomatik a\u011f olu\u015fturma \u00f6zelli\u011finden faydalan\u0131n. Servis isimleri, a\u011f i\u00e7inde do\u011frudan host ad\u0131 olarak kullan\u0131labilir, b\u00f6ylece IP adresleriyle u\u011fra\u015fmak zorunda kalmazs\u0131n\u0131z. \u00d6rne\u011fin, yukar\u0131daki \u00f6rnekte <code>veri-isleyici<\/code> servisi, <code>veritabani<\/code> servisine <code>veritabani:5432<\/code> adresi \u00fczerinden ula\u015fabilir.\n<\/div>\n<h2>Ad\u0131m Ad\u0131m Uygulama: Konteynerize Edilmi\u015f Bir Veri Pipeline'\u0131 Olu\u015fturma<\/h2>\n<p>\u015eimdi, Docker ve Docker Compose kullanarak basit bir veri pipeline'\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l olu\u015fturaca\u011f\u0131m\u0131za bakal\u0131m. Bu \u00f6rnekte, bir Python script'i ile bir CSV dosyas\u0131ndan veri okuyacak, basit bir i\u015flem yapacak ve bu veriyi bir PostgreSQL veritaban\u0131na yazaca\u011f\u0131z. T\u00fcm bu bile\u015fenler konteynerler i\u00e7inde \u00e7al\u0131\u015facak.<\/p>\n<h3>Ad\u0131m 1: Dockerfile Olu\u015fturma - Veri \u0130\u015fleme Uygulamam\u0131z \u0130\u00e7in Temel \u0130maj<\/h3>\n<p>\u00d6ncelikle, veri i\u015fleme mant\u0131\u011f\u0131n\u0131 i\u00e7eren bir Python uygulamas\u0131 olu\u015ftural\u0131m. <code>app<\/code> ad\u0131nda bir dizin i\u00e7inde <code>main.py<\/code> ve <code>requirements.txt<\/code> dosyalar\u0131 olacak. Ayr\u0131ca, \u00f6rnek bir <code>data.csv<\/code> dosyas\u0131 da olu\u015ftural\u0131m.<\/p>\n<p><code>data.csv<\/code> i\u00e7eri\u011fi:<\/p>\n<pre><code>\nid,ad,yas\n1,Ay\u015fe,30\n2,Mehmet,25\n3,Elif,35\n<\/pre>\n<p><\/code><\/p>\n<p><code>requirements.txt<\/code> i\u00e7eri\u011fi:<\/p>\n<pre><code>\npandas==1.5.3\npsycopg2-binary==2.9.5\nsqlalchemy==1.4.46\n<\/pre>\n<p><\/code><\/p>\n<p><code>main.py<\/code> i\u00e7eri\u011fi:<\/p>\n<pre><code>\nimport pandas as pd\nfrom sqlalchemy import create_engine\nimport os\nimport time\n\n# Ortam de\u011fi\u015fkenlerinden veritaban\u0131 ba\u011flant\u0131 bilgilerini al\nDB_HOST = os.getenv('DB_HOST', 'veritabani') # Docker Compose servisi ad\u0131\nDB_NAME = os.getenv('DB_NAME', 'veridb')\nDB_USER = os.getenv('DB_USER', 'user')\nDB_PASSWORD = os.getenv('DB_PASSWORD', 'password')\n\n# PostgreSQL ba\u011flant\u0131 URL'si\nDATABASE_URL = f\"postgresql:\/\/{DB_USER}:{DB_PASSWORD}@{DB_HOST}:5432\/{DB_NAME}\"\n\ndef connect_to_db(retries=5, delay=5):\n    \"\"\"Veritaban\u0131na ba\u011flanmay\u0131 dener, ba\u015far\u0131s\u0131z olursa tekrar dener.\"\"\"\n    for i in range(retries):\n        try:\n            engine = create_engine(DATABASE_URL)\n            with engine.connect() as conn:\n                print(\"Veritaban\u0131 ba\u011flant\u0131s\u0131 ba\u015far\u0131l\u0131!\")\n            return engine\n        except Exception as e:\n            print(f\"Veritaban\u0131na ba\u011flan\u0131lamad\u0131, tekrar deniyor... ({i+1}\/{retries}) - Hata: {e}\")\n            time.sleep(delay)\n    raise Exception(\"Veritaban\u0131na ba\u011flan\u0131lamad\u0131, uygulama sonland\u0131r\u0131l\u0131yor.\")\n\ndef process_data():\n    \"\"\"CSV dosyas\u0131ndan veri okur, i\u015fler ve PostgreSQL'e yazar.\"\"\"\n    try:\n        # Veritaban\u0131na ba\u011flan\n        engine = connect_to_db()\n\n        # CSV dosyas\u0131n\u0131 oku\n        df = pd.read_csv('data.csv')\n        print(\"CSV dosyas\u0131 okundu:\")\n        print(df)\n\n        # Basit bir veri i\u015fleme: 'yas' s\u00fctununa 1 ekle\n        df['yeni_yas'] = df['yas'] + 1\n        print(\"Veri i\u015flendi (yeni_yas s\u00fctunu eklendi):\")\n        print(df)\n\n        # Verileri PostgreSQL'e yaz\n        table_name = 'kullanicilar'\n        df.to_sql(table_name, engine, if_exists='replace', index=False)\n        print(f\"Veriler '{table_name}' tablosuna ba\u015far\u0131yla yaz\u0131ld\u0131.\")\n\n    except Exception as e:\n        print(f\"Bir hata olu\u015ftu: {e}\")\n\nif __name__ == \"__main__\":\n    process_data()\n\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi bu Python uygulamas\u0131n\u0131 i\u00e7eren Docker imaj\u0131n\u0131 olu\u015ftural\u0131m. <code>app<\/code> dizininin k\u00f6k\u00fcnde bir <code>Dockerfile<\/code> olu\u015fturun:<\/p>\n<pre><code>\n# Python 3.9 Alpine s\u00fcr\u00fcm\u00fcn\u00fc temel imaj olarak kullan\nFROM python:3.9-alpine\n\n# \u00c7al\u0131\u015fma dizinini ayarla\nWORKDIR \/app\n\n# Ba\u011f\u0131ml\u0131l\u0131klar\u0131 kopyala ve kur\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\n\n# Uygulama kodunu kopyala\nCOPY . .\n\n# Uygulamay\u0131 \u00e7al\u0131\u015ft\u0131r\nCMD [\"python\", \"main.py\"]\n<\/pre>\n<p><\/code><\/p>\n<p>Bu Dockerfile, Python 3.9-alpine temel imaj\u0131n\u0131 kullanarak bir konteyner olu\u015fturur, ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckler ve ard\u0131ndan <code>main.py<\/code> dosyas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131r.<\/p>\n<h3>Ad\u0131m 2: Docker Compose ile Servisleri Tan\u0131mlama<\/h3>\n<p>\u015eimdi veri i\u015fleme uygulamam\u0131z\u0131 ve PostgreSQL veritaban\u0131m\u0131z\u0131 bir araya getirecek bir <code>docker-compose.yml<\/code> dosyas\u0131 olu\u015ftural\u0131m. Bu dosyay\u0131 <code>app<\/code> dizininin bir \u00fcst dizininde, yani projenin k\u00f6k dizininde olu\u015fturmal\u0131y\u0131z.<\/p>\n<pre><code>\nversion: '3.8'\n\nservices:\n  veritabani:\n    image: postgres:14-alpine # Daha hafif bir PostgreSQL imaj\u0131\n    environment:\n      POSTGRES_DB: veridb\n      POSTGRES_USER: user\n      POSTGRES_PASSWORD: password\n    ports:\n      - \"5432:5432\"\n    volumes:\n      - pgdata:\/var\/lib\/postgresql\/data # Veritaban\u0131 verilerinin kal\u0131c\u0131l\u0131\u011f\u0131 i\u00e7in\n    healthcheck: # Veritaban\u0131n\u0131n haz\u0131r olup olmad\u0131\u011f\u0131n\u0131 kontrol et\n      test: [\"CMD-SHELL\", \"pg_isready -U user -d veridb\"]\n      interval: 5s\n      timeout: 5s\n      retries: 5\n      start_period: 10s # \u0130lk 10 saniye kontrol yapma\n\n  veri-isleyici:\n    build: .\/app # 'app' dizinindeki Dockerfile'dan imaj olu\u015ftur\n    environment:\n      DB_HOST: veritabani # PostgreSQL servisine host ad\u0131 ile eri\u015fim\n      DB_NAME: veridb\n      DB_USER: user\n      DB_PASSWORD: password\n    volumes:\n      - .\/app\/data.csv:\/app\/data.csv # data.csv dosyas\u0131n\u0131 konteyner i\u00e7ine mount et\n    depends_on:\n      veritabani:\n        condition: service_healthy # veritabani servisi sa\u011fl\u0131kl\u0131 olana kadar bekle\n<\/pre>\n<p><\/code><\/p>\n<p>Bu <code>docker-compose.yml<\/code> dosyas\u0131nda:<\/p>\n<ul>\n<li><code>veritabani<\/code>: PostgreSQL servisini tan\u0131mlar. <code>postgres:14-alpine<\/code> imaj\u0131n\u0131 kullanarak hafif bir veritaban\u0131 ortam\u0131 olu\u015ftururuz. <code>healthcheck<\/code> b\u00f6l\u00fcm\u00fc, veri i\u015fleyici uygulamas\u0131n\u0131n ba\u015flamadan \u00f6nce veritaban\u0131n\u0131n tamamen haz\u0131r olmas\u0131n\u0131 sa\u011flamak i\u00e7in kritik \u00f6neme sahiptir.<\/li>\n<li><code>veri-isleyici<\/code>: Kendi Python veri i\u015fleme uygulamam\u0131z\u0131 \u00e7al\u0131\u015ft\u0131ran servistir. <code>build: .\/app<\/code> ile <code>app<\/code> dizinindeki Dockerfile'dan imaj\u0131n\u0131 olu\u015fturmas\u0131n\u0131 isteriz. Ortam de\u011fi\u015fkenlerini (<code>environment<\/code>) kullanarak Python uygulamam\u0131z\u0131n veritaban\u0131 ba\u011flant\u0131 bilgilerine eri\u015fmesini sa\u011flar\u0131z. <code>data.csv<\/code> dosyas\u0131n\u0131 konteyner i\u00e7ine <code>volumes<\/code> ile mount ederek, uygulaman\u0131n bu dosyay\u0131 okuyabilmesini sa\u011fl\u0131yoruz. <code>depends_on: veritabani: condition: service_healthy<\/code> ifadesi, <code>veri-isleyici<\/code> servisinin, <code>veritabani<\/code> servisi tamamen sa\u011fl\u0131kl\u0131 (yani \u00e7al\u0131\u015f\u0131r ve ba\u011flant\u0131lar\u0131 kabul edebilir) olana kadar ba\u015flat\u0131lmamas\u0131n\u0131 garanti eder. Bu, ba\u011flant\u0131 hatalar\u0131n\u0131 \u00f6nler.<\/li>\n<\/ul>\n<h3>Ad\u0131m 3: Pipeline'\u0131 \u00c7al\u0131\u015ft\u0131rma ve Test Etme<\/h3>\n<p>Proje k\u00f6k dizininde (<code>docker-compose.yml<\/code> dosyas\u0131n\u0131n oldu\u011fu yerde) terminali a\u00e7\u0131n ve \u015fu komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code>\ndocker compose up --build -d\n<\/pre>\n<p><\/code><\/p>\n<ul>\n<li><code>up<\/code>: Docker Compose dosyas\u0131nda tan\u0131mlanan servisleri olu\u015fturur ve ba\u015flat\u0131r.<\/li>\n<li><code>--build<\/code>: <code>veri-isleyici<\/code> servisi i\u00e7in Dockerfile'\u0131 kullanarak imaj\u0131 yeniden olu\u015fturur (sadece ilk \u00e7al\u0131\u015ft\u0131rmada veya Dockerfile'da de\u011fi\u015fiklik yap\u0131ld\u0131\u011f\u0131nda gereklidir).<\/li>\n<li><code>-d<\/code>: Servisleri arka planda (detached mode) \u00e7al\u0131\u015ft\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Konteynerler ba\u015flat\u0131l\u0131rken \u00e7\u0131kt\u0131lar\u0131 g\u00f6receksiniz. <code>veri-isleyici<\/code> konteyneri, veritaban\u0131 haz\u0131r olana kadar bekleyecektir. \u0130\u015flem tamamland\u0131\u011f\u0131nda, <code>veri-isleyici<\/code> konteyneri kapanabilir (\u00e7\u00fcnk\u00fc script tek seferlik bir i\u015f yap\u0131yor). Konteynerlerin durumunu kontrol etmek i\u00e7in:<\/p>\n<pre><code>\ndocker ps -a\n<\/pre>\n<p><\/code><\/p>\n<p><code>veri-isleyici<\/code> konteynerinin loglar\u0131n\u0131 g\u00f6rmek i\u00e7in:<\/p>\n<pre><code>\ndocker compose logs veri-isleyici\n<\/pre>\n<p><\/code><\/p>\n<p>Bu loglarda, CSV dosyas\u0131n\u0131n okundu\u011funu, verinin i\u015flendi\u011fini ve veritaban\u0131na yaz\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6steren \u00e7\u0131kt\u0131lar\u0131 g\u00f6rmelisiniz. Veritaban\u0131na ger\u00e7ekten yaz\u0131l\u0131p yaz\u0131lmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in, bir PostgreSQL istemcisi (\u00f6rne\u011fin <code>psql<\/code> veya DBeaver) kullanarak yerel makinenizdeki <code>5432<\/code> portuna ba\u011flanabilirsiniz (kullan\u0131c\u0131: <code>user<\/code>, \u015fifre: <code>password<\/code>, veritaban\u0131: <code>veridb<\/code>). Ba\u011fland\u0131ktan sonra <code>SELECT * FROM kullanicilar;<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak verilerin yaz\u0131ld\u0131\u011f\u0131n\u0131 teyit edebilirsiniz.<\/p>\n<p>\u0130\u015finiz bitti\u011finde, t\u00fcm servisleri ve olu\u015fturulan a\u011flar\u0131\/volume'lar\u0131 temizlemek i\u00e7in:<\/p>\n<pre><code>\ndocker compose down\n<\/pre>\n<p><\/code><\/p>\n<p>Bu ad\u0131mlar, veri m\u00fchendisli\u011fi projelerinizde konteynerle\u015ftirmenin g\u00fcc\u00fcn\u00fc nas\u0131l kullanabilece\u011finizi g\u00f6steren basit ama etkili bir \u00f6rnektir. Bu temel yap\u0131 \u00fczerine kurarak \u00e7ok daha karma\u015f\u0131k ve b\u00fcy\u00fck \u00f6l\u00e7ekli veri pipeline'lar\u0131 olu\u015fturabilirsiniz. Her bir bile\u015feni izole ve y\u00f6netilebilir konteynerler halinde ele almak, geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r, hata ay\u0131klamay\u0131 kolayla\u015ft\u0131r\u0131r ve t\u00fcm ekosistemin tutarl\u0131 bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Performans ve G\u00fcvenlik \u0130pu\u00e7lar\u0131: \u0130leri D\u00fczey Konteyner Kullan\u0131m\u0131<\/h2>\n<p>Docker ve Docker Compose ile projelerinizi konteynerle\u015ftirmek harika bir ba\u015flang\u0131\u00e7t\u0131r, ancak bu ara\u00e7lardan en iyi \u015fekilde yararlanmak i\u00e7in performans ve g\u00fcvenlik konular\u0131na da dikkat etmek gerekir. \u0130\u015fte daha deneyimli kullan\u0131c\u0131lar i\u00e7in baz\u0131 ipu\u00e7lar\u0131 ve p\u00fcf noktalar\u0131:<\/p>\n<h3>Docker \u0130majlar\u0131n\u0131 Optimize Etme: Boyut ve H\u0131z Dengesi Nas\u0131l Sa\u011flan\u0131r?<\/h3>\n<p>Docker imajlar\u0131n\u0131n boyutu, da\u011f\u0131t\u0131m h\u0131z\u0131 ve kaynak t\u00fcketimi a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir. Daha k\u00fc\u00e7\u00fck imajlar, daha h\u0131zl\u0131 indirilir, daha az disk alan\u0131 kaplar ve daha az a\u011f trafi\u011fi olu\u015fturur. \u0130maj boyutunu optimize etmek i\u00e7in birka\u00e7 etkili y\u00f6ntem bulunmaktad\u0131r:<\/p>\n<ul>\n<li><strong>K\u00fc\u00e7\u00fck Temel \u0130majlar Kullan\u0131n:<\/strong> <code>alpine<\/code> veya <code>slim<\/code> etiketli imajlar, tam te\u015fekk\u00fcll\u00fc i\u015fletim sistemi imajlar\u0131na g\u00f6re \u00e7ok daha k\u00fc\u00e7\u00fckt\u00fcr ve \u00e7o\u011fu uygulama i\u00e7in yeterlidir. \u00d6rne\u011fin, <code>python:3.9-alpine<\/code> imaj\u0131, <code>python:3.9<\/code> imaj\u0131ndan \u00f6nemli \u00f6l\u00e7\u00fcde k\u00fc\u00e7\u00fckt\u00fcr.<\/li>\n<li><strong>Multi-Stage Build'ler Kullan\u0131n:<\/strong> Bu teknik, imaj boyutunu radikal bir \u015fekilde azaltman\u0131n en g\u00fc\u00e7l\u00fc yollar\u0131ndan biridir. Geli\u015ftirme ve derleme (build) a\u015famalar\u0131 i\u00e7in gerekli olan ara\u00e7lar\u0131 i\u00e7eren b\u00fcy\u00fck bir imaj kullan\u0131rken, son \u00e7al\u0131\u015ft\u0131rma a\u015famas\u0131 i\u00e7in sadece uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gereken minimum bile\u015fenleri i\u00e7eren \u00e7ok daha k\u00fc\u00e7\u00fck bir imaj olu\u015fturman\u0131z\u0131 sa\u011flar. \u00d6rne\u011fin, bir Go veya Node.js uygulamas\u0131n\u0131 derlerken derleyiciyi ilk a\u015famada kullan\u0131p, sadece derlenmi\u015f ikili dosyay\u0131 ikinci (runtime) a\u015famaya kopyalayabilirsiniz.<\/li>\n<li><strong>Gereksiz Ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve Dosyalar\u0131 Temizleyin:<\/strong> <code>pip install<\/code> gibi komutlardan sonra olu\u015fan \u00f6nbellek dosyalar\u0131n\u0131 temizlemek i\u00e7in <code>RUN rm -rf \/var\/cache\/apk\/*<\/code> (Alpine i\u00e7in) veya <code>RUN rm -rf \/var\/lib\/apt\/lists\/*<\/code> (Debian\/Ubuntu i\u00e7in) gibi komutlar ekleyin. Ayr\u0131ca <code>.dockerignore<\/code> dosyas\u0131n\u0131 kullanarak gereksiz dosyalar\u0131n (\u00f6rne\u011fin <code>.git<\/code> klas\u00f6r\u00fc, <code>__pycache__<\/code>, <code>.vscode<\/code> gibi) imaja kopyalanmas\u0131n\u0131 engelleyin.<\/li>\n<li><strong>Katmanlar\u0131 Birle\u015ftirin:<\/strong> Her <code>RUN<\/code>, <code>COPY<\/code>, <code>ADD<\/code> komutu yeni bir imaj katman\u0131 olu\u015fturur. M\u00fcmk\u00fcn oldu\u011funca \u00e7ok komutu tek bir <code>RUN<\/code> komutunda birle\u015ftirerek katman say\u0131s\u0131n\u0131 azalt\u0131n. \u00d6rne\u011fin, birden fazla <code>apt-get install<\/code> komutu yerine bunlar\u0131 tek bir <code>RUN<\/code> komutunda <code>&&<\/code> ile birle\u015ftirebilirsiniz.<\/li>\n<\/ul>\n<h3>G\u00fcvenlik Best Practices: Konteynerlerinizi Nas\u0131l G\u00fcvenli Hale Getirirsiniz?<\/h3>\n<p>Konteynerler izole ortamlar sunsa da, yanl\u0131\u015f yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131nda g\u00fcvenlik a\u00e7\u0131klar\u0131 bar\u0131nd\u0131rabilirler. Veri m\u00fchendisli\u011fi pipeline'lar\u0131 genellikle hassas verilerle \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in g\u00fcvenlik \u00f6nlemleri hayati \u00f6nem ta\u015f\u0131r:<\/p>\n<ul>\n<li><strong>Root Olmayan Kullan\u0131c\u0131larla \u00c7al\u0131\u015ft\u0131r\u0131n:<\/strong> Konteyner i\u00e7indeki uygulamalar\u0131 <code>root<\/code> kullan\u0131c\u0131s\u0131 yerine \u00f6zel, d\u00fc\u015f\u00fck yetkili bir kullan\u0131c\u0131 ile \u00e7al\u0131\u015ft\u0131rmak en temel g\u00fcvenlik prensiplerinden biridir. Dockerfile i\u00e7inde <code>USER<\/code> komutunu kullanarak bunu yapabilirsiniz: <code>RUN adduser -D appuser && USER appuser<\/code>.<\/li>\n<li><strong>Minimum Yetki Prensibi:<\/strong> Konteynerlere sadece ihtiya\u00e7 duyduklar\u0131 izinleri ve kaynaklar\u0131 verin. \u00d6rne\u011fin, bir konteynerin sistemde de\u011fi\u015fiklik yapmas\u0131n\u0131 engellemek i\u00e7in <code>read-only<\/code> dosya sistemi kullanabilir veya <code>CAP_DROP<\/code> ile gereksiz Linux yeteneklerini kald\u0131rabilirsiniz.<\/li>\n<li><strong>\u0130maj G\u00fcvenlik Taramalar\u0131:<\/strong> Docker imajlar\u0131n\u0131z\u0131 bilinen g\u00fcvenlik a\u00e7\u0131klar\u0131na kar\u015f\u0131 taramak i\u00e7in (\u00f6rne\u011fin Trivy, Clair gibi ara\u00e7lar veya Docker Hub'\u0131n kendi tarama \u00f6zelli\u011fi) kullan\u0131n. Temel imajlar\u0131n\u0131z\u0131n g\u00fcncel ve yamal\u0131 oldu\u011fundan emin olun.<\/li>\n<li><strong>S\u0131r Y\u00f6netimi:<\/strong> Hassas bilgiler (veritaban\u0131 \u015fifreleri, API anahtarlar\u0131) do\u011frudan Dockerfile'a veya <code>docker-compose.yml<\/code> dosyas\u0131na yaz\u0131lmamal\u0131d\u0131r. Bunun yerine, Docker Secrets, Kubernetes Secrets veya harici s\u0131r y\u00f6netim sistemleri (HashiCorp Vault gibi) kullan\u0131n. Ortam de\u011fi\u015fkenleri, geli\u015ftirme ortamlar\u0131 i\u00e7in pratik olsa da, \u00fcretimde daha g\u00fcvenli y\u00f6ntemler tercih edilmelidir.<\/li>\n<li><strong>A\u011f Konfig\u00fcrasyonu:<\/strong> Konteyner a\u011flar\u0131n\u0131 dikkatlice yap\u0131land\u0131r\u0131n. Sadece ihtiya\u00e7 duyulan portlar\u0131 a\u00e7\u0131n ve servisler aras\u0131 ileti\u015fimi m\u00fcmk\u00fcn oldu\u011funca kapal\u0131 tutun. Varsay\u0131lan k\u00f6pr\u00fc a\u011flar\u0131 yerine \u00f6zel a\u011flar olu\u015fturmak daha g\u00fcvenlidir.<\/li>\n<\/ul>\n<h3>Kaynak Y\u00f6netimi ve \u00d6l\u00e7eklendirme: Veri Pipeline'lar\u0131n\u0131z \u0130\u00e7in Optimum Performans<\/h3>\n<p>Veri m\u00fchendisli\u011fi i\u015f y\u00fckleri genellikle y\u00fcksek kaynak gereksinimi duyar. Konteynerler, kaynaklar\u0131n etkin bir \u015fekilde y\u00f6netilmesine olanak tan\u0131r:<\/p>\n<ul>\n<li><strong>Kaynak Limitleri Belirleyin:<\/strong> Docker, her bir konteyner i\u00e7in CPU ve bellek limitleri belirlemenize olanak tan\u0131r. \u00d6rne\u011fin, <code>--memory=\"2g\"<\/code> ve <code>--cpus=\"1.5\"<\/code> gibi se\u00e7eneklerle bir konteynerin kullanabilece\u011fi maksimum belle\u011fi ve CPU \u00e7ekirde\u011fi say\u0131s\u0131n\u0131 k\u0131s\u0131tlayabilirsiniz. Bu, bir konteynerin t\u00fcm kaynaklar\u0131 t\u00fcketmesini ve di\u011fer servisleri etkilemesini \u00f6nler.<\/li>\n<li><strong>Konteyner Orkestrasyonu:<\/strong> Tek bir makinede \u00e7al\u0131\u015f\u0131rken Docker Compose yeterli olabilir. Ancak \u00fcretimde ve b\u00fcy\u00fck \u00f6l\u00e7ekli veri pipeline'lar\u0131nda, Docker Swarm veya \u00f6zellikle Kubernetes gibi konteyner orkestrasyon ara\u00e7lar\u0131 vazge\u00e7ilmezdir. Bu ara\u00e7lar, konteynerlerinizi birden fazla sunucuya yayabilir, otomatik \u00f6l\u00e7eklendirme, y\u00fck dengeleme ve kendini iyile\u015ftirme gibi geli\u015fmi\u015f \u00f6zellikler sunar. Veri m\u00fchendisli\u011finde, \u00f6zellikle Apache Spark veya Flink gibi da\u011f\u0131t\u0131k i\u015f y\u00fcklerini y\u00f6netirken Kubernetes, esneklik ve otomasyon a\u00e7\u0131s\u0131ndan b\u00fcy\u00fck avantajlar sa\u011flar.<\/li>\n<li><strong>Veri Kal\u0131c\u0131l\u0131\u011f\u0131:<\/strong> Konteynerler varsay\u0131lan olarak ge\u00e7icidir. Veritabanlar\u0131 veya depolama servisleri gibi kal\u0131c\u0131 veri gerektiren uygulamalar i\u00e7in Docker Volumes veya bind mounts kullanmak \u00e7ok \u00f6nemlidir. Bu, konteynerler silinse bile verilerinizin g\u00fcvende kalmas\u0131n\u0131 sa\u011flar.<\/li>\n<\/ul>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: \u00c7ok a\u015famal\u0131 (multi-stage) Dockerfile'lar, hem g\u00fcvenlik hem de performans a\u00e7\u0131s\u0131ndan harika bir \u00e7\u00f6z\u00fcmd\u00fcr. Geli\u015ftirme ara\u00e7lar\u0131n\u0131 ve derleme ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 nihai \u00fcretim imaj\u0131ndan ay\u0131rarak, hem imaj boyutunu k\u00fc\u00e7\u00fclt\u00fcr hem de olas\u0131 g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131n say\u0131s\u0131n\u0131 azalt\u0131rs\u0131n\u0131z. \u00d6rne\u011fin, bir Python uygulamas\u0131n\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00fckledi\u011finizde, sadece uygulaman\u0131n ve runtime k\u00fct\u00fcphanelerinin oldu\u011fu yeni bir a\u015fama olu\u015fturarak gereksiz build ara\u00e7lar\u0131n\u0131 d\u0131\u015far\u0131da b\u0131rakabilirsiniz.\n<\/div>\n<p>Bu ileri d\u00fczey ipu\u00e7lar\u0131, konteynerle\u015ftirme stratejinizi daha sa\u011flam, g\u00fcvenli ve performansl\u0131 hale getirmenize yard\u0131mc\u0131 olacakt\u0131r. Veri m\u00fchendisli\u011fi ortamlar\u0131 s\u00fcrekli evrildi\u011fi i\u00e7in, bu pratikleri d\u00fczenli olarak g\u00f6zden ge\u00e7irmek ve uygulamak, altyap\u0131n\u0131z\u0131n s\u00fcrd\u00fcr\u00fclebilirli\u011fi a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir.<\/p>\n<h2>Sonu\u00e7: Veri M\u00fchendisli\u011finde Konteynerle\u015fmenin Gelece\u011fi<\/h2>\n<p>Veri m\u00fchendisli\u011fi alan\u0131, s\u00fcrekli olarak yeni teknolojilerin ortaya \u00e7\u0131kmas\u0131 ve veri hacminin artmas\u0131yla birlikte h\u0131zla geli\u015fmektedir. Bu dinamik ortamda, projeleri ba\u015far\u0131l\u0131 bir \u015fekilde y\u00fcr\u00fctmek i\u00e7in esneklik, tutarl\u0131l\u0131k ve \u00f6l\u00e7eklenebilirlik sa\u011flayan ara\u00e7lar vazge\u00e7ilmez hale gelmi\u015ftir. Konteynerle\u015ftirme, \u00f6zellikle Docker ve Docker Compose, bu ihtiya\u00e7lar\u0131 kar\u015f\u0131lamak i\u00e7in g\u00fc\u00e7l\u00fc ve pratik bir \u00e7\u00f6z\u00fcm sunarak modern veri m\u00fchendisli\u011fi yakla\u015f\u0131mlar\u0131n\u0131n temel ta\u015flar\u0131ndan biri haline gelmi\u015ftir.<\/p>\n<p>Bu rehber boyunca ele ald\u0131\u011f\u0131m\u0131z gibi, konteynerler, karma\u015f\u0131k ba\u011f\u0131ml\u0131l\u0131k sorunlar\u0131n\u0131 ortadan kald\u0131rarak geli\u015ftirme ve \u00fcretim ortamlar\u0131 aras\u0131nda tutarl\u0131l\u0131k sa\u011flar. Veri pipeline'lar\u0131n\u0131n her bir bile\u015fenini izole edilmi\u015f birimler halinde y\u00f6netme yetene\u011fi, hata ay\u0131klamay\u0131 kolayla\u015ft\u0131r\u0131r, da\u011f\u0131t\u0131m\u0131 h\u0131zland\u0131r\u0131r ve ekipler aras\u0131 i\u015f birli\u011fini geli\u015ftirir. Docker Compose ise, birden fazla servis i\u00e7eren veri altyap\u0131lar\u0131n\u0131n tek bir komutla kolayca y\u00f6netilmesini sa\u011flayarak, geli\u015ftiricilerin odaklar\u0131n\u0131 kod yazmaya ve veri i\u015flemeye kayd\u0131rmas\u0131na olanak tan\u0131r. Ger\u00e7ek d\u00fcnya senaryolar\u0131 ve ad\u0131m ad\u0131m uygulamalarla, bu teknolojilerin veri m\u00fchendisli\u011fi projelerinizdeki pratik de\u011ferini ve potansiyelini g\u00f6zler \u00f6n\u00fcne sermeye \u00e7al\u0131\u015ft\u0131k.<\/p>\n<p>Konteynerle\u015fmenin gelece\u011fi, bulut tabanl\u0131 konteyner servisleri (\u00f6rne\u011fin AWS ECS\/EKS, Google Cloud Run\/GKE, Azure Container Instances\/AKS) ve daha geli\u015fmi\u015f orkestrasyon ara\u00e7lar\u0131 olan Kubernetes ile giderek daha da entegre olacakt\u0131r. Sunucusuz (serverless) konteynerler, veri m\u00fchendislerinin altyap\u0131 y\u00f6netimi y\u00fck\u00fcn\u00fc daha da azaltarak, sadece i\u015f mant\u0131\u011f\u0131na odaklanmalar\u0131na olanak tan\u0131yacakt\u0131r. Otomasyon, CI\/CD pipeline'lar\u0131 ve DevOps prensipleri ile birle\u015fti\u011finde, konteynerle\u015ftirme, veri platformlar\u0131n\u0131n daha \u00e7evik, g\u00fcvenilir ve uygun maliyetli bir \u015fekilde olu\u015fturulmas\u0131n\u0131 ve i\u015fletilmesini sa\u011flayacakt\u0131r. K\u0131sacas\u0131, veri m\u00fchendisli\u011finde konteynerle\u015fme art\u0131k bir l\u00fcks de\u011fil, projelerinizin ba\u015far\u0131s\u0131 i\u00e7in kritik bir gerekliliktir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<div class=\"faq-container\">\n<h4>Soru 1: Docker ile sanal makineler aras\u0131ndaki temel fark nedir?<\/h4>\n<p><strong>Cevap:<\/strong> Temel fark, i\u015fletim sistemi sanalla\u015ft\u0131rma d\u00fczeyindedir. Sanal makineler (VM'ler), fiziksel donan\u0131m\u0131 sanalla\u015ft\u0131rarak her VM i\u00e7in ayr\u0131 bir tam i\u015fletim sistemi (misafir OS) \u00e7al\u0131\u015ft\u0131r\u0131r. Konteynerler ise ana makinenin i\u015fletim sistemi \u00e7ekirde\u011fini (kernel) payla\u015f\u0131r ve sadece uygulama ile ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 paketler. Bu nedenle konteynerler daha hafif, daha h\u0131zl\u0131 ba\u015flat\u0131l\u0131r ve daha az kaynak t\u00fcketir.<\/p>\n<h4>Soru 2: Docker Compose sadece geli\u015ftirme ortamlar\u0131 i\u00e7in mi kullan\u0131l\u0131r?<\/h4>\n<p><strong>Cevap:<\/strong> Hay\u0131r, Docker Compose geli\u015ftirme ortamlar\u0131 i\u00e7in m\u00fckemmel bir ara\u00e7 olsa da, k\u00fc\u00e7\u00fck \u00f6l\u00e7ekli veya tek sunuculu \u00fcretim ortamlar\u0131nda da kullan\u0131labilir. Ancak, b\u00fcy\u00fck \u00f6l\u00e7ekli ve da\u011f\u0131t\u0131k \u00fcretim ortamlar\u0131 i\u00e7in genellikle Kubernetes veya Docker Swarm gibi daha geli\u015fmi\u015f konteyner orkestrasyon ara\u00e7lar\u0131 tercih edilir, \u00e7\u00fcnk\u00fc bunlar otomatik \u00f6l\u00e7eklendirme, y\u00fck dengeleme ve y\u00fcksek eri\u015filebilirlik gibi \u00f6zellikler sunar.<\/p>\n<h4>Soru 3: Docker imaj\u0131m\u0131n boyutunu nas\u0131l k\u00fc\u00e7\u00fcltebilirim?<\/h4>\n<p><strong>Cevap:<\/strong> \u0130maj boyutunu k\u00fc\u00e7\u00fcltmek i\u00e7in <code>alpine<\/code> veya <code>slim<\/code> gibi k\u00fc\u00e7\u00fck temel imajlar kullan\u0131n, multi-stage build'ler uygulay\u0131n, gereksiz ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve \u00f6nbellek dosyalar\u0131n\u0131 temizleyin, <code>.dockerignore<\/code> dosyas\u0131n\u0131 kullan\u0131n ve <code>RUN<\/code> komutlar\u0131n\u0131 zincirleyerek katman say\u0131s\u0131n\u0131 azalt\u0131n.<\/p>\n<h4>Soru 4: Konteynerlerde veri kal\u0131c\u0131l\u0131\u011f\u0131n\u0131 nas\u0131l sa\u011flar\u0131m?<\/h4>\n<p><strong>Cevap:<\/strong> Konteynerler varsay\u0131lan olarak ge\u00e7icidir. Veri kal\u0131c\u0131l\u0131\u011f\u0131 i\u00e7in Docker Volumes (isimlendirilmi\u015f veri birimleri) veya bind mounts kullanmal\u0131s\u0131n\u0131z. Volumes, Docker taraf\u0131ndan y\u00f6netilen kal\u0131c\u0131 depolama alanlar\u0131d\u0131r ve veritabanlar\u0131 gibi uygulamalar i\u00e7in idealdir. Bind mounts ise ana makinedeki bir dizini do\u011frudan konteyner i\u00e7ine ba\u011flaman\u0131za olanak tan\u0131r ve genellikle geli\u015ftirme s\u0131ras\u0131nda kod payla\u015f\u0131m\u0131 i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h4>Soru 5: Hangi durumda Kubernetes'e ge\u00e7meliyim?<\/h4>\n<p><strong>Cevap:<\/strong> E\u011fer uygulaman\u0131z \u00e7ok say\u0131da konteynerden olu\u015fuyorsa, y\u00fcksek eri\u015filebilirlik ve hata tolerans\u0131 gerektiriyorsa, dinamik olarak \u00f6l\u00e7eklenmesi gerekiyorsa veya birden fazla sunucu \u00fczerinde \u00e7al\u0131\u015fmas\u0131 gerekiyorsa Kubernetes'e ge\u00e7meyi d\u00fc\u015f\u00fcnmelisiniz. Docker Compose tek bir host \u00fczerindeki uygulamalar i\u00e7in yeterliyken, Kubernetes da\u011f\u0131t\u0131k sistemler ve karma\u015f\u0131k i\u015f y\u00fckleri i\u00e7in tasarlanm\u0131\u015ft\u0131r.<\/p>\n<\/div>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Veri m\u00fchendisli\u011fi projelerinizin kurulumu, y\u00f6netimi ve da\u011f\u0131t\u0131m\u0131 karma\u015f\u0131k m\u0131? Ba\u011f\u0131ml\u0131l\u0131k sorunlar\u0131, ortam tutars\u0131zl\u0131klar\u0131 ve \u00f6l\u00e7eklenebilirlik zorluklar\u0131yla m\u0131 bo\u011fu\u015fuyorsunuz?&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1407],"tags":[],"class_list":{"0":"post-31739","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-docker","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Veri M\u00fchendisli\u011finde Konteynerle\u015ftirme: Docker ve Docker Compose ile Pratik Bir Rehber<\/title>\n<meta name=\"description\" content=\"Veri m\u00fchendisli\u011fi projelerinizin kurulumu, y\u00f6netimi ve da\u011f\u0131t\u0131m\u0131 karma\u015f\u0131k m\u0131? Ba\u011f\u0131ml\u0131l\u0131k sorunlar\u0131, ortam tutars\u0131zl\u0131klar\u0131 ve \u00f6l\u00e7eklenebilirlik zorluklar\u0131yla m\u0131 bo\u011fu\u015fuyorsunuz? Docker ve Docker Compose ile bu zorluklar\u0131 nas\u0131l a\u015faca\u011f\u0131n\u0131z\u0131 ke\u015ffedin, veri altyap\u0131n\u0131z\u0131 standartla\u015ft\u0131r\u0131n ve projelerinizi tutarl\u0131, ta\u015f\u0131nabilir ve \u00f6l\u00e7eklenebilir hale getirin. Bu kapsaml\u0131 rehber, konuya yeni ba\u015flayanlardan deneyimli veri m\u00fchendislerine kadar herkes i\u00e7in pratik bilgiler sunuyor.\" \/>\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\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Veri M\u00fchendisli\u011finde Konteynerle\u015ftirme: Docker ve Docker Compose ile Pratik Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Veri m\u00fchendisli\u011fi projelerinizin kurulumu, y\u00f6netimi ve da\u011f\u0131t\u0131m\u0131 karma\u015f\u0131k m\u0131? Ba\u011f\u0131ml\u0131l\u0131k sorunlar\u0131, ortam tutars\u0131zl\u0131klar\u0131 ve \u00f6l\u00e7eklenebilirlik zorluklar\u0131yla m\u0131 bo\u011fu\u015fuyorsunuz? Docker ve Docker Compose ile bu zorluklar\u0131 nas\u0131l a\u015faca\u011f\u0131n\u0131z\u0131 ke\u015ffedin, veri altyap\u0131n\u0131z\u0131 standartla\u015ft\u0131r\u0131n ve projelerinizi tutarl\u0131, ta\u015f\u0131nabilir ve \u00f6l\u00e7eklenebilir hale getirin. Bu kapsaml\u0131 rehber, konuya yeni ba\u015flayanlardan deneyimli veri m\u00fchendislerine kadar herkes i\u00e7in pratik bilgiler sunuyor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-13T09:01:30+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"27 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Veri M\u00fchendisli\u011finde Konteynerle\u015ftirme: Docker ve Docker Compose ile Pratik Bir Rehber\",\"datePublished\":\"2025-10-13T09:01:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/\"},\"wordCount\":4789,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Docker\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/\",\"name\":\"Veri M\u00fchendisli\u011finde Konteynerle\u015ftirme: Docker ve Docker Compose ile Pratik Bir Rehber\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-13T09:01:30+00:00\",\"description\":\"Veri m\u00fchendisli\u011fi projelerinizin kurulumu, y\u00f6netimi ve da\u011f\u0131t\u0131m\u0131 karma\u015f\u0131k m\u0131? Ba\u011f\u0131ml\u0131l\u0131k sorunlar\u0131, ortam tutars\u0131zl\u0131klar\u0131 ve \u00f6l\u00e7eklenebilirlik zorluklar\u0131yla m\u0131 bo\u011fu\u015fuyorsunuz? Docker ve Docker Compose ile bu zorluklar\u0131 nas\u0131l a\u015faca\u011f\u0131n\u0131z\u0131 ke\u015ffedin, veri altyap\u0131n\u0131z\u0131 standartla\u015ft\u0131r\u0131n ve projelerinizi tutarl\u0131, ta\u015f\u0131nabilir ve \u00f6l\u00e7eklenebilir hale getirin. Bu kapsaml\u0131 rehber, konuya yeni ba\u015flayanlardan deneyimli veri m\u00fchendislerine kadar herkes i\u00e7in pratik bilgiler sunuyor.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Veri M\u00fchendisli\u011finde Konteynerle\u015ftirme: Docker ve Docker Compose ile Pratik Bir Rehber\"}]},{\"@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":"Veri M\u00fchendisli\u011finde Konteynerle\u015ftirme: Docker ve Docker Compose ile Pratik Bir Rehber","description":"Veri m\u00fchendisli\u011fi projelerinizin kurulumu, y\u00f6netimi ve da\u011f\u0131t\u0131m\u0131 karma\u015f\u0131k m\u0131? Ba\u011f\u0131ml\u0131l\u0131k sorunlar\u0131, ortam tutars\u0131zl\u0131klar\u0131 ve \u00f6l\u00e7eklenebilirlik zorluklar\u0131yla m\u0131 bo\u011fu\u015fuyorsunuz? Docker ve Docker Compose ile bu zorluklar\u0131 nas\u0131l a\u015faca\u011f\u0131n\u0131z\u0131 ke\u015ffedin, veri altyap\u0131n\u0131z\u0131 standartla\u015ft\u0131r\u0131n ve projelerinizi tutarl\u0131, ta\u015f\u0131nabilir ve \u00f6l\u00e7eklenebilir hale getirin. Bu kapsaml\u0131 rehber, konuya yeni ba\u015flayanlardan deneyimli veri m\u00fchendislerine kadar herkes i\u00e7in pratik bilgiler sunuyor.","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\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Veri M\u00fchendisli\u011finde Konteynerle\u015ftirme: Docker ve Docker Compose ile Pratik Bir Rehber","og_description":"Veri m\u00fchendisli\u011fi projelerinizin kurulumu, y\u00f6netimi ve da\u011f\u0131t\u0131m\u0131 karma\u015f\u0131k m\u0131? Ba\u011f\u0131ml\u0131l\u0131k sorunlar\u0131, ortam tutars\u0131zl\u0131klar\u0131 ve \u00f6l\u00e7eklenebilirlik zorluklar\u0131yla m\u0131 bo\u011fu\u015fuyorsunuz? Docker ve Docker Compose ile bu zorluklar\u0131 nas\u0131l a\u015faca\u011f\u0131n\u0131z\u0131 ke\u015ffedin, veri altyap\u0131n\u0131z\u0131 standartla\u015ft\u0131r\u0131n ve projelerinizi tutarl\u0131, ta\u015f\u0131nabilir ve \u00f6l\u00e7eklenebilir hale getirin. Bu kapsaml\u0131 rehber, konuya yeni ba\u015flayanlardan deneyimli veri m\u00fchendislerine kadar herkes i\u00e7in pratik bilgiler sunuyor.","og_url":"https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-13T09:01:30+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"27 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Veri M\u00fchendisli\u011finde Konteynerle\u015ftirme: Docker ve Docker Compose ile Pratik Bir Rehber","datePublished":"2025-10-13T09:01:30+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/"},"wordCount":4789,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Docker"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/","name":"Veri M\u00fchendisli\u011finde Konteynerle\u015ftirme: Docker ve Docker Compose ile Pratik Bir Rehber","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-13T09:01:30+00:00","description":"Veri m\u00fchendisli\u011fi projelerinizin kurulumu, y\u00f6netimi ve da\u011f\u0131t\u0131m\u0131 karma\u015f\u0131k m\u0131? Ba\u011f\u0131ml\u0131l\u0131k sorunlar\u0131, ortam tutars\u0131zl\u0131klar\u0131 ve \u00f6l\u00e7eklenebilirlik zorluklar\u0131yla m\u0131 bo\u011fu\u015fuyorsunuz? Docker ve Docker Compose ile bu zorluklar\u0131 nas\u0131l a\u015faca\u011f\u0131n\u0131z\u0131 ke\u015ffedin, veri altyap\u0131n\u0131z\u0131 standartla\u015ft\u0131r\u0131n ve projelerinizi tutarl\u0131, ta\u015f\u0131nabilir ve \u00f6l\u00e7eklenebilir hale getirin. Bu kapsaml\u0131 rehber, konuya yeni ba\u015flayanlardan deneyimli veri m\u00fchendislerine kadar herkes i\u00e7in pratik bilgiler sunuyor.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/veri-muhendisliginde-konteynerlestirme-docker-ve-docker-compose-ile-pratik-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Veri M\u00fchendisli\u011finde Konteynerle\u015ftirme: Docker ve Docker Compose ile Pratik Bir Rehber"}]},{"@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\/31739","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=31739"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31739\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31739"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31739"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31739"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}