{"id":34842,"date":"2025-11-22T18:31:01","date_gmt":"2025-11-22T15:31:01","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/"},"modified":"2025-11-22T18:31:01","modified_gmt":"2025-11-22T15:31:01","slug":"opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/","title":{"rendered":"OpenTofu ile Docker G\u00f6r\u00fcnt\u00fcs\u00fc Otomasyonu: Derle, Tara, Y\u00fckle"},"content":{"rendered":"<p><body><\/p>\n<p>Docker g\u00f6r\u00fcnt\u00fclerini manuel olarak olu\u015fturmak, taramak ve kay\u0131t defterine y\u00fcklemek zaman al\u0131c\u0131 ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. Bu makale, OpenTofu&#8217;nun g\u00fcc\u00fcn\u00fc kullanarak bu ad\u0131mlar\u0131 tamamen otomatize etmenin, b\u00f6ylece geli\u015ftirme verimlili\u011fini ve g\u00fcvenlik standartlar\u0131n\u0131 art\u0131rman\u0131n yollar\u0131n\u0131 ke\u015ffediyor.<\/p>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, konteynerizasyon ve \u00f6zellikle Docker, uygulamalar\u0131 paketleme ve da\u011f\u0131tma \u015feklimizi k\u00f6kten de\u011fi\u015ftirdi. Ancak, Docker g\u00f6r\u00fcnt\u00fcs\u00fc olu\u015fturma, g\u00fcvenlik a\u00e7\u0131klar\u0131 i\u00e7in tarama yapma ve bunlar\u0131 bir kay\u0131t defterine (registry) g\u00f6nderme s\u00fcre\u00e7leri, elle yap\u0131ld\u0131\u011f\u0131nda s\u0131k\u0131c\u0131, tekrarlayan ve hataya a\u00e7\u0131k olabilir. Geli\u015ftirme ekipleri genellikle farkl\u0131 ortamlarda (geli\u015ftirme, test, \u00fcretim) tutarl\u0131l\u0131k sa\u011flamakta zorlan\u0131r, bu da &#8220;benim makinemde \u00e7al\u0131\u015f\u0131yordu&#8221; sendromuna yol a\u00e7ar. Ayr\u0131ca, g\u00fcvenlik taramalar\u0131n\u0131n manuel olarak y\u00fcr\u00fct\u00fclmesi, yeni g\u00fcvenlik a\u00e7\u0131klar\u0131 ortaya \u00e7\u0131kt\u0131\u011f\u0131nda h\u0131zl\u0131 yan\u0131t verme yetene\u011fini k\u0131s\u0131tlar ve potansiyel riskleri art\u0131r\u0131r. Bu nedenlerle, Docker g\u00f6r\u00fcnt\u00fc s\u00fcre\u00e7lerini otomatikle\u015ftirmek, modern DevOps pratiklerinin vazge\u00e7ilmez bir par\u00e7as\u0131 haline gelmi\u015ftir.<\/p>\n<p>Otomasyon, sadece zaman kazand\u0131rmakla kalmaz, ayn\u0131 zamanda s\u00fcre\u00e7lerde tutarl\u0131l\u0131k ve g\u00fcvenilirlik sa\u011flar. Bir CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Teslimat) hatt\u0131n\u0131n kalbinde yer alan bu otomasyon, bir kod de\u011fi\u015fikli\u011fi yap\u0131ld\u0131\u011f\u0131nda yeni bir Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fcn otomatik olarak olu\u015fturulmas\u0131n\u0131, bilinen g\u00fcvenlik a\u00e7\u0131klar\u0131 i\u00e7in taranmas\u0131n\u0131 ve ard\u0131ndan Docker Hub gibi bir kay\u0131t defterine itilmesini m\u00fcmk\u00fcn k\u0131lar. Bu, geli\u015ftiricilerin kod yazmaya odaklanmas\u0131n\u0131 sa\u011flarken, operasyon ekiplerinin de g\u00fcvenli ve g\u00fcncel g\u00f6r\u00fcnt\u00fclere eri\u015fimini kolayla\u015ft\u0131r\u0131r. \u00d6zellikle mikroservis mimarilerinde, y\u00fczlerce hatta binlerce g\u00f6r\u00fcnt\u00fcy\u00fc y\u00f6netmek zorunda kalan ekipler i\u00e7in otomasyon, felaketlerin \u00f6n\u00fcne ge\u00e7mek ad\u0131na kritik bir rol oynar. B\u00f6ylece, hata oranlar\u0131 azal\u0131r, da\u011f\u0131t\u0131m s\u00fcreleri k\u0131sal\u0131r ve genel sistem g\u00fcvenli\u011fi \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131l\u0131r. Otomasyon, ayn\u0131 zamanda, bir projenin b\u00fcy\u00fcmesiyle artan karma\u015f\u0131kl\u0131kla ba\u015fa \u00e7\u0131kmak i\u00e7in \u00f6l\u00e7eklenebilir bir \u00e7\u00f6z\u00fcm sunar ve ekiplerin daha stratejik g\u00f6revlere odaklanmas\u0131na olanak tan\u0131r.<\/p>\n<p>Peki, bu otomasyonu nas\u0131l ger\u00e7ekle\u015ftirebiliriz? \u0130\u015fte burada OpenTofu sahneye \u00e7\u0131k\u0131yor. OpenTofu, altyap\u0131y\u0131 kod olarak (Infrastructure as Code &#8211; IaC) y\u00f6netmeye yarayan g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r ve Terraform&#8217;un a\u00e7\u0131k kaynakl\u0131 ve topluluk odakl\u0131 bir \u00e7atal\u0131d\u0131r. OpenTofu&#8217;yu kullanarak, sadece sunucular\u0131 veya a\u011flar\u0131 de\u011fil, ayn\u0131 zamanda Docker g\u00f6r\u00fcnt\u00fcs\u00fc olu\u015fturma, g\u00fcvenlik taramas\u0131 yapma ve kay\u0131t defterine y\u00fckleme gibi ad\u0131mlar\u0131 da kod ile tan\u0131mlayabiliriz. Bu yakla\u015f\u0131m, t\u00fcm altyap\u0131m\u0131z\u0131n ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerimizin versiyon kontroll\u00fc, tekrarlanabilir ve denetlenebilir olmas\u0131n\u0131 sa\u011flar. G\u00fcvenlik taramas\u0131 i\u00e7in ise Trivy gibi \u00f6zel ara\u00e7lardan faydalanaca\u011f\u0131z. Trivy, konteyner g\u00f6r\u00fcnt\u00fclerindeki, dosya sistemlerindeki ve Git depolar\u0131ndaki g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 h\u0131zl\u0131 ve kapsaml\u0131 bir \u015fekilde tespit edebilen a\u00e7\u0131k kaynakl\u0131, kullan\u0131m\u0131 kolay bir taray\u0131c\u0131d\u0131r. Son olarak, olu\u015fturulan ve taranan g\u00f6r\u00fcnt\u00fclerimizi Docker Hub gibi yayg\u0131n bir konteyner kay\u0131t defterine iterek, da\u011f\u0131t\u0131ma haz\u0131r hale getirece\u011fiz. Bu entegre yakla\u015f\u0131m, modern yaz\u0131l\u0131m geli\u015ftirme ya\u015fam d\u00f6ng\u00fcs\u00fcnde devrim niteli\u011finde bir kolayl\u0131k ve g\u00fcvenlik sa\u011flamaktad\u0131r.<\/p>\n<h2>OpenTofu, Docker ve Trivy: Temel Kavramlara H\u0131zl\u0131 Bir Bak\u0131\u015f<\/h2>\n<p>Bu otomasyon s\u00fcrecinin her bir bile\u015feni, kendine \u00f6zg\u00fc bir amaca hizmet eder ve birlikte \u00e7al\u0131\u015ft\u0131klar\u0131nda g\u00fc\u00e7l\u00fc bir sinerji olu\u015ftururlar. S\u00fcrece yeni ba\u015flayanlar veya hat\u0131rlamak isteyenler i\u00e7in bu temel ara\u00e7lar\u0131 ve kavramlar\u0131 k\u0131saca ele alal\u0131m.<\/p>\n<h3>Docker Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>Docker, uygulamalar\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 izole edilmi\u015f, ta\u015f\u0131nabilir birimler olan &#8220;konteynerler&#8221; i\u00e7inde paketlemeyi sa\u011flayan bir platformdur. Geleneksel sanal makinelerin aksine, Docker konteynerleri i\u015fletim sistemi \u00e7ekirde\u011fini payla\u015f\u0131r ve bu da onlar\u0131 daha hafif ve h\u0131zl\u0131 hale getirir. Bir Dockerfile ile uygulaman\u0131z\u0131n nas\u0131l derlenece\u011fini ve \u00e7al\u0131\u015faca\u011f\u0131n\u0131 tan\u0131mlars\u0131n\u0131z; bu dosya, bir Docker g\u00f6r\u00fcnt\u00fcs\u00fc olu\u015fturmak i\u00e7in kullan\u0131lan talimatlar\u0131 i\u00e7erir. Docker g\u00f6r\u00fcnt\u00fcs\u00fc, uygulaman\u0131z\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gereken her \u015feyi (kod, \u00e7al\u0131\u015fma zaman\u0131, sistem ara\u00e7lar\u0131, k\u00fct\u00fcphaneler ve ayarlar) i\u00e7eren salt okunur bir \u015fablondur. Bu g\u00f6r\u00fcnt\u00fcler, bir kez olu\u015fturulduktan sonra herhangi bir Docker ortam\u0131nda tutarl\u0131 bir \u015fekilde \u00e7al\u0131\u015fabilir, bu da geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerindeki &#8220;benim makinemde \u00e7al\u0131\u015f\u0131yor ama sunucuda \u00e7al\u0131\u015fm\u0131yor&#8221; sorununu b\u00fcy\u00fck \u00f6l\u00e7\u00fcde ortadan kald\u0131r\u0131r. Docker Hub ise, bu g\u00f6r\u00fcnt\u00fcleri depolamak ve payla\u015fmak i\u00e7in kullan\u0131lan pop\u00fcler bir bulut tabanl\u0131 kay\u0131t defteridir (container registry). \u00d6zel depolar (private repositories) sayesinde, yaln\u0131zca yetkili kullan\u0131c\u0131lar\u0131n eri\u015febilece\u011fi g\u00f6r\u00fcnt\u00fcleri de bar\u0131nd\u0131rabilirsiniz. G\u00f6r\u00fcnt\u00fclerin versiyonlanmas\u0131 ve etiketlenmesi de Docker Hub \u00fczerinde kolayca y\u00f6netilebilir, bu da da\u011f\u0131t\u0131mlar\u0131n kontrol\u00fcn\u00fc art\u0131r\u0131r.<\/p>\n<h3>OpenTofu: Altyap\u0131y\u0131 Kod Olarak Y\u00f6netmek<\/h3>\n<p>OpenTofu, HashiCorp Terraform&#8217;un a\u00e7\u0131k kaynakl\u0131 ve topluluk taraf\u0131ndan y\u00f6netilen bir \u00e7atal\u0131d\u0131r. Altyap\u0131y\u0131 Kod Olarak (Infrastructure as Code &#8211; IaC) prensibini benimseyerek, sunucular, veritabanlar\u0131, a\u011f yap\u0131land\u0131rmalar\u0131 ve di\u011fer bulut kaynaklar\u0131 gibi altyap\u0131 bile\u015fenlerini kod ile tan\u0131mlaman\u0131za, sa\u011flaman\u0131za ve y\u00f6netmenize olanak tan\u0131r. OpenTofu, deklaratif bir dil kullan\u0131r; yani, &#8220;ne&#8221; istedi\u011finizi tan\u0131mlars\u0131n\u0131z, &#8220;nas\u0131l&#8221; yap\u0131laca\u011f\u0131n\u0131 OpenTofu kendisi belirler. Bu, altyap\u0131n\u0131z\u0131n s\u00fcrekli olarak istenen durumda kalmas\u0131n\u0131 sa\u011flar. Neden OpenTofu? Terraform&#8217;un son lisans de\u011fi\u015fiklikleri sonras\u0131 a\u00e7\u0131k kaynak ruhunu s\u00fcrd\u00fcrmek isteyen topluluk taraf\u0131ndan olu\u015fturulmu\u015f bir alternatif olarak \u00f6ne \u00e7\u0131kar. Mevcut Terraform projeleriyle y\u00fcksek uyumlulu\u011fu ve geli\u015ftirici dostu yap\u0131s\u0131yla, altyap\u0131 otomasyonunda g\u00fcvenilir bir ara\u00e7t\u0131r. OpenTofu, farkl\u0131 bulut sa\u011flay\u0131c\u0131lar\u0131 (AWS, Azure, GCP) ve hizmetler (Kubernetes, Docker) i\u00e7in sa\u011flay\u0131c\u0131lar (providers) arac\u0131l\u0131\u011f\u0131yla geni\u015f bir ekosisteme sahiptir. Bu sa\u011flay\u0131c\u0131lar, OpenTofu&#8217;nun ilgili API&#8217;lerle etkile\u015fime girmesini ve kaynaklar\u0131 y\u00f6netmesini sa\u011flar. Bu makaledeki senaryomuzda, OpenTofu&#8217;nun yerel komutlar\u0131 \u00e7al\u0131\u015ft\u0131rma yetene\u011fini kullanarak Docker ile etkile\u015fim kuraca\u011f\u0131z.<\/p>\n<h3>Trivy: Konteyner G\u00fcvenlik Taramas\u0131n\u0131n \u00d6nemi<\/h3>\n<p>Konteynerler, uygulamalar\u0131 izole etse de, g\u00fcvenlik a\u00e7\u0131klar\u0131 hala \u00f6nemli bir endi\u015fe kayna\u011f\u0131d\u0131r. Bir Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fcn i\u00e7inde yer alan i\u015fletim sistemi paketleri, k\u00fct\u00fcphaneler veya hatta uygulaman\u0131n kendisi, bilinen g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 (CVE&#8217;ler) i\u00e7erebilir. Trivy (Trivial Vulnerability Scanner), bu t\u00fcr g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 tespit etmek i\u00e7in tasarlanm\u0131\u015f, kullan\u0131m\u0131 kolay ve h\u0131zl\u0131 bir taray\u0131c\u0131d\u0131r. Konteyner g\u00f6r\u00fcnt\u00fclerini, dosya sistemlerini, Git depolar\u0131n\u0131 ve daha fazlas\u0131n\u0131 tarayabilir. Trivy, bilinen g\u00fcvenlik a\u00e7\u0131klar\u0131 veritabanlar\u0131n\u0131 kullanarak, g\u00f6r\u00fcnt\u00fclerinizde potansiyel zay\u0131fl\u0131klar\u0131 h\u0131zla belirler. CI\/CD hatt\u0131n\u0131za entegre edildi\u011finde, her yeni g\u00f6r\u00fcnt\u00fc olu\u015fturuldu\u011funda otomatik olarak g\u00fcvenlik taramas\u0131 yap\u0131lmas\u0131, g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131n erken a\u015famada tespit edilmesini ve giderilmesini sa\u011flar. Bu, \u00fcretim ortam\u0131na ula\u015fmadan \u00f6nce potansiyel sald\u0131r\u0131 vekt\u00f6rlerini azalt\u0131r. Trivy&#8217;nin sonu\u00e7lar\u0131 genellikle okunabilir formatlarda (tablo, JSON vb.) sunulur ve kritik veya y\u00fcksek \u00f6nem derecesine sahip g\u00fcvenlik a\u00e7\u0131klar\u0131 i\u00e7in derleme s\u00fcrecini durdurma gibi politikalar uygulayabilirsiniz. Bu proaktif g\u00fcvenlik yakla\u015f\u0131m\u0131, modern DevOps k\u00fclt\u00fcr\u00fc i\u00e7in temel bir gerekliliktir.<\/p>\n<p>Bu \u00fc\u00e7 temel bile\u015fen \u2013 Docker&#8217;\u0131n konteynerizasyon g\u00fcc\u00fc, OpenTofu&#8217;nun altyap\u0131 otomasyon yetenekleri ve Trivy&#8217;nin g\u00fcvenlik tarama hassasiyeti \u2013 bir araya geldi\u011finde, Docker g\u00f6r\u00fcnt\u00fc ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc tamamen otomatikle\u015ftiren, g\u00fcvenli ve verimli bir s\u00fcre\u00e7 olu\u015fturabiliriz. \u015eimdi, bu kavramlar\u0131 pratik bir senaryo \u00fczerinde nas\u0131l uygulayaca\u011f\u0131m\u0131za ge\u00e7elim.<\/p>\n<h2>OpenTofu ile Docker G\u00f6r\u00fcnt\u00fcs\u00fc Otomasyonuna Nas\u0131l Ba\u015flan\u0131r?<\/h2>\n<p>\u015eimdi pratik k\u0131sma ge\u00e7elim ve OpenTofu kullanarak Docker g\u00f6r\u00fcnt\u00fcs\u00fc olu\u015fturma, tarama ve Docker Hub&#8217;a y\u00fckleme ad\u0131mlar\u0131n\u0131 nas\u0131l otomatikle\u015ftirece\u011fimizi ad\u0131m ad\u0131m inceleyelim. Bu b\u00f6l\u00fcmde, basit bir web uygulamas\u0131n\u0131n Dockerfile&#8217;\u0131ndan ba\u015flayarak, OpenTofu kodunu yazacak ve gerekli ad\u0131mlar\u0131 \u00e7al\u0131\u015ft\u0131raca\u011f\u0131z.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: Bu otomasyonu yapmadan \u00f6nce makinenizde Docker ve OpenTofu&#8217;nun kurulu oldu\u011fundan emin olun. Ayr\u0131ca, Docker Hub hesab\u0131n\u0131z\u0131n ve kimlik bilgilerinizin haz\u0131r olmas\u0131 gerekmektedir.\n    <\/div>\n<h3>1. Dockerfile Haz\u0131rl\u0131\u011f\u0131: Uygulamam\u0131z\u0131 Konteynerize Edelim<\/h3>\n<p>\u0130lk ad\u0131m, otomatikle\u015ftirece\u011fimiz uygulaman\u0131n Dockerfile&#8217;\u0131n\u0131 haz\u0131rlamakt\u0131r. Basit bir Node.js web uygulamas\u0131 \u00f6rne\u011fi kullanal\u0131m. Bu Dockerfile, uygulaman\u0131n nas\u0131l derlenece\u011fini ve \u00e7al\u0131\u015ft\u0131r\u0131laca\u011f\u0131n\u0131 tan\u0131mlar.<\/p>\n<pre><code>\n# Dockerfile\n# Node.js alpine tabanl\u0131 bir g\u00f6r\u00fcnt\u00fcden ba\u015fla\nFROM node:18-alpine\n\n# \u00c7al\u0131\u015fma dizini olu\u015ftur\nWORKDIR \/app\n\n# package.json ve package-lock.json'\u0131 kopyala\nCOPY package*.json .\/\n\n# Ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckle\nRUN npm install\n\n# Uygulama kaynak kodunu kopyala\nCOPY . .\n\n# Uygulamay\u0131 3000 portunda \u00e7al\u0131\u015ft\u0131r\nEXPOSE 3000\n\n# Uygulamay\u0131 ba\u015flat\nCMD [\"node\", \"app.js\"]\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu Dockerfile ile birlikte, \u00f6rnek bir <code>app.js<\/code> ve <code>package.json<\/code> dosyas\u0131na ihtiyac\u0131m\u0131z olacak:<\/p>\n<pre><code>\n\/\/ app.js\nconst http = require('http');\n\nconst hostname = '0.0.0.0';\nconst port = 3000;\n\nconst server = http.createServer((req, res) => {\n  res.statusCode = 200;\n  res.setHeader('Content-Type', 'text\/plain');\n  res.end('Merhaba Dunya! Bu, OpenTofu ile otomatiklestirilmis bir Docker uygulamasidir!\\n');\n});\n\nserver.listen(port, hostname, () => {\n  console.log(<code>Server ${hostname}:${port} adresinde calisiyor<\/code>);\n});\n    <\/pre>\n<p><\/code><\/p>\n<pre><code>\n\/\/ package.json\n{\n  \"name\": \"my-node-app\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A simple Node.js app\",\n  \"main\": \"app.js\",\n  \"scripts\": {\n    \"start\": \"node app.js\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\"\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu dosyalar\u0131 projenizin k\u00f6k dizinine yerle\u015ftirin. \u015eimdi, OpenTofu'ya ge\u00e7ebiliriz.<\/p>\n<h3>2. OpenTofu Ortam\u0131n\u0131n ve De\u011fi\u015fkenlerin Yap\u0131land\u0131r\u0131lmas\u0131<\/h3>\n<p>OpenTofu ile \u00e7al\u0131\u015fmak i\u00e7in ana konfig\u00fcrasyon dosyam\u0131z\u0131 (genellikle <code>main.tf<\/code>) olu\u015ftural\u0131m. Ayr\u0131ca, Docker Hub kullan\u0131c\u0131 ad\u0131m\u0131z ve g\u00f6r\u00fcnt\u00fc ad\u0131m\u0131z gibi de\u011fi\u015fkenleri tan\u0131mlayaca\u011f\u0131z.<\/p>\n<p>\u00d6ncelikle, Docker Hub kimlik do\u011frulama bilgilerimizi OpenTofu'ya g\u00fcvenli bir \u015fekilde sa\u011flamam\u0131z gerekiyor. Bunu genellikle ortam de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla yapar\u0131z:<\/p>\n<pre><code>\nexport DOCKER_USERNAME=\"sizin_docker_kullanici_adiniz\"\nexport DOCKER_PASSWORD=\"sizin_docker_sifreniz\"\n    <\/pre>\n<p><\/code><\/p>\n<p>Ya da, daha g\u00fcvenli bir y\u00f6ntem olarak, OpenTofu'nun kendi de\u011fi\u015fken mekanizmas\u0131n\u0131 kullanabiliriz. Ancak <code>local-exec<\/code> komutu ile Docker CLI'yi \u00e7al\u0131\u015ft\u0131raca\u011f\u0131m\u0131z i\u00e7in, Docker CLI'n\u0131n kimlik do\u011frulamas\u0131n\u0131 yapmas\u0131 yeterli olacakt\u0131r. Genellikle <code>docker login<\/code> komutunu bir kez \u00e7al\u0131\u015ft\u0131rmak, sonraki <code>docker push<\/code> i\u015flemlerini kolayla\u015ft\u0131r\u0131r. <code>docker login<\/code> i\u015flemini OpenTofu i\u00e7erisinde otomatikle\u015ftirmek i\u00e7in a\u015fa\u011f\u0131daki gibi bir blok kullanabiliriz, ancak bu, \u015fifrenizi direkt kod i\u00e7ine yazma riskini ta\u015f\u0131r. Daha iyisi, OpenTofu'yu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131z CI\/CD ortam\u0131nda veya yerel makinenizde manuel olarak <code>docker login<\/code> yapm\u0131\u015f olman\u0131zd\u0131r.<\/p>\n<p>\u015eimdi, <code>variables.tf<\/code> dosyam\u0131z\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code>\n\/\/ variables.tf\nvariable \"docker_username\" {\n  description = \"Docker Hub kullan\u0131c\u0131 ad\u0131n\u0131z\"\n  type        = string\n  # sensitive   = true # Hassas bilgi oldu\u011fu i\u00e7in bu yorumu kald\u0131rabilirsiniz\n}\n\nvariable \"image_name\" {\n  description = \"Olu\u015fturulacak Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fcn ad\u0131\"\n  type        = string\n  default     = \"my-node-app\"\n}\n\nvariable \"image_tag\" {\n  description = \"Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fcn etiketi (tag)\"\n  type        = string\n  default     = \"latest\"\n}\n\nvariable \"trivy_severity_threshold\" {\n  description = \"Trivy taramas\u0131nda kabul edilebilir en d\u00fc\u015f\u00fck g\u00fcvenlik a\u00e7\u0131\u011f\u0131 seviyesi\"\n  type        = string\n  default     = \"HIGH,CRITICAL\" # Y\u00dcKSEK ve KR\u0130T\u0130K seviyeleri uyar\u0131nca tarama\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu de\u011fi\u015fkenleri <code>terraform.tfvars<\/code> (veya <code>tofu.tfvars<\/code>) dosyas\u0131nda tan\u0131mlayabilirsiniz:<\/p>\n<pre><code>\n\/\/ tofu.tfvars\ndocker_username = \"sizin_docker_kullanici_adiniz\"\nimage_name      = \"my-node-app\"\nimage_tag       = \"v1.0.0\" # \u0130lk versiyon i\u00e7in bir tag\n    <\/pre>\n<p><\/code><\/p>\n<h3>3. OpenTofu Mod\u00fclleriyle Docker G\u00f6r\u00fcnt\u00fcs\u00fc Olu\u015fturma<\/h3>\n<p>OpenTofu'nun kendi i\u00e7inde do\u011frudan bir \"Docker Image Build\" kayna\u011f\u0131 yoktur (genellikle bu t\u00fcr i\u015flemler CI\/CD ara\u00e7lar\u0131 taraf\u0131ndan yap\u0131l\u0131r). Ancak, OpenTofu'nun <code>null_resource<\/code> kayna\u011f\u0131n\u0131 ve <code>local-exec<\/code> provizyonerini kullanarak yerel komutlar\u0131 \u00e7al\u0131\u015ft\u0131rma yetene\u011fi sayesinde Docker CLI komutlar\u0131n\u0131 tetikleyebiliriz. Bu, OpenTofu'nun orkestrasyon g\u00fcc\u00fcn\u00fc g\u00f6sterir.<\/p>\n<p><code>main.tf<\/code> dosyam\u0131z\u0131 olu\u015ftural\u0131m ve Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc olu\u015fturan komutu ekleyelim:<\/p>\n<pre><code>\n\/\/ main.tf\nterraform {\n  required_providers {\n    null = {\n      source = \"hashicorp\/null\"\n      version = \"~> 3.0\"\n    }\n  }\n}\n\nresource \"null_resource\" \"build_docker_image\" {\n  provisioner \"local-exec\" {\n    command = \"docker build -t ${var.docker_username}\/${var.image_name}:${var.image_tag} .\"\n    working_dir = path.module # Dockerfile'\u0131n bulundu\u011fu dizin\n    interpreter = [\"bash\", \"-c\"]\n  }\n\n  triggers = {\n    # Dockerfile veya uygulama kodundaki de\u011fi\u015fiklikleri takip et\n    # Bu, dosya i\u00e7eri\u011finin MD5 \u00f6zetini kullanarak de\u011fi\u015fiklikleri alg\u0131lar\n    dockerfile_hash = filemd5(\"${path.module}\/Dockerfile\")\n    app_code_hash   = filemd5(\"${path.module}\/app.js\")\n    package_json_hash = filemd5(\"${path.module}\/package.json\")\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Burada, <code>null_resource<\/code>, OpenTofu'nun herhangi bir uzak kaynak olu\u015fturmad\u0131\u011f\u0131, ancak ya\u015fam d\u00f6ng\u00fcs\u00fc provizyonerlerini tetiklemek i\u00e7in kullan\u0131\u015fl\u0131 olan \u00f6zel bir kaynakt\u0131r. <code>local-exec<\/code> provizyoneri, OpenTofu'nun \u00e7al\u0131\u015ft\u0131\u011f\u0131 makinede komutlar\u0131 y\u00fcr\u00fct\u00fcr. <code>triggers<\/code> blo\u011fu, belirtilen dosyalar\u0131n i\u00e7erikleri de\u011fi\u015fti\u011finde bu kayna\u011f\u0131n yeniden \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 (ve dolay\u0131s\u0131yla Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fcn yeniden olu\u015fturulmas\u0131n\u0131) sa\u011flar.<\/p>\n<h3>4. Trivy ile G\u00fcvenlik Taramas\u0131 Nas\u0131l Entegre Edilir?<\/h3>\n<p>G\u00f6r\u00fcnt\u00fc olu\u015fturulduktan sonra, g\u00fcvenlik a\u00e7\u0131klar\u0131 i\u00e7in taramam\u0131z gerekiyor. Bunu da <code>null_resource<\/code> ve <code>local-exec<\/code> kullanarak yapabiliriz. Trivy'nin kurulu oldu\u011funu varsay\u0131yoruz. E\u011fer kurulu de\u011filse, OpenTofu \u00e7al\u0131\u015ft\u0131rmadan \u00f6nce makinenize kurman\u0131z gerekmektedir.<\/p>\n<pre><code>\n\/\/ main.tf devam\u0131\nresource \"null_resource\" \"scan_docker_image_with_trivy\" {\n  depends_on = [null_resource.build_docker_image] # G\u00f6r\u00fcnt\u00fc olu\u015fturulduktan sonra tara\n\n  provisioner \"local-exec\" {\n    command = \"trivy image --severity ${var.trivy_severity_threshold} --exit-code 1 ${var.docker_username}\/${var.image_name}:${var.image_tag}\"\n    interpreter = [\"bash\", \"-c\"]\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu blokta:<\/p>\n<ul>\n<li><code>depends_on<\/code>: OpenTofu'ya bu kayna\u011f\u0131n, <code>build_docker_image<\/code> kayna\u011f\u0131 ba\u015far\u0131yla tamamland\u0131ktan sonra \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 gerekti\u011fini bildiririz.<\/li>\n<li><code>trivy image<\/code>: Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc taramak i\u00e7in Trivy komutu.<\/li>\n<li><code>--severity ${var.trivy_severity_threshold}<\/code>: Sadece belirtilen ciddiyet seviyesindeki (\u00f6rn. HIGH, CRITICAL) g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 raporla.<\/li>\n<li><code>--exit-code 1<\/code>: E\u011fer belirtilen ciddiyet seviyesinde g\u00fcvenlik a\u00e7\u0131klar\u0131 bulunursa, Trivy'nin 1 hata kodu ile \u00e7\u0131kmas\u0131n\u0131 sa\u011flar. Bu, OpenTofu'nun tarama ba\u015far\u0131s\u0131z oldu\u011funda i\u015flemi durdurmas\u0131 anlam\u0131na gelir ve otomasyon hatt\u0131n\u0131zda bir g\u00fcvenlik kap\u0131s\u0131 g\u00f6revi g\u00f6r\u00fcr.<\/li>\n<\/ul>\n<h3>5. Docker Hub'a Otomatik Y\u00fckleme Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Son olarak, taranm\u0131\u015f ve g\u00fcvenli oldu\u011fu kabul edilen g\u00f6r\u00fcnt\u00fcm\u00fcz\u00fc Docker Hub'a y\u00fckleyece\u011fiz. Yine <code>null_resource<\/code> ve <code>local-exec<\/code> kullanaca\u011f\u0131z.<\/p>\n<pre><code>\n\/\/ main.tf devam\u0131\nresource \"null_resource\" \"push_docker_image_to_hub\" {\n  depends_on = [null_resource.scan_docker_image_with_trivy] # Tarama ba\u015far\u0131l\u0131 olursa y\u00fckle\n\n  provisioner \"local-exec\" {\n    # Docker login zaten yap\u0131lm\u0131\u015f varsay\u0131l\u0131r veya CI\/CD ortam\u0131nda yap\u0131l\u0131r.\n    # Aksi takdirde, a\u015fa\u011f\u0131daki gibi bir login komutu eklenebilir, ancak \u015fifre g\u00fcvenli\u011fine dikkat edin.\n    # command = \"echo '${var.docker_password}' | docker login --username ${var.docker_username} --password-stdin && docker push ${var.docker_username}\/${var.image_name}:${var.image_tag}\"\n    command = \"docker push ${var.docker_username}\/${var.image_name}:${var.image_tag}\"\n    interpreter = [\"bash\", \"-c\"]\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu ad\u0131m, Trivy taramas\u0131n\u0131n ba\u015far\u0131yla tamamlanmas\u0131n\u0131n ard\u0131ndan g\u00f6r\u00fcnt\u00fcy\u00fc Docker Hub'a iter. Yukar\u0131daki yorumlu sat\u0131r, OpenTofu \u00fczerinden do\u011frudan <code>docker login<\/code> yapma se\u00e7ene\u011fini g\u00f6sterir, ancak \u00fcretim ortamlar\u0131nda hassas bilgilerin do\u011frudan kod i\u00e7inde yer almamas\u0131 i\u00e7in genellikle CI\/CD sistemlerinin kimlik do\u011frulama mekanizmalar\u0131 veya bulut sa\u011flay\u0131c\u0131lar\u0131n\u0131n s\u0131r y\u00f6netim servisleri tercih edilir.<\/p>\n<h3>OpenTofu Komutlar\u0131n\u0131 \u00c7al\u0131\u015ft\u0131rma<\/h3>\n<p>T\u00fcm bu dosyalar\u0131 olu\u015fturduktan sonra, OpenTofu projenizi ba\u015flatmak ve \u00e7al\u0131\u015ft\u0131rmak i\u00e7in \u015fu komutlar\u0131 kullan\u0131n:<\/p>\n<pre><code>\ntofu init        # OpenTofu arka u\u00e7lar\u0131n\u0131 ve sa\u011flay\u0131c\u0131lar\u0131n\u0131 ba\u015flat\u0131r\ntofu plan        # Yap\u0131lacak de\u011fi\u015fiklikleri g\u00f6sterir (derleme, tarama, y\u00fckleme ad\u0131mlar\u0131)\ntofu apply -auto-approve # Plan\u0131 uygular ve otomasyonu tetikler\n    <\/pre>\n<p><\/code><\/p>\n<p><code>tofu apply<\/code> komutunu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, s\u0131ras\u0131yla Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fcn olu\u015fturuldu\u011funu, Trivy taraf\u0131ndan tarand\u0131\u011f\u0131n\u0131 ve ard\u0131ndan Docker Hub'a y\u00fcklendi\u011fini g\u00f6receksiniz. E\u011fer Trivy herhangi bir kritik g\u00fcvenlik a\u00e7\u0131\u011f\u0131 tespit ederse, <code>--exit-code 1<\/code> sayesinde OpenTofu s\u00fcreci duracak ve g\u00f6r\u00fcnt\u00fc Docker Hub'a y\u00fcklenmeyecektir. Bu, g\u00fcvenlik odakl\u0131 bir CI\/CD hatt\u0131 i\u00e7in temel bir kap\u0131d\u0131r.<\/p>\n<h2>Vaka Analizi: Mikroservisler ve S\u00fcrekli G\u00fcvenlik Entegrasyonu<\/h2>\n<p>Bir e-ticaret \u015firketinin geli\u015ftirme ekibi, \u00e7e\u015fitli mikroservislerden olu\u015fan karma\u015f\u0131k bir mimariye sahiptir. Her mikroservis kendi Docker g\u00f6r\u00fcnt\u00fcs\u00fcnde \u00e7al\u0131\u015f\u0131r ve s\u00fcrekli olarak g\u00fcncellemeler al\u0131r. Eskiden, her yeni kod de\u011fi\u015fikli\u011fi sonras\u0131 \u015fu ad\u0131mlar manuel olarak yap\u0131l\u0131yordu:<\/p>\n<ol>\n<li>Geli\u015ftirici, kodunu tamamlar.<\/li>\n<li>Yerel olarak <code>docker build<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131r.<\/li>\n<li>Daha sonra <code>trivy image<\/code> komutu ile g\u00fcvenlik taramas\u0131 yapar ve sonu\u00e7lar\u0131 manuel olarak inceler.<\/li>\n<li>E\u011fer g\u00fcvenlik a\u00e7\u0131\u011f\u0131 yoksa, <code>docker push<\/code> ile g\u00f6r\u00fcnt\u00fcy\u00fc Docker Hub'a y\u00fckler.<\/li>\n<li>Bu s\u00fcre\u00e7, \u00f6zellikle birden fazla mikroservis \u00fczerinde \u00e7al\u0131\u015fan ekipler i\u00e7in zaman al\u0131c\u0131 ve hataya a\u00e7\u0131kt\u0131. Bir g\u00fcvenlik a\u00e7\u0131\u011f\u0131 g\u00f6zden ka\u00e7abilir veya bir g\u00f6r\u00fcnt\u00fc yanl\u0131\u015f etiketle y\u00fcklenebilirdi.<\/li>\n<\/ol>\n<p>Ekip, bu s\u00fcreci OpenTofu ve CI\/CD (GitHub Actions kullanarak) ile otomatize etmeye karar verdi. OpenTofu kodunu kullanarak her mikroservis deposunda bir <code>.tofu<\/code> dizini olu\u015fturdular. Bu dizin, yukar\u0131da bahsetti\u011fimiz <code>Dockerfile<\/code>, <code>main.tf<\/code>, <code>variables.tf<\/code> ve <code>tofu.tfvars<\/code> dosyalar\u0131n\u0131 i\u00e7eriyordu. GitHub Actions i\u015f ak\u0131\u015f\u0131 (workflow) \u015fu ad\u0131mlar\u0131 i\u00e7erecek \u015fekilde yap\u0131land\u0131r\u0131ld\u0131:<\/p>\n<ul>\n<li>Bir geli\u015ftirici <code>main<\/code> branch'ine kod g\u00f6nderdi\u011finde (push), GitHub Action tetiklenir.<\/li>\n<li>GitHub Action ortam\u0131nda Docker ve OpenTofu kurulur.<\/li>\n<li>Docker Hub kimlik bilgileri, GitHub Secrets \u00fczerinden g\u00fcvenli bir \u015fekilde sa\u011flan\u0131r ve <code>docker login<\/code> komutu \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r.<\/li>\n<li><code>tofu init<\/code>, <code>tofu plan<\/code> ve <code>tofu apply -auto-approve<\/code> komutlar\u0131 s\u0131ras\u0131yla \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r.<\/li>\n<\/ul>\n<p>Bu yeni s\u00fcre\u00e7le birlikte, ekip \u015fu kazan\u0131mlar\u0131 elde etti:<\/p>\n<table border=\"1\">\n<thead>\n<tr>\n<th>\u00d6zellik<\/th>\n<th>\u00d6nceki Durum (Manuel)<\/th>\n<th>Yeni Durum (OpenTofu & CI\/CD)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>G\u00f6r\u00fcnt\u00fc Olu\u015fturma S\u00fcresi<\/strong><\/td>\n<td>Ortalama 15-20 dakika (her mikroservis i\u00e7in)<\/td>\n<td>Ortalama 5-7 dakika (otomatik, paralel i\u015fleme)<\/td>\n<\/tr>\n<tr>\n<td><strong>G\u00fcvenlik A\u00e7\u0131\u011f\u0131 Tespiti<\/strong><\/td>\n<td>G\u00f6zden ka\u00e7ma riski y\u00fcksek, manuel kontrol<\/td>\n<td>%100 otomatik tarama, kritik a\u00e7\u0131klarda otomatik durdurma<\/td>\n<\/tr>\n<tr>\n<td><strong>Hata Oran\u0131<\/strong><\/td>\n<td>Y\u00fcksek (yanl\u0131\u015f etiketleme, eksik tarama)<\/td>\n<td>D\u00fc\u015f\u00fck (kod tabanl\u0131, tekrarlanabilir)<\/td>\n<\/tr>\n<tr>\n<td><strong>Geli\u015ftirici Verimlili\u011fi<\/strong><\/td>\n<td>Y\u00fcksek oranda operasyonel y\u00fck<\/td>\n<td>Operasyonel y\u00fck s\u0131f\u0131ra yak\u0131n, kodlamaya odaklanma<\/td>\n<\/tr>\n<tr>\n<td><strong>Uyumluluk ve Denetlenebilirlik<\/strong><\/td>\n<td>D\u00fc\u015f\u00fck, s\u00fcre\u00e7 takibi zor<\/td>\n<td>Y\u00fcksek, t\u00fcm s\u00fcre\u00e7 kodda tan\u0131ml\u0131 ve versiyon kontroll\u00fc<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Bu vaka analizi, OpenTofu'nun sadece altyap\u0131 sa\u011flamada de\u011fil, ayn\u0131 zamanda modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinin temel ta\u015flar\u0131ndan biri olan Docker g\u00f6r\u00fcnt\u00fc y\u00f6netimi ve g\u00fcvenli\u011fi otomasyonunda da ne kadar etkili bir ara\u00e7 olabilece\u011fini a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Geli\u015ftiriciler art\u0131k sadece kod yazmaya odaklan\u0131rken, g\u00fcvenli ve g\u00fcncel Docker g\u00f6r\u00fcnt\u00fcleri otomatik olarak haz\u0131r hale gelmektedir.<\/p>\n<h2>Otomasyonu Bir Ad\u0131m \u00d6teye Ta\u015f\u0131mak: Geli\u015fmi\u015f Stratejiler<\/h2>\n<p>Temel otomasyonu kurduktan sonra, bu yap\u0131y\u0131 daha da sa\u011flam ve esnek hale getirmek i\u00e7in ileri d\u00fczey stratejileri d\u00fc\u015f\u00fcnebiliriz. Bu ipu\u00e7lar\u0131, daha b\u00fcy\u00fck projelerde veya \u00f6zel g\u00fcvenlik gereksinimleri olan ortamlarda faydal\u0131 olacakt\u0131r.<\/p>\n<h3>1. CI\/CD Entegrasyonu ve Daha Sa\u011flam Boru Hatlar\u0131<\/h3>\n<p>Yukar\u0131daki \u00f6rnekte OpenTofu'yu yerel makinenizde \u00e7al\u0131\u015ft\u0131rd\u0131k. Ancak ger\u00e7ek d\u00fcnya senaryolar\u0131nda, bu otomasyonu bir CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Teslimat) sistemiyle birle\u015ftirmek en iyi yakla\u015f\u0131md\u0131r. GitHub Actions, GitLab CI\/CD, Jenkins veya CircleCI gibi ara\u00e7lar, kod depolar\u0131n\u0131zdaki de\u011fi\u015fiklikleri otomatik olarak alg\u0131layabilir ve OpenTofu komutlar\u0131n\u0131 tetikleyebilir. Bu, her kod g\u00f6nderiminde (push) yeni bir Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fcn otomatik olarak derlenmesini, taranmas\u0131n\u0131 ve y\u00fcklenmesini sa\u011flar. \u00d6rne\u011fin, bir <code>.github\/workflows\/docker-build.yml<\/code> dosyas\u0131 GitHub Actions i\u00e7in a\u015fa\u011f\u0131daki gibi g\u00f6r\u00fcnebilir:<\/p>\n<pre><code>\n# .github\/workflows\/docker-build.yml\nname: Docker Image CI\/CD with OpenTofu and Trivy\n\non:\n  push:\n    branches:\n      - main\n\njobs:\n  build_scan_push:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Kodu Cek\n        uses: actions\/checkout@v3\n\n      - name: Docker Kurulumu\n        uses: docker\/setup-docker@v3\n\n      - name: Docker Login\n        uses: docker\/login-action@v3\n        with:\n          username: ${{ secrets.DOCKER_USERNAME }}\n          password: ${{ secrets.DOCKER_PASSWORD }}\n\n      - name: OpenTofu Kurulumu\n        uses: hashicorp\/setup-terraform@v2 # OpenTofu i\u00e7in de kullan\u0131labilir, veya ayr\u0131 bir action.\n        with:\n          terraform_version: 1.6.0 # OpenTofu versiyonunuzu belirtin\n\n      - name: OpenTofu Init\n        run: tofu init\n\n      - name: OpenTofu Apply (Docker Otomasyonu)\n        run: tofu apply -auto-approve\n        env:\n          TF_VAR_docker_username: ${{ secrets.DOCKER_USERNAME }} # OpenTofu de\u011fi\u015fkenini set et\n          # Di\u011fer de\u011fi\u015fkenler de burada tan\u0131mlanabilir\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131land\u0131rma, kimlik bilgilerini GitHub Secrets gibi g\u00fcvenli bir \u015fekilde saklaman\u0131z\u0131 ve OpenTofu'nun t\u00fcm s\u00fcreci otomasyon hatt\u0131 i\u00e7inde y\u00f6netmesini sa\u011flar. B\u00f6ylece, her de\u011fi\u015fiklik an\u0131nda yeni ve g\u00fcvenli bir g\u00f6r\u00fcnt\u00fcye d\u00f6n\u00fc\u015f\u00fcr.<\/p>\n<h3>2. G\u00f6r\u00fcnt\u00fc Etiketleme Stratejileri<\/h3>\n<p>Sadece <code>latest<\/code> etiketi kullanmak \u00e7o\u011fu zaman yeterli de\u011fildir. \u00dcretim ortamlar\u0131nda kararl\u0131l\u0131k ve geri alma (rollback) yetene\u011fi i\u00e7in daha sofistike etiketleme stratejileri izlenmelidir. OpenTofu i\u00e7inde, <code>image_tag<\/code> de\u011fi\u015fkenini dinamik hale getirebiliriz:<\/p>\n<ul>\n<li><strong>Versiyon Etiketleri (\u00f6rn. <code>v1.0.0<\/code>, <code>v1.0.1<\/code>)<\/strong>: Semantik versiyonlama kullanarak her yeni s\u00fcr\u00fcm i\u00e7in benzersiz bir etiket olu\u015fturun.<\/li>\n<li><strong>Git Commit Hash (\u00f6rn. <code>a1b2c3d<\/code>)<\/strong>: Her commit i\u00e7in benzersiz bir etiket kullanmak, hangi kodun hangi g\u00f6r\u00fcnt\u00fcye kar\u015f\u0131l\u0131k geldi\u011fini kesin olarak belirlemenizi sa\u011flar. CI\/CD ortamlar\u0131nda <code>${{ github.sha }}<\/code> gibi ortam de\u011fi\u015fkenleri kullan\u0131labilir.<\/li>\n<li><strong>Tarih\/Saat Etiketleri (\u00f6rn. <code>20231027-1430<\/code>)<\/strong>: Da\u011f\u0131t\u0131m zaman\u0131na g\u00f6re etiketleme, \u00f6zellikle h\u0131zl\u0131 iterasyon yap\u0131lan ortamlarda faydal\u0131 olabilir.<\/li>\n<\/ul>\n<p>OpenTofu'da, <code>local-exec<\/code> komutu i\u00e7inde Git komutlar\u0131n\u0131 veya CI\/CD ortam de\u011fi\u015fkenlerini kullanarak bu etiketleri dinamik olarak olu\u015fturabilirsiniz. \u00d6rne\u011fin:<\/p>\n<pre><code>\n# Git commit hash'i etiket olarak kullanma\ncommand = \"docker build -t ${var.docker_username}\/${var.image_name}:$(git rev-parse --short HEAD) .\"\n    <\/pre>\n<p><\/code><\/p>\n<h3>3. Farkl\u0131 Konteyner Kay\u0131t Defterlerine Y\u00fckleme<\/h3>\n<p>Docker Hub genel kullan\u0131m i\u00e7in harika olsa da, kurumsal uygulamalar genellikle AWS ECR, Azure Container Registry (ACR) veya Google Container Registry (GCR) gibi bulut sa\u011flay\u0131c\u0131s\u0131na \u00f6zg\u00fc kay\u0131t defterlerini tercih eder. Bu kay\u0131t defterleri, bulut altyap\u0131n\u0131zla daha iyi entegrasyon, daha s\u0131k\u0131 g\u00fcvenlik kontrolleri ve bazen maliyet avantajlar\u0131 sunar. OpenTofu, bu bulut sa\u011flay\u0131c\u0131lar\u0131 i\u00e7in \u00f6zel sa\u011flay\u0131c\u0131lar arac\u0131l\u0131\u011f\u0131yla bu kay\u0131t defterlerini y\u00f6netebilir. \u00d6rne\u011fin, AWS ECR i\u00e7in bir repository olu\u015fturmak ve buraya g\u00f6r\u00fcnt\u00fc itmek i\u00e7in:<\/p>\n<pre><code>\n# main.tf - AWS ECR \u00f6rne\u011fi\nresource \"aws_ecr_repository\" \"app_repo\" {\n  name                 = var.image_name\n  image_tag_mutability = \"MUTABLE\" # 'IMMUTABLE' da olabilir\n}\n\nresource \"null_resource\" \"build_and_push_to_ecr\" {\n  depends_on = [aws_ecr_repository.app_repo]\n\n  provisioner \"local-exec\" {\n    # AWS ECR'ye login olmak i\u00e7in AWS CLI kullan\u0131l\u0131r\n    command = <<EOT\n      aws ecr get-login-password --region ${data.aws_region.current.name} | docker login --username AWS --password-stdin ${aws_ecr_repository.app_repo.repository_url}\n      docker build -t ${aws_ecr_repository.app_repo.repository_url}:${var.image_tag} .\n      docker push ${aws_ecr_repository.app_repo.repository_url}:${var.image_tag}\n    EOT\n    interpreter = [\"bash\", \"-c\"]\n    working_dir = path.module\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu, OpenTofu'nun hem ECR deposunu y\u00f6netti\u011fini hem de g\u00f6r\u00fcnt\u00fcy\u00fc oraya y\u00fckleme s\u00fcrecini orkestre etti\u011fini g\u00f6sterir. Bu senaryoda AWS CLI'n\u0131n kurulu ve kimlik do\u011frulanm\u0131\u015f olmas\u0131 gerekir.<\/p>\n<h3>4. Trivy Politikalar\u0131 ve Otomatik Hata Bildirimi<\/h3>\n<p>Trivy'nin <code>--exit-code<\/code> \u00f6zelli\u011fi bir g\u00fcvenlik kap\u0131s\u0131 g\u00f6revi g\u00f6rse de, daha geli\u015fmi\u015f senaryolarda belirli politikalar\u0131 zorlamak isteyebilirsiniz. \u00d6rne\u011fin, belirli bir seviyenin alt\u0131ndaki g\u00fcvenlik a\u00e7\u0131klar\u0131 i\u00e7in uyar\u0131 vermek ama s\u00fcreci durdurmamak, belirli g\u00fcvenlik a\u00e7\u0131\u011f\u0131 kimliklerini (CVE IDs) g\u00f6rmezden gelmek veya sadece d\u00fczeltmesi (fix) olan g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 raporlamak gibi. Trivy, <code>.trivyignore<\/code> dosyalar\u0131 veya komut sat\u0131r\u0131 arg\u00fcmanlar\u0131 ile bu t\u00fcr politikalar\u0131 destekler. Ayr\u0131ca, tarama sonu\u00e7lar\u0131n\u0131 Slack, Jira veya e-posta gibi sistemlere otomatik olarak g\u00f6ndermek i\u00e7in CI\/CD i\u015f ak\u0131\u015f\u0131n\u0131zda ek ad\u0131mlar tan\u0131mlayabilirsiniz. \u00d6rne\u011fin, Trivy'den JSON \u00e7\u0131kt\u0131s\u0131 al\u0131p bunu bir raporlama arac\u0131na g\u00f6nderebilirsiniz:<\/p>\n<pre><code>\n# Trivy \u00e7\u0131kt\u0131s\u0131n\u0131 JSON olarak al\u0131p i\u015flemek\ncommand = \"trivy image --format json --output trivy-results.json ${var.docker_username}\/${var.image_name}:${var.image_tag} && python \/path\/to\/report_parser.py trivy-results.json\"\n    <\/pre>\n<p><\/code><\/p>\n<h3>5. \u00c7ok A\u015famal\u0131 Dockerfile'lar ve G\u00f6r\u00fcnt\u00fc Boyut Optimizasyonu<\/h3>\n<p>\u00dcretim ortam\u0131ndaki Docker g\u00f6r\u00fcnt\u00fclerinin boyutu, da\u011f\u0131t\u0131m h\u0131z\u0131n\u0131 ve depolama maliyetlerini do\u011frudan etkiler. \u00c7ok a\u015famal\u0131 (multi-stage) Dockerfile'lar, derleme ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 nihai g\u00f6r\u00fcnt\u00fcden ay\u0131rarak g\u00f6r\u00fcnt\u00fc boyutunu \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r. \u00d6rne\u011fin, derleme i\u00e7in Node.js'in tam s\u00fcr\u00fcm\u00fcn\u00fc kullan\u0131p, nihai g\u00f6r\u00fcnt\u00fc i\u00e7in sadece uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gereken Alpine tabanl\u0131 daha k\u00fc\u00e7\u00fck bir g\u00f6r\u00fcnt\u00fcy\u00fc kullanabilirsiniz. Bu t\u00fcr bir Dockerfile, OpenTofu otomasyonunda herhangi bir de\u011fi\u015fiklik gerektirmez, ancak g\u00f6r\u00fcnt\u00fcn\u00fcz\u00fcn daha verimli olmas\u0131n\u0131 sa\u011flar.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: \u00c7ok a\u015famal\u0131 Dockerfile'lar kullan\u0131rken, her a\u015faman\u0131n \u00e7\u0131kt\u0131s\u0131n\u0131n yaln\u0131zca gerekli olan\u0131n\u0131 sonraki a\u015famaya ta\u015f\u0131d\u0131\u011f\u0131n\u0131zdan emin olun. Bu, gereksiz ba\u011f\u0131ml\u0131l\u0131klar\u0131n ve ge\u00e7ici dosyalar\u0131n nihai g\u00f6r\u00fcnt\u00fcye dahil edilmesini \u00f6nler.\n    <\/div>\n<p>Bu ileri d\u00fczey stratejileri benimseyerek, Docker g\u00f6r\u00fcnt\u00fc otomasyon s\u00fcrecinizi sadece i\u015flevsel k\u0131lmakla kalmaz, ayn\u0131 zamanda kurumsal gereksinimlere uygun, g\u00fcvenli, verimli ve \u00f6l\u00e7eklenebilir bir yap\u0131ya d\u00f6n\u00fc\u015ft\u00fcrebilirsiniz. OpenTofu'nun esnekli\u011fi ve <code>local-exec<\/code> provizyoneri, bu t\u00fcr entegrasyonlar i\u00e7in g\u00fc\u00e7l\u00fc bir temel sunar.<\/p>\n<h2>Sonu\u00e7: G\u00fcvenli ve Verimli Docker G\u00f6r\u00fcnt\u00fc Y\u00f6netiminin Gelece\u011fi<\/h2>\n<p>Bu makalede, OpenTofu'nun altyap\u0131y\u0131 kod olarak y\u00f6netme yetene\u011fini, Docker'\u0131n konteynerizasyon g\u00fcc\u00fcn\u00fc ve Trivy'nin g\u00fcvenlik tarama hassasiyetini bir araya getirerek, Docker g\u00f6r\u00fcnt\u00fc olu\u015fturma, g\u00fcvenlik tarama ve Docker Hub'a y\u00fckleme s\u00fcre\u00e7lerini nas\u0131l tamamen otomatikle\u015ftirebilece\u011fimizi ayr\u0131nt\u0131l\u0131 bir \u015fekilde inceledik. Manuel s\u00fcre\u00e7lerin getirdi\u011fi hatalar\u0131, zaman kayb\u0131n\u0131 ve g\u00fcvenlik risklerini ortadan kald\u0131ran bu entegre yakla\u015f\u0131m, modern DevOps ve CI\/CD pratiklerinin vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r. Geli\u015ftiriciler, art\u0131k operasyonel karma\u015f\u0131kl\u0131klarla u\u011fra\u015fmak yerine, inovasyona ve kod yazmaya daha fazla odaklanabilirler. \u0130\u015fletmeler ise, daha h\u0131zl\u0131 da\u011f\u0131t\u0131m d\u00f6ng\u00fcleri, tutarl\u0131 ortamlar ve erken a\u015famada tespit edilen g\u00fcvenlik a\u00e7\u0131klar\u0131 sayesinde daha sa\u011flam ve g\u00fcvenli uygulamalar sunabilirler.<\/p>\n<p>OpenTofu'nun sa\u011flad\u0131\u011f\u0131 deklaratif yap\u0131 ve <code>local-exec<\/code> provizyoneri sayesinde, karma\u015f\u0131k kabuk komutlar\u0131n\u0131 bile versiyon kontroll\u00fc ve tekrarlanabilir bir \u015fekilde y\u00f6netebiliriz. Trivy entegrasyonu, g\u00fcvenlik taramas\u0131n\u0131n sadece bir \"ek \u00f6zellik\" olmaktan \u00e7\u0131k\u0131p, her g\u00f6r\u00fcnt\u00fc derleme s\u00fcrecinin do\u011fal bir par\u00e7as\u0131 haline gelmesini sa\u011flam\u0131\u015ft\u0131r. Bu, uygulamalar\u0131n geli\u015ftirme a\u015famas\u0131ndan itibaren g\u00fcvenli\u011finin d\u00fc\u015f\u00fcn\u00fclmesini te\u015fvik eden \"Shift Left Security\" prensibine m\u00fckemmel bir \u00f6rnektir. Sonu\u00e7 olarak, OpenTofu, Docker ve Trivy \u00fc\u00e7l\u00fcs\u00fc, konteyner tabanl\u0131 uygulama geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in g\u00fc\u00e7l\u00fc bir temel olu\u015fturur. Gelecekte, daha fazla otomasyon, ak\u0131ll\u0131 etiketleme stratejileri ve geli\u015fmi\u015f g\u00fcvenlik politikalar\u0131 ile bu s\u00fcre\u00e7leri daha da olgunla\u015ft\u0131rarak, konteynerize uygulamalar\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc tamamen optimize etmek m\u00fcmk\u00fcn olacakt\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<dl>\n<dt>OpenTofu neden Terraform yerine tercih edilmelidir?<\/dt>\n<dd>OpenTofu, HashiCorp Terraform'un a\u00e7\u0131k kaynakl\u0131 ve topluluk odakl\u0131 bir \u00e7atal\u0131d\u0131r. Terraform'un lisans modelindeki de\u011fi\u015fikliklerin ard\u0131ndan a\u00e7\u0131k kaynak ruhunu s\u00fcrd\u00fcrmek isteyenler i\u00e7in g\u00fcvenilir bir alternatif olarak ortaya \u00e7\u0131km\u0131\u015ft\u0131r. Mevcut Terraform projeleriyle y\u00fcksek uyumlulu\u011fa sahiptir ve s\u00fcrekli geli\u015ftirme ile topluluk deste\u011fi vaat eder.<\/dd>\n<dt>Trivy taramas\u0131 \u00e7ok uzun s\u00fcrerse ne yapmal\u0131y\u0131m?<\/dt>\n<dd>Trivy taramas\u0131n\u0131n s\u00fcresi, g\u00f6r\u00fcnt\u00fc boyutuna ve i\u00e7erdi\u011fi katman say\u0131s\u0131na ba\u011fl\u0131 olarak de\u011fi\u015febilir. Performans\u0131 art\u0131rmak i\u00e7in \u015funlar\u0131 deneyebilirsiniz: \u00e7ok a\u015famal\u0131 Dockerfile'lar kullanarak nihai g\u00f6r\u00fcnt\u00fc boyutunu k\u00fc\u00e7\u00fcltmek, sadece kritik ve y\u00fcksek seviyeli g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 taramak i\u00e7in <code>--severity<\/code> bayra\u011f\u0131n\u0131 kullanmak, veya yerel bir Trivy veritaban\u0131 \u00f6nbelle\u011fi kullanmak.<\/dd>\n<dt>Docker Hub'a kimlik do\u011frulama bilgilerini OpenTofu kodunda nas\u0131l g\u00fcvenli tutar\u0131m?<\/dt>\n<dd>Kimlik bilgilerini do\u011frudan OpenTofu kodunda saklamaktan ka\u00e7\u0131nmal\u0131s\u0131n\u0131z. En iyi uygulama, bunlar\u0131 ortam de\u011fi\u015fkenleri (\u00f6rne\u011fin <code>DOCKER_USERNAME<\/code>, <code>DOCKER_PASSWORD<\/code>) veya CI\/CD sistemlerinin (GitHub Actions Secrets, GitLab CI\/CD Variables) sundu\u011fu g\u00fcvenli s\u0131r y\u00f6netimi mekanizmalar\u0131 arac\u0131l\u0131\u011f\u0131yla sa\u011flamakt\u0131r. OpenTofu <code>local-exec<\/code> komutu bu ortam de\u011fi\u015fkenlerini otomatik olarak kullanabilir veya siz manuel olarak <code>docker login<\/code> komutunu CI\/CD hatt\u0131n\u0131z\u0131n bir par\u00e7as\u0131 olarak \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/dd>\n<dt>OpenTofu ile ayn\u0131 anda birden fazla Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc nas\u0131l olu\u015fturup y\u00f6netebilirim?<\/dt>\n<dd>Birden fazla g\u00f6r\u00fcnt\u00fc i\u00e7in, her bir g\u00f6r\u00fcnt\u00fc i\u00e7in ayr\u0131 <code>null_resource<\/code> bloklar\u0131 tan\u0131mlayabilir veya OpenTofu'nun <code>for_each<\/code> meta-arg\u00fcman\u0131n\u0131 kullanarak dinamik olarak birden fazla kaynak olu\u015fturabilirsiniz. Bu, bir de\u011fi\u015fken haritas\u0131nda (map) tan\u0131mlad\u0131\u011f\u0131n\u0131z farkl\u0131 uygulamalar i\u00e7in ayn\u0131 OpenTofu mant\u0131\u011f\u0131n\u0131 tekrarlamadan kullanman\u0131z\u0131 sa\u011flar.<\/dd>\n<dt>G\u00f6r\u00fcnt\u00fc olu\u015fturma, tarama veya y\u00fckleme s\u0131ras\u0131nda bir hata olu\u015fursa OpenTofu ne yapar?<\/dt>\n<dd>E\u011fer <code>local-exec<\/code> provizyoneri i\u00e7indeki herhangi bir komut hata kodu (s\u0131f\u0131rdan farkl\u0131) ile \u00e7\u0131karsa, OpenTofu uygulamas\u0131n\u0131 durdurur ve hatay\u0131 raporlar. Bu, otomasyon hatt\u0131n\u0131zda bir \"fail-fast\" mekanizmas\u0131 sa\u011flar. \u00d6zellikle Trivy'nin <code>--exit-code 1<\/code> bayra\u011f\u0131 ile bu, g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131n otomatik olarak tespiti ve s\u00fcrecin durdurulmas\u0131 i\u00e7in kritik bir \u00f6zelliktir.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Docker g\u00f6r\u00fcnt\u00fclerini manuel olarak olu\u015fturmak, taramak ve kay\u0131t defterine y\u00fcklemek zaman al\u0131c\u0131 ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir.&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-34842","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>OpenTofu ile Docker G\u00f6r\u00fcnt\u00fcs\u00fc Otomasyonu: Derle, Tara, Y\u00fckle<\/title>\n<meta name=\"description\" content=\"Docker g\u00f6r\u00fcnt\u00fclerini manuel olarak olu\u015fturmak, taramak ve kay\u0131t defterine y\u00fcklemek zaman al\u0131c\u0131 ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. Bu makale, OpenTofu&#039;nun g\u00fcc\u00fcn\u00fc kullanarak bu ad\u0131mlar\u0131 tamamen otomatize etmenin, b\u00f6ylece geli\u015ftirme verimlili\u011fini ve g\u00fcvenlik standartlar\u0131n\u0131 art\u0131rman\u0131n yollar\u0131n\u0131 ke\u015ffediyor.\" \/>\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\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"OpenTofu ile Docker G\u00f6r\u00fcnt\u00fcs\u00fc Otomasyonu: Derle, Tara, Y\u00fckle\" \/>\n<meta property=\"og:description\" content=\"Docker g\u00f6r\u00fcnt\u00fclerini manuel olarak olu\u015fturmak, taramak ve kay\u0131t defterine y\u00fcklemek zaman al\u0131c\u0131 ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. Bu makale, OpenTofu&#039;nun g\u00fcc\u00fcn\u00fc kullanarak bu ad\u0131mlar\u0131 tamamen otomatize etmenin, b\u00f6ylece geli\u015ftirme verimlili\u011fini ve g\u00fcvenlik standartlar\u0131n\u0131 art\u0131rman\u0131n yollar\u0131n\u0131 ke\u015ffediyor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-22T15:31:01+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=\"20 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"OpenTofu ile Docker G\u00f6r\u00fcnt\u00fcs\u00fc Otomasyonu: Derle, Tara, Y\u00fckle\",\"datePublished\":\"2025-11-22T15:31:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/\"},\"wordCount\":4275,\"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\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/\",\"name\":\"OpenTofu ile Docker G\u00f6r\u00fcnt\u00fcs\u00fc Otomasyonu: Derle, Tara, Y\u00fckle\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-22T15:31:01+00:00\",\"description\":\"Docker g\u00f6r\u00fcnt\u00fclerini manuel olarak olu\u015fturmak, taramak ve kay\u0131t defterine y\u00fcklemek zaman al\u0131c\u0131 ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. Bu makale, OpenTofu'nun g\u00fcc\u00fcn\u00fc kullanarak bu ad\u0131mlar\u0131 tamamen otomatize etmenin, b\u00f6ylece geli\u015ftirme verimlili\u011fini ve g\u00fcvenlik standartlar\u0131n\u0131 art\u0131rman\u0131n yollar\u0131n\u0131 ke\u015ffediyor.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"OpenTofu ile Docker G\u00f6r\u00fcnt\u00fcs\u00fc Otomasyonu: Derle, Tara, Y\u00fckle\"}]},{\"@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":"OpenTofu ile Docker G\u00f6r\u00fcnt\u00fcs\u00fc Otomasyonu: Derle, Tara, Y\u00fckle","description":"Docker g\u00f6r\u00fcnt\u00fclerini manuel olarak olu\u015fturmak, taramak ve kay\u0131t defterine y\u00fcklemek zaman al\u0131c\u0131 ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. Bu makale, OpenTofu'nun g\u00fcc\u00fcn\u00fc kullanarak bu ad\u0131mlar\u0131 tamamen otomatize etmenin, b\u00f6ylece geli\u015ftirme verimlili\u011fini ve g\u00fcvenlik standartlar\u0131n\u0131 art\u0131rman\u0131n yollar\u0131n\u0131 ke\u015ffediyor.","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\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/","og_locale":"tr_TR","og_type":"article","og_title":"OpenTofu ile Docker G\u00f6r\u00fcnt\u00fcs\u00fc Otomasyonu: Derle, Tara, Y\u00fckle","og_description":"Docker g\u00f6r\u00fcnt\u00fclerini manuel olarak olu\u015fturmak, taramak ve kay\u0131t defterine y\u00fcklemek zaman al\u0131c\u0131 ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. Bu makale, OpenTofu'nun g\u00fcc\u00fcn\u00fc kullanarak bu ad\u0131mlar\u0131 tamamen otomatize etmenin, b\u00f6ylece geli\u015ftirme verimlili\u011fini ve g\u00fcvenlik standartlar\u0131n\u0131 art\u0131rman\u0131n yollar\u0131n\u0131 ke\u015ffediyor.","og_url":"https:\/\/fatihsoysal.com\/blog\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-22T15:31:01+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"20 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"OpenTofu ile Docker G\u00f6r\u00fcnt\u00fcs\u00fc Otomasyonu: Derle, Tara, Y\u00fckle","datePublished":"2025-11-22T15:31:01+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/"},"wordCount":4275,"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\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/","url":"https:\/\/fatihsoysal.com\/blog\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/","name":"OpenTofu ile Docker G\u00f6r\u00fcnt\u00fcs\u00fc Otomasyonu: Derle, Tara, Y\u00fckle","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-22T15:31:01+00:00","description":"Docker g\u00f6r\u00fcnt\u00fclerini manuel olarak olu\u015fturmak, taramak ve kay\u0131t defterine y\u00fcklemek zaman al\u0131c\u0131 ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. Bu makale, OpenTofu'nun g\u00fcc\u00fcn\u00fc kullanarak bu ad\u0131mlar\u0131 tamamen otomatize etmenin, b\u00f6ylece geli\u015ftirme verimlili\u011fini ve g\u00fcvenlik standartlar\u0131n\u0131 art\u0131rman\u0131n yollar\u0131n\u0131 ke\u015ffediyor.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/opentofu-ile-docker-goruntusu-otomasyonu-derle-tara-yukle\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"OpenTofu ile Docker G\u00f6r\u00fcnt\u00fcs\u00fc Otomasyonu: Derle, Tara, Y\u00fckle"}]},{"@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\/34842","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=34842"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34842\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34842"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34842"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34842"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}