{"id":33471,"date":"2025-11-03T08:01:21","date_gmt":"2025-11-03T05:01:21","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/one-dockerfile-two-stages-a-50-size-reduction-story\/"},"modified":"2025-11-03T08:01:21","modified_gmt":"2025-11-03T05:01:21","slug":"one-dockerfile-two-stages-a-50-size-reduction-story","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/one-dockerfile-two-stages-a-50-size-reduction-story\/","title":{"rendered":"One Dockerfile, Two Stages: A 50% Size Reduction Story"},"content":{"rendered":"<p><body><\/p>\n<p>Geli\u015ftirme d\u00fcnyas\u0131nda, uygulamalar\u0131 paketlemek ve da\u011f\u0131tmak i\u00e7in Docker konteynerleri art\u0131k vazge\u00e7ilmez bir ara\u00e7 haline geldi. Ancak, \u00e7o\u011fu zaman fark\u0131nda olmadan, Docker imajlar\u0131m\u0131z\u0131n gere\u011finden \u00e7ok daha b\u00fcy\u00fck boyutlara ula\u015ft\u0131\u011f\u0131n\u0131 g\u00f6r\u00fcyoruz. Bu durum, da\u011f\u0131t\u0131m s\u00fcrelerini uzat\u0131r, disk alan\u0131 israf\u0131na yol a\u00e7ar ve potansiyel g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 art\u0131r\u0131r. Peki, bu sorunu nas\u0131l a\u015fabiliriz? Tek bir Dockerfile kullanarak, imaj boyutunu %50 veya daha fazla oranda k\u00fc\u00e7\u00fcltmenin sihirli bir yolu var m\u0131? Kesinlikle evet! Bu makalede, \u00e7ok katmanl\u0131 (multi-stage) Docker yap\u0131lar\u0131 ad\u0131 verilen g\u00fc\u00e7l\u00fc bir teknikle tan\u0131\u015facak ve uygulamalar\u0131n\u0131z\u0131n konteynerle\u015ftirme s\u00fcrecini k\u00f6kten de\u011fi\u015ftirecek bir yakla\u015f\u0131ma ad\u0131m atacaks\u0131n\u0131z. B\u00fcy\u00fck imajlar\u0131n neden oldu\u011fu ba\u015f a\u011fr\u0131s\u0131ndan kurtulmak ve daha h\u0131zl\u0131, daha g\u00fcvenli da\u011f\u0131t\u0131mlar yapmak i\u00e7in haz\u0131rsan\u0131z, bu yolculu\u011fa ba\u015flayal\u0131m.<\/p>\n<h3>\u00c7ok Katmanl\u0131 Docker Yap\u0131lar\u0131 Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>Docker imajlar\u0131, uygulaman\u0131z\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gereken her \u015feyi i\u00e7eren ta\u015f\u0131nabilir, kendi kendine yeten paketlerdir. Ancak geleneksel yakla\u015f\u0131mla bir Dockerfile yazd\u0131\u011f\u0131n\u0131zda, geli\u015ftirme ve derleme ortam\u0131n\u0131zdaki t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar ve ara\u00e7lar, nihai \u00fcretim imaj\u0131n\u0131za dahil olabilir. \u00d6rne\u011fin, bir Node.js uygulamas\u0131n\u0131 ele alal\u0131m. Uygulaman\u0131z\u0131 derlemek ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kurmak i\u00e7in bir Node.js tabanl\u0131 imaja ihtiya\u00e7 duyars\u0131n\u0131z. Bu imaj, derleyicileri, test ara\u00e7lar\u0131n\u0131, <code>npm<\/code> paket y\u00f6neticisini ve di\u011fer bir\u00e7ok gereksiz bile\u015feni i\u00e7erir. T\u00fcm bunlar, uygulaman\u0131z\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in kesinlikle gerekli olmamas\u0131na ra\u011fmen, nihai imaj\u0131n\u0131z\u0131n boyutunu \u015fi\u015firir. Sonu\u00e7 olarak, megabaytlarca hatta gigabaytlarca gereksiz veri i\u00e7eren a\u011f\u0131r imajlarla kar\u015f\u0131la\u015f\u0131rs\u0131n\u0131z. Bu durum, CI\/CD s\u00fcre\u00e7lerinde daha uzun build s\u00fcreleri, registry\u2019lere daha yava\u015f push\/pull i\u015flemleri ve sunucularda daha fazla disk alan\u0131 t\u00fcketimi anlam\u0131na gelir. Ayr\u0131ca, imaj i\u00e7indeki fazla yaz\u0131l\u0131m, sald\u0131r\u0131 y\u00fczeyini art\u0131rarak g\u00fcvenlik risklerini de beraberinde getirir. \u0130\u015fte tam bu noktada \u00e7ok katmanl\u0131 Docker yap\u0131lar\u0131 devreye girer.<\/p>\n<p>\u00c7ok katmanl\u0131 yap\u0131, Dockerfile i\u00e7inde birden fazla <code>FROM<\/code> ifadesi kullanarak imaj olu\u015fturma s\u00fcrecini ayr\u0131 ad\u0131mlara b\u00f6lmenizi sa\u011flayan g\u00fc\u00e7l\u00fc bir \u00f6zelliktir. Her <code>FROM<\/code> ifadesi, yeni bir build a\u015famas\u0131n\u0131 (stage) ba\u015flat\u0131r ve kendine \u00f6zg\u00fc bir temel imaja sahip olabilir. Buradaki temel fikir \u015fudur: \u0130lk a\u015famalarda (build stage) uygulaman\u0131z\u0131 derlemek, test etmek ve t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kurmak i\u00e7in gerekli olan t\u00fcm ara\u00e7lar\u0131 kullan\u0131rs\u0131n\u0131z. Daha sonra, bir sonraki a\u015famada (runtime stage), \u00f6nceki a\u015famadan yaln\u0131zca uygulaman\u0131z\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in *ger\u00e7ekten* gerekli olan derlenmi\u015f \u00e7\u0131kt\u0131lar\u0131 veya paketleri kopyalars\u0131n\u0131z. B\u00f6ylece, derleme s\u00fcrecinde kullan\u0131lan t\u00fcm geli\u015ftirme ba\u011f\u0131ml\u0131l\u0131klar\u0131, build ara\u00e7lar\u0131 ve ge\u00e7ici dosyalar, nihai \u00fcretim imaj\u0131na dahil edilmez. <code>AS<\/code> anahtar kelimesi ile her a\u015famaya bir isim verebilir ve <code>COPY --from=<stage_name><\/code> komutu ile a\u015famalar aras\u0131nda dosya transferi yapabilirsiniz. Bu y\u00f6ntem sayesinde, nihai imaj, yaln\u0131zca uygulaman\u0131z\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in minimum ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131n\u0131 i\u00e7erir. Bu da imaj boyutunda dramatik bir azalma sa\u011flayarak genellikle %50&#8217;den \u00e7ok daha y\u00fcksek oranlarda k\u00fc\u00e7\u00fclme elde etmenize olanak tan\u0131r. \u00d6rne\u011fin, 500 MB&#8217;l\u0131k bir Node.js imaj\u0131n\u0131 50 MB&#8217;a kadar d\u00fc\u015f\u00fcrmek, \u00e7ok katmanl\u0131 yap\u0131larla son derece ger\u00e7ek\u00e7i bir hedeftir. Daha k\u00fc\u00e7\u00fck imajlar, daha h\u0131zl\u0131 da\u011f\u0131t\u0131mlar, daha az depolama maliyeti, daha d\u00fc\u015f\u00fck sald\u0131r\u0131 y\u00fczeyi ve genel olarak daha verimli bir konteynerizasyon s\u00fcreci demektir.<\/p>\n<aside class=\"interactive-tip\">\n  Uzman \u0130pucu: \u00c7ok katmanl\u0131 yap\u0131lar\u0131n en b\u00fcy\u00fck avantajlar\u0131ndan biri, her a\u015faman\u0131n kendi \u00f6nbellekleme mekanizmas\u0131na sahip olmas\u0131d\u0131r. E\u011fer bir a\u015famadaki komutlar de\u011fi\u015fmezse, Docker o a\u015famay\u0131 yeniden derlemez. Bu, \u00f6zellikle build stage&#8217;inde yo\u011fun ba\u011f\u0131ml\u0131l\u0131k kurulumlar\u0131 olan projelerde build s\u00fcrelerini \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131salt\u0131r.<br \/>\n<\/aside>\n<h3>Ger\u00e7ek D\u00fcnya Senaryosu: Bir Node.js Uygulamas\u0131 ile \u00c7ok Katmanl\u0131 Yap\u0131 Nas\u0131l Olu\u015fturulur?<\/h3>\n<p>\u015eimdi, teoriden prati\u011fe ge\u00e7elim ve ger\u00e7ek bir senaryo \u00fczerinden \u00e7ok katmanl\u0131 Docker yap\u0131lar\u0131n\u0131 ad\u0131m ad\u0131m inceleyelim. Tipik bir Node.js uygulamas\u0131n\u0131 ele alaca\u011f\u0131z. Bu uygulama, <code>express<\/code> kullanarak basit bir web sunucusu \u00e7al\u0131\u015ft\u0131r\u0131yor olabilir. Amac\u0131m\u0131z, uygulaman\u0131n final imaj boyutunu optimize etmek ve gereksiz ba\u011f\u0131ml\u0131l\u0131klar\u0131 d\u0131\u015far\u0131da b\u0131rakmakt\u0131r.<\/p>\n<h4>\u0130lk Ad\u0131m: Geleneksel Dockerfile ile Sorunu Anlamak<\/h4>\n<p>Geleneksel bir yakla\u015f\u0131mda, bir Node.js uygulamas\u0131n\u0131 Dockerize etmek i\u00e7in tek bir <code>FROM<\/code> komutuyla her \u015feyi ayn\u0131 imaj i\u00e7inde yapar\u0131z. Bu, basit gibi g\u00f6r\u00fcnse de, ciddi boyut sorunlar\u0131na yol a\u00e7abilir. \u0130\u015fte tipik bir geleneksel Dockerfile \u00f6rne\u011fi:<\/p>\n<pre><code>\nFROM node:16\n\nWORKDIR \/app\n\n# Uygulama ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kopyala ve kur\nCOPY package*.json .\/\nRUN npm install\n\n# Uygulama kaynak kodunu kopyala\nCOPY . .\n\nEXPOSE 3000\nCMD [\"node\", \"server.js\"]\n<\/pre>\n<p><\/code><\/p>\n<p>Bu Dockerfile, uygulaman\u0131z\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gereken her \u015feyi tek bir imajda birle\u015ftirir. Ancak dikkatli bakarsan\u0131z, <code>node:16<\/code> temel imaj\u0131n\u0131n kendisi zaten olduk\u00e7a b\u00fcy\u00fckt\u00fcr (genellikle birka\u00e7 y\u00fcz MB). \u00dcstelik <code>npm install<\/code> komutu, geli\u015ftirme ba\u011f\u0131ml\u0131l\u0131klar\u0131 da dahil olmak \u00fczere t\u00fcm paketleri indirir ve bu paketler ge\u00e7ici dosyalar, test ara\u00e7lar\u0131 ve di\u011fer geli\u015ftirme ama\u00e7l\u0131 \u00f6\u011feler i\u00e7erebilir. T\u00fcm bunlar nihai imaj\u0131n boyutunu gereksiz yere art\u0131r\u0131r. \u00d6rne\u011fin, <code>node_modules<\/code> klas\u00f6r\u00fc tek ba\u015f\u0131na y\u00fczlerce MB'a ula\u015fabilir. Bu Dockerfile ile olu\u015fturulan bir imaj\u0131n boyutu kolayca 500 MB veya daha fazlas\u0131na ula\u015fabilir. Bu, hem depolama hem de da\u011f\u0131t\u0131m a\u00e7\u0131s\u0131ndan verimsizdir.<\/p>\n<h4>\u0130kinci Ad\u0131m: \u00c7ok Katmanl\u0131 Dockerfile ile Optimizasyon<\/h4>\n<p>\u015eimdi ayn\u0131 Node.js uygulamas\u0131n\u0131 \u00e7ok katmanl\u0131 bir yakla\u015f\u0131mla nas\u0131l Dockerize edece\u011fimize bakal\u0131m. Bu y\u00f6ntemde, iki ana a\u015fama tan\u0131mlayaca\u011f\u0131z: bir <code>builder<\/code> (derleyici) a\u015famas\u0131 ve bir <code>production<\/code> (\u00fcretim) a\u015famas\u0131.<\/p>\n<pre><code>\n# A\u015eAMA 1: BUILDER A\u015eAMASI (Derleme Ortam\u0131)\n# Uygulamay\u0131 derlemek ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 kurmak i\u00e7in tam Node.js ortam\u0131n\u0131 kullan\u0131r\u0131z.\nFROM node:16-alpine AS builder\n\nWORKDIR \/app\n\n# package.json ve package-lock.json dosyalar\u0131n\u0131 kopyala\nCOPY package*.json .\/\n\n# Sadece \u00fcretim ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kur. Geli\u015ftirme ba\u011f\u0131ml\u0131l\u0131klar\u0131 dahil edilmez.\n# --omit=dev flag'i ile geli\u015ftirme ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 hari\u00e7 tutar\u0131z.\nRUN npm install --omit=dev\n\n# Uygulama kaynak kodunu kopyala\nCOPY . .\n\n# E\u011fer frontend (React, Angular, Vue) build ad\u0131m\u0131 varsa bu komutu kullan\u0131n:\n# RUN npm run build\n\n# Bu a\u015famada, derlenmi\u015f \u00e7\u0131kt\u0131lar\u0131 veya \u00fcretim ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 <code>\/app<\/code> dizininde toplad\u0131k.\n\n\n# A\u015eAMA 2: PRODUCTION A\u015eAMASI (\u00c7al\u0131\u015fma Ortam\u0131)\n# Uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in minimum ba\u011f\u0131ml\u0131l\u0131klar\u0131 olan hafif bir Node.js imaj\u0131 kullan\u0131r\u0131z.\nFROM node:16-alpine\n\nWORKDIR \/app\n\n# \u0130lk a\u015famadan (builder) sadece gerekli dosyalar\u0131 kopyala\n# node_modules klas\u00f6r\u00fcn\u00fc kopyala\nCOPY --from=builder \/app\/node_modules .\/node_modules\n\n# package.json ve server.js gibi uygulama dosyalar\u0131n\u0131 kopyala\nCOPY --from=builder \/app\/package*.json .\/\nCOPY --from=builder \/app\/server.js .\/\n\n# E\u011fer frontend build ad\u0131m\u0131 varsa, derlenmi\u015f statik dosyalar\u0131 da kopyalay\u0131n:\n# COPY --from=builder \/app\/build .\/build\n\nEXPOSE 3000\nCMD [\"node\", \"server.js\"]\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00e7ok katmanl\u0131 Dockerfile'\u0131 ad\u0131m ad\u0131m inceleyelim:<\/p>\n<p>1.  <strong>Builder A\u015famas\u0131 (<code>FROM node:16-alpine AS builder<\/code>):<\/strong><br \/>\n    *   <code>FROM node:16-alpine AS builder<\/code>: \u0130lk a\u015famay\u0131 ba\u015flat\u0131r ve ad\u0131n\u0131 <code>builder<\/code> olarak belirleriz. <code>node:16-alpine<\/code>, standart <code>node:16<\/code>'ya g\u00f6re daha hafif olan Alpine Linux tabanl\u0131 bir Node.js imaj\u0131d\u0131r. Bu imaj, derleme i\u015flemleri i\u00e7in gerekli olan t\u00fcm Node.js ara\u00e7lar\u0131n\u0131 i\u00e7erir.<br \/>\n    *   <code>WORKDIR \/app<\/code>: \u00c7al\u0131\u015fma dizinini ayarlar.<br \/>\n    *   <code>COPY package*.json .\/<\/code>: Ba\u011f\u0131ml\u0131l\u0131k dosyalar\u0131n\u0131 \u00e7al\u0131\u015fma dizinine kopyalar.<br \/>\n    *   <code>RUN npm install --omit=dev<\/code>: Buras\u0131 kritik! Sadece uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gerekli olan \u00fcretim ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kurar\u0131z. Geli\u015ftirme ba\u011f\u0131ml\u0131l\u0131klar\u0131 (test k\u00fct\u00fcphaneleri, linterlar vb.) bu imaja dahil edilmez. Bu, <code>node_modules<\/code> klas\u00f6r\u00fcn\u00fcn boyutunu \u00f6nemli \u00f6l\u00e7\u00fcde k\u00fc\u00e7\u00fclt\u00fcr.<br \/>\n    *   <code>COPY . .<\/code>: Uygulaman\u0131n geri kalan kaynak kodunu kopyalar.<br \/>\n    *   <code>RUN npm run build<\/code>: E\u011fer bir frontend uygulamas\u0131 (React, Angular, Vue) geli\u015ftiriyorsan\u0131z ve statik dosyalar derlemeniz gerekiyorsa, bu komutu burada \u00e7al\u0131\u015ft\u0131rabilirsiniz. Derlenmi\u015f \u00e7\u0131kt\u0131lar (\u00f6rne\u011fin, <code>\/app\/build<\/code> klas\u00f6r\u00fcnde), daha sonraki a\u015famaya aktar\u0131lacakt\u0131r.<\/p>\n<p>2.  <strong>Production A\u015famas\u0131 (<code>FROM node:16-alpine<\/code>):<\/strong><br \/>\n    *   <code>FROM node:16-alpine<\/code>: \u0130kinci ve son a\u015famay\u0131 ba\u015flat\u0131r\u0131z. Bu a\u015fama i\u00e7in de <code>node:16-alpine<\/code> gibi hafif bir temel imaj kullan\u0131r\u0131z \u00e7\u00fcnk\u00fc sadece uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gerekli Node.js \u00e7al\u0131\u015fma zaman\u0131na ihtiyac\u0131m\u0131z var.<br \/>\n    *   <code>WORKDIR \/app<\/code>: \u00c7al\u0131\u015fma dizinini ayarlar.<br \/>\n    *   <code>COPY --from=builder \/app\/node_modules .\/node_modules<\/code>: \u0130\u015fte sihirli k\u0131s\u0131m! \u00d6nceki <code>builder<\/code> a\u015famas\u0131ndan, *sadece* \u00fcretim ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 i\u00e7eren <code>node_modules<\/code> klas\u00f6r\u00fcn\u00fc kopyalar\u0131z. T\u00fcm geli\u015ftirme ara\u00e7lar\u0131 ve ge\u00e7ici build dosyalar\u0131 <code>builder<\/code> a\u015famas\u0131nda kal\u0131r ve nihai imaja dahil edilmez.<br \/>\n    *   <code>COPY --from=builder \/app\/package*.json .\/<\/code> ve <code>COPY --from=builder \/app\/server.js .\/<\/code>: Uygulaman\u0131n ana dosyalar\u0131n\u0131 da <code>builder<\/code> a\u015famas\u0131ndan kopyalar\u0131z.<br \/>\n    *   <code>COPY --from=builder \/app\/build .\/build<\/code>: E\u011fer bir frontend build ad\u0131m\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131ysan\u0131z, derlenmi\u015f statik dosyalar\u0131 da bu \u015fekilde kopyalars\u0131n\u0131z.<br \/>\n    *   <code>EXPOSE 3000<\/code> ve <code>CMD [\"node\", \"server.js\"]<\/code>: Uygulaman\u0131n dinleyece\u011fi portu belirtir ve \u00e7al\u0131\u015ft\u0131rma komutunu tan\u0131mlar.<\/p>\n<h4>Sonu\u00e7lar\u0131n Kar\u015f\u0131la\u015ft\u0131r\u0131lmas\u0131<\/h4>\n<p>Bu iki Dockerfile aras\u0131ndaki fark, imaj boyutunda inan\u0131lmaz bir de\u011fi\u015fime yol a\u00e7ar. Geleneksel Dockerfile ile 500 MB'l\u0131k bir imaj olu\u015fturabilirken, \u00e7ok katmanl\u0131 yap\u0131 ile bu boyutu 50-100 MB aral\u0131\u011f\u0131na d\u00fc\u015f\u00fcrebilirsiniz. Yani, %80-90'lara varan bir boyut k\u00fc\u00e7\u00fclmesi elde etmek m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<p>Bu k\u00fc\u00e7\u00fclmenin ana nedenleri \u015funlard\u0131r:<br \/>\n*   <strong>Hafif Temel \u0130majlar:<\/strong> Her iki a\u015famada da <code>alpine<\/code> tabanl\u0131 imajlar kullanarak ba\u015flang\u0131\u00e7 boyutunu minimize ettik.<br \/>\n*   <strong>\u00dcretim Ba\u011f\u0131ml\u0131l\u0131klar\u0131:<\/strong> Sadece uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gerekli olan ba\u011f\u0131ml\u0131l\u0131klar\u0131 dahil ettik.<br \/>\n*   <strong>Gereksiz Katmanlar\u0131 Temizleme:<\/strong> Build s\u00fcrecinde kullan\u0131lan t\u00fcm geli\u015ftirme ara\u00e7lar\u0131 ve ge\u00e7ici dosyalar, final imaja asla ge\u00e7mez.<\/p>\n<p>Bu optimizasyon, uygulaman\u0131z\u0131n da\u011f\u0131t\u0131m\u0131n\u0131 h\u0131zland\u0131r\u0131r, a\u011f trafi\u011fini azalt\u0131r, sunucu depolama maliyetlerini d\u00fc\u015f\u00fcr\u00fcr ve en \u00f6nemlisi, imaj\u0131n\u0131z\u0131n sald\u0131r\u0131 y\u00fczeyini \u00f6nemli \u00f6l\u00e7\u00fcde k\u00fc\u00e7\u00fclterek g\u00fcvenli\u011fini art\u0131r\u0131r.<\/p>\n<aside class=\"interactive-tip\">\n  Uzman \u0130pucu: <code>package.json<\/code> dosyan\u0131z\u0131 ve ard\u0131ndan <code>node_modules<\/code>'i ayr\u0131 bir <code>COPY<\/code> ve <code>RUN<\/code> katman\u0131na yerle\u015ftirmek, sadece <code>package.json<\/code> de\u011fi\u015fti\u011finde <code>npm install<\/code> ad\u0131m\u0131n\u0131n yeniden \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 sa\u011flar. Bu, kaynak kodda yap\u0131lan de\u011fi\u015fikliklerde <code>npm install<\/code> ad\u0131m\u0131n\u0131n atlanmas\u0131na ve daha h\u0131zl\u0131 build s\u00fcrelerine olanak tan\u0131r.<br \/>\n<\/aside>\n<h3>Sadece Node.js mi? Di\u011fer Teknolojilerde \u00c7ok Katmanl\u0131 Yap\u0131lar<\/h3>\n<p>\u00c7ok katmanl\u0131 Docker yap\u0131lar\u0131, sadece Node.js uygulamalar\u0131yla s\u0131n\u0131rl\u0131 de\u011fildir; aksine, derleme veya yo\u011fun ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimi gerektiren hemen hemen her teknoloji y\u0131\u011f\u0131n\u0131 i\u00e7in muazzam faydalar sunar. Her dilin veya \u00e7er\u00e7evesinin kendine \u00f6zg\u00fc derleme veya paketleme ad\u0131mlar\u0131 oldu\u011fundan, \u00e7ok katmanl\u0131 yap\u0131lar\u0131n uygulan\u0131\u015f\u0131 biraz farkl\u0131l\u0131k g\u00f6sterebilir, ancak temel prensip ayn\u0131 kal\u0131r: geli\u015ftirme ortam\u0131n\u0131 \u00fcretim ortam\u0131ndan ay\u0131rmak. Bu teknik, Go, Java, Python ve hatta frontend uygulamalar\u0131 gibi bir\u00e7ok pop\u00fcler teknolojide etkili bir \u015fekilde kullan\u0131labilir.<\/p>\n<p><strong>Go (Golang) Uygulamalar\u0131:<\/strong> Go, statik olarak derlenen ikili dosyalar \u00fcretti\u011fi i\u00e7in \u00e7ok katmanl\u0131 yap\u0131lar i\u00e7in adeta bi\u00e7ilmi\u015f kaftand\u0131r. \u0130lk a\u015famada, uygulaman\u0131z\u0131 Go derleyicisi ve gerekli ba\u011f\u0131ml\u0131l\u0131klarla dolu bir Go imaj\u0131 (\u00f6rne\u011fin, <code>golang:1.18<\/code>) i\u00e7inde derlersiniz. Bu a\u015famada derlenen tek bir ikili dosyay\u0131 elde edersiniz. \u0130kinci a\u015famada ise, bu ikili dosyay\u0131 tamamen bo\u015f bir imaj olan <code>scratch<\/code> imaj\u0131na (veya <code>alpine<\/code> gibi \u00e7ok hafif bir imaja) kopyalars\u0131n\u0131z. <code>scratch<\/code> imaj\u0131, s\u0131f\u0131r MB boyutunda, i\u015fletim sistemi bile i\u00e7ermeyen minimalist bir imajd\u0131r ve sadece kopyalad\u0131\u011f\u0131n\u0131z ikili dosyay\u0131 i\u00e7erir. Bu yakla\u015f\u0131m, genellikle Go uygulamalar\u0131 i\u00e7in 10-20 MB gibi inan\u0131lmaz derecede k\u00fc\u00e7\u00fck nihai imajlar olu\u015fturulmas\u0131n\u0131 sa\u011flar. Bu durum, Go'nun do\u011fas\u0131nda bulunan hafifli\u011fi Docker'\u0131n g\u00fcc\u00fcyle birle\u015ftirerek maksimum verimlilik sunar.<\/p>\n<p><strong>Java (Spring Boot, Quarkus vb.) Uygulamalar\u0131:<\/strong> Java uygulamalar\u0131, \u00f6zellikle Maven veya Gradle gibi derleme ara\u00e7lar\u0131 kulland\u0131\u011f\u0131nda, \u00e7ok katmanl\u0131 yap\u0131larla b\u00fcy\u00fck kazan\u0131mlar elde edebilir. \u0130lk a\u015famada (\u00f6rne\u011fin, <code>maven:3.8.6-openjdk-11<\/code> gibi bir imaj kullanarak), uygulaman\u0131z\u0131n kaynak kodunu kopyalar, Maven veya Gradle komutlar\u0131yla derler ve y\u00fcr\u00fct\u00fclebilir JAR veya WAR dosyas\u0131n\u0131 olu\u015fturursunuz. Bu a\u015fama, t\u00fcm derleme ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 ve test ara\u00e7lar\u0131n\u0131 i\u00e7erecektir. \u0130kinci a\u015famada ise, yaln\u0131zca Java Runtime Environment'\u0131 (JRE) i\u00e7eren hafif bir temel imaj (\u00f6rne\u011fin, <code>openjdk:11-jre-slim<\/code> veya <code>eclipse-temurin:11-jre-alpine<\/code>) kullan\u0131rs\u0131n\u0131z. \u0130lk a\u015famadan derlenmi\u015f JAR dosyas\u0131n\u0131 bu JRE imaj\u0131na kopyalar ve uygulamay\u0131 \u00e7al\u0131\u015ft\u0131r\u0131rs\u0131n\u0131z. Bu y\u00f6ntemle, b\u00fcy\u00fck derleme ortamlar\u0131n\u0131 i\u00e7eren devasa imajlar yerine, sadece uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gerekli olan JRE ve uygulaman\u0131n kendisini i\u00e7eren \u00e7ok daha k\u00fc\u00e7\u00fck imajlar elde edersiniz.<\/p>\n<p><strong>Python Uygulamalar\u0131:<\/strong> Python uygulamalar\u0131 i\u00e7in de benzer bir yakla\u015f\u0131m izlenebilir. \u0130lk a\u015famada, <code>python:3.9-slim<\/code> veya <code>python:3.9-alpine<\/code> gibi bir imaj kullanarak uygulama ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 (\u00f6rne\u011fin, <code>pip install -r requirements.txt<\/code>) kurabilirsiniz. Bu a\u015famada, ba\u011f\u0131ml\u0131l\u0131klar derlenerek veya \u00f6zel ortamlar olu\u015fturularak daha sonraki a\u015famaya aktar\u0131labilir. \u00d6zellikle C uzant\u0131lar\u0131 gerektiren paketler varsa, bu ilk a\u015fama bunlar\u0131 derlemek i\u00e7in kullan\u0131labilir. \u0130kinci a\u015famada ise, sadece Python \u00e7al\u0131\u015fma zaman\u0131 ve ilk a\u015famada kurulmu\u015f olan paketleri i\u00e7eren daha k\u00fc\u00e7\u00fck bir imaj (yine <code>python:3.9-slim-buster<\/code> veya <code>python:3.9-alpine<\/code>) kullan\u0131rs\u0131n\u0131z. Uygulama kodunu ve gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 bu hafif imaja kopyalayarak son imaj boyutunu optimize edersiniz. Sanal ortamlar\u0131 (venv) veya Poetry gibi ara\u00e7lar\u0131 kullan\u0131rken de benzer mant\u0131kla sadece gerekli olan \u00e7\u0131kt\u0131lar\u0131 kopyalamak m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<p><strong>Frontend Uygulamalar\u0131 (React, Angular, Vue.js):<\/strong> Modern frontend \u00e7er\u00e7eveleri genellikle webpack veya Vite gibi ara\u00e7larla derleme ad\u0131mlar\u0131 gerektirir. \u0130lk a\u015famada (\u00f6rne\u011fin, <code>node:16-alpine<\/code> gibi bir Node.js imaj\u0131 kullanarak), uygulaman\u0131z\u0131n kaynak kodunu kopyalar, <code>npm install<\/code> veya <code>yarn install<\/code> ile ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kurar ve <code>npm run build<\/code> komutuyla statik dosyalar\u0131n\u0131 (HTML, CSS, JavaScript) derlersiniz. \u0130kinci a\u015famada ise, bu derlenmi\u015f statik dosyalar\u0131 sunmak i\u00e7in ultra hafif bir web sunucusu imaj\u0131 (\u00f6rne\u011fin, <code>nginx:alpine<\/code>) kullan\u0131rs\u0131n\u0131z. <code>nginx:alpine<\/code> imaj\u0131na, ilk a\u015famadan derlenmi\u015f statik dosyalar\u0131 kopyalar ve Nginx'i bu dosyalar\u0131 sunacak \u015fekilde yap\u0131land\u0131r\u0131rs\u0131n\u0131z. Bu y\u00f6ntemle, Node.js geli\u015ftirme ortam\u0131n\u0131 ve derleme ara\u00e7lar\u0131n\u0131 i\u00e7eren b\u00fcy\u00fck bir imaj yerine, sadece derlenmi\u015f frontend varl\u0131klar\u0131n\u0131 ve hafif bir web sunucusunu i\u00e7eren \u00e7ok k\u00fc\u00e7\u00fck bir imaj elde edersiniz. Bu, da\u011f\u0131t\u0131m h\u0131z\u0131n\u0131 art\u0131r\u0131r ve kaynak t\u00fcketimini azalt\u0131r. G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere, \u00e7ok katmanl\u0131 yap\u0131lar, farkl\u0131 teknolojilerin kendine has ihtiya\u00e7lar\u0131na uyum sa\u011flayarak konteyner optimizasyonunda standart bir en iyi uygulama haline gelmi\u015ftir.<\/p>\n<aside class=\"interactive-tip\">\n  Uzman \u0130pucu: E\u011fer uygulaman\u0131z\u0131n build ad\u0131m\u0131 karma\u015f\u0131k ba\u011f\u0131ml\u0131l\u0131klara sahipse ve <code>alpine<\/code> tabanl\u0131 imajlarda sorun ya\u015f\u0131yorsan\u0131z, <code>debian-slim<\/code> veya <code>ubuntu-slim<\/code> gibi biraz daha b\u00fcy\u00fck ama uyumluluk a\u00e7\u0131s\u0131ndan daha geni\u015f tabanl\u0131 imajlar\u0131 denemek iyi bir ba\u015flang\u0131\u00e7 olabilir. Her zaman en k\u00fc\u00e7\u00fck imaj\u0131n pe\u015finde ko\u015fmak yerine, kararl\u0131l\u0131k ve uyumluluk aras\u0131ndaki dengeyi bulmaya \u00e7al\u0131\u015f\u0131n.<br \/>\n<\/aside>\n<h3>Geli\u015fmi\u015f \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar<\/h3>\n<p>\u00c7ok katmanl\u0131 Docker yap\u0131lar\u0131, imaj boyutunu k\u00fc\u00e7\u00fcltmek i\u00e7in harika bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r, ancak daha da ileri giderek konteynerle\u015ftirme stratejinizi optimize etmenin ba\u015fka yollar\u0131 da vard\u0131r. \u0130\u015fte deneyimli kullan\u0131c\u0131lar i\u00e7in baz\u0131 ipu\u00e7lar\u0131 ve en iyi uygulamalar:<\/p>\n<h4>Minimum Temel G\u00f6r\u00fcnt\u00fcler Kullan\u0131n (Minimal Base Images)<\/h4>\n<p>Yukar\u0131daki Node.js \u00f6rne\u011finde <code>node:16-alpine<\/code> kulland\u0131k. <code>Alpine Linux<\/code>, standart Debian veya Ubuntu tabanl\u0131 imajlara g\u00f6re \u00e7ok daha k\u00fc\u00e7\u00fck bir Linux da\u011f\u0131t\u0131m\u0131d\u0131r ve bu da temel imaj boyutunu \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r. E\u011fer uygulaman\u0131z <code>glibc<\/code> gibi \u00f6zel ba\u011f\u0131ml\u0131l\u0131klar gerektirmiyorsa, her zaman <code>alpine<\/code> tabanl\u0131 imajlar\u0131 tercih etmeye \u00e7al\u0131\u015f\u0131n. Daha da radikal bir yakla\u015f\u0131m i\u00e7in, statik olarak derlenmi\u015f Go uygulamalar\u0131 gibi durumlar i\u00e7in <code>scratch<\/code> imaj\u0131n\u0131 kullanabilirsiniz. <code>scratch<\/code>, tamamen bo\u015f bir imajd\u0131r ve sadece uygulaman\u0131z\u0131n derlenmi\u015f ikili dosyas\u0131n\u0131 i\u00e7erir, bu da nihai imaj\u0131n boyutunu minimuma indirir. Java uygulamalar\u0131 i\u00e7in <code>jre-slim<\/code> veya <code>jre-alpine<\/code> gibi \u00f6zel JRE imajlar\u0131 da benzer \u015fekilde boyut tasarrufu sa\u011flar.<\/p>\n<h4>Ba\u011f\u0131ml\u0131l\u0131k \u00d6nbellekleme \u0130\u00e7in Katman S\u0131ralamas\u0131na Dikkat Edin (Dependency Caching)<\/h4>\n<p>Docker, her bir komutu ayr\u0131 bir katman olarak \u00f6nbelle\u011fe al\u0131r. Bu \u00f6nbellekleme mekanizmas\u0131n\u0131 ak\u0131ll\u0131ca kullanarak build s\u00fcrelerini k\u0131saltabilirsiniz. <code>package.json<\/code> (Node.js), <code>requirements.txt<\/code> (Python) veya <code>pom.xml<\/code> (Java) gibi ba\u011f\u0131ml\u0131l\u0131k tan\u0131mlama dosyalar\u0131n\u0131, kaynak kodunuzdan *\u00f6nce* kopyalay\u0131n ve ba\u011f\u0131ml\u0131l\u0131k kurulum komutunu \u00e7al\u0131\u015ft\u0131r\u0131n. B\u00f6ylece, yaln\u0131zca ba\u011f\u0131ml\u0131l\u0131k dosyalar\u0131nda bir de\u011fi\u015fiklik oldu\u011funda ba\u011f\u0131ml\u0131l\u0131k kurulum katman\u0131 yeniden \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r. Uygulama kodunuzda yap\u0131lan s\u0131k de\u011fi\u015fiklikler, ba\u011f\u0131ml\u0131l\u0131k kurulumunu tetiklemeyece\u011fi i\u00e7in daha h\u0131zl\u0131 build'ler elde edersiniz.<\/p>\n<pre><code>\n# Yanl\u0131\u015f s\u0131ralama: Kod de\u011fi\u015fti\u011finde ba\u011f\u0131ml\u0131l\u0131klar her seferinde yeniden kurulur\nCOPY . .\nRUN npm install\n\n# Do\u011fru s\u0131ralama: Sadece package.json de\u011fi\u015fti\u011finde ba\u011f\u0131ml\u0131l\u0131klar yeniden kurulur\nCOPY package*.json .\/\nRUN npm install\nCOPY . .\n<\/pre>\n<p><\/code><\/p>\n<h4>Gereksiz Dosyalar\u0131 Temizleyin (Cleaning Up Unnecessary Files)<\/h4>\n<p>*   <strong><code>.dockerignore<\/code> Dosyas\u0131:<\/strong> <code>.gitignore<\/code> dosyas\u0131na benzer \u015fekilde, <code>.dockerignore<\/code> dosyas\u0131 da Docker imaj\u0131na dahil edilmemesi gereken dosya ve klas\u00f6rleri belirtir. <code>.git<\/code>, <code>node_modules<\/code> (build a\u015famas\u0131nda), <code>target<\/code>, IDE dosyalar\u0131, log dosyalar\u0131 gibi \u00f6\u011feleri bu dosyaya eklemek, hem build s\u00fcresini h\u0131zland\u0131r\u0131r hem de imaj boyutunu k\u00fc\u00e7\u00fclt\u00fcr.<br \/>\n*   <strong>Ge\u00e7ici Dosyalar\u0131 Kald\u0131rma:<\/strong> Build a\u015famas\u0131n\u0131n sonunda, <code>rm -rf \/var\/cache\/apk\/*<\/code> (Alpine i\u00e7in) veya <code>apt-get clean && rm -rf \/var\/lib\/apt\/lists\/*<\/code> (Debian\/Ubuntu i\u00e7in) gibi komutlarla ge\u00e7ici paket y\u00f6neticisi \u00f6nbelleklerini temizlemeyi unutmay\u0131n. Benzer \u015fekilde, <code>npm cache clean --force<\/code> (Node.js) gibi komutlarla dil bazl\u0131 paket y\u00f6neticisi \u00f6nbelleklerini de temizleyebilirsiniz.<\/p>\n<h4>G\u00fcvenlik Katman\u0131n\u0131 Art\u0131r\u0131n (Security Layer)<\/h4>\n<p>Daha k\u00fc\u00e7\u00fck imajlar, genellikle daha az paket ve ba\u011f\u0131ml\u0131l\u0131k i\u00e7erir. Bu da imaj\u0131n\u0131zdaki potansiyel g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131n say\u0131s\u0131n\u0131 do\u011frudan azalt\u0131r. Daha az yaz\u0131l\u0131m demek, daha az CVE (Common Vulnerabilities and Exposures) demektir. Ayr\u0131ca, <code>USER<\/code> komutuyla imaj i\u00e7inde <code>root<\/code> d\u0131\u015f\u0131 bir kullan\u0131c\u0131 olu\u015fturmak ve uygulamay\u0131 bu kullan\u0131c\u0131yla \u00e7al\u0131\u015ft\u0131rmak, bir sald\u0131r\u0131 durumunda yetki y\u00fckseltme riskini azalt\u0131r.<\/p>\n<h4>\u00c7oklu Mimariler i\u00e7in \u00c7ok Katmanl\u0131 Yap\u0131lar (Multi-Arch Multi-Stage Builds)<\/h4>\n<p>E\u011fer uygulaman\u0131z\u0131 farkl\u0131 i\u015flemci mimarilerinde (\u00f6rne\u011fin <code>amd64<\/code> ve <code>arm64<\/code>) \u00e7al\u0131\u015ft\u0131rman\u0131z gerekiyorsa, Docker Buildx gibi ara\u00e7larla \u00e7ok mimarili imajlar olu\u015fturabilirsiniz. \u00c7ok katmanl\u0131 yap\u0131lar bu senaryoda da devreye girer, \u00e7\u00fcnk\u00fc her mimari i\u00e7in optimize edilmi\u015f bir build ve runtime a\u015famas\u0131 tan\u0131mlaman\u0131za olanak tan\u0131r, b\u00f6ylece her mimari i\u00e7in en verimli imajlar\u0131 elde edersiniz.<\/p>\n<p>Bu ipu\u00e7lar\u0131 ve en iyi uygulamalar, Docker imajlar\u0131n\u0131z\u0131 daha da rafine etmenize ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizden maksimum verim alman\u0131za yard\u0131mc\u0131 olacakt\u0131r. Konteynerle\u015ftirmede verimlilik, sadece h\u0131zl\u0131 da\u011f\u0131t\u0131m de\u011fil, ayn\u0131 zamanda g\u00fcvenli, maliyet etkin ve s\u00fcrd\u00fcr\u00fclebilir bir altyap\u0131 anlam\u0131na gelir.<\/p>\n<aside class=\"interactive-tip\">\n  Uzman \u0130pucu: \u00c7ok katmanl\u0131 yap\u0131larda, <code>COPY --from<\/code> komutunu kullan\u0131rken sadece ger\u00e7ekten gerekli olan dizin ve dosyalar\u0131 kopyalamaya \u00f6zen g\u00f6sterin. T\u00fcm bir <code>WORKDIR<\/code>'i kopyalamak yerine, alt dizinleri veya belirli dosyalar\u0131 se\u00e7erek gereksiz verinin s\u0131zmas\u0131n\u0131 engelleyebilirsiniz. Bu, imaj boyutunu mikroskobik d\u00fczeyde daha da optimize edebilir.<br \/>\n<\/aside>\n<h3>Mobil Uyumlu HTML ve Dockerfile Optimizasyonu \u0130li\u015fkisi<\/h3>\n<p>Ba\u015flang\u0131\u00e7ta bu ba\u015fl\u0131k biraz alakas\u0131z gibi g\u00f6r\u00fcnebilir, \u00e7\u00fcnk\u00fc Dockerfile optimizasyonu genellikle backend uygulamalar\u0131 ve konteyner altyap\u0131s\u0131yla ili\u015fkilendirilirken, mobil uyumlu HTML daha \u00e7ok frontend geli\u015ftirme ve kullan\u0131c\u0131 deneyimi alan\u0131na girer. Ancak, modern web geli\u015ftirme s\u00fcre\u00e7leri ve da\u011f\u0131t\u0131m modelleri d\u00fc\u015f\u00fcn\u00fcld\u00fc\u011f\u00fcnde, Dockerfile optimizasyonu ile mobil uyumlu HTML'in dolayl\u0131 ama \u00f6nemli bir ili\u015fkisi bulunmaktad\u0131r. Asl\u0131nda, optimize edilmi\u015f Docker imajlar\u0131, herhangi bir web uygulamas\u0131n\u0131n, dolay\u0131s\u0131yla mobil uyumlu HTML i\u00e7eri\u011finin, daha h\u0131zl\u0131 ve g\u00fcvenilir bir \u015fekilde son kullan\u0131c\u0131lara ula\u015ft\u0131r\u0131lmas\u0131nda kritik bir rol oynar.<\/p>\n<p>Bir web uygulamas\u0131n\u0131n mobil uyumlu (responsive) olmas\u0131, farkl\u0131 ekran boyutlar\u0131na (telefon, tablet, masa\u00fcst\u00fc) otomatik olarak adapte olabilen bir kullan\u0131c\u0131 aray\u00fcz\u00fcne sahip olmas\u0131 demektir. Bu t\u00fcr uygulamalar genellikle HTML, CSS ve JavaScript kullan\u0131larak geli\u015ftirilir ve derleme (build) a\u015famas\u0131ndan sonra statik dosyalar olarak bir web sunucusu (\u00f6rne\u011fin Nginx veya Apache) arac\u0131l\u0131\u011f\u0131yla sunulur. E\u011fer bu statik dosyalar\u0131 sunan web sunucusu bir Docker konteyneri i\u00e7inde \u00e7al\u0131\u015f\u0131yorsa, Dockerfile optimizasyonu do\u011frudan devreye girer.<\/p>\n<p><strong>Performans ve Da\u011f\u0131t\u0131m H\u0131z\u0131:<\/strong> Optimize edilmi\u015f bir Dockerfile ile olu\u015fturulan k\u00fc\u00e7\u00fck imajlar, CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m) boru hatlar\u0131nda daha h\u0131zl\u0131 hareket eder. Daha h\u0131zl\u0131 build s\u00fcreleri, daha h\u0131zl\u0131 imaj push\/pull i\u015flemleri, uygulaman\u0131n yeni s\u00fcr\u00fcmlerinin (veya mobil uyumlu tasar\u0131m g\u00fcncellemelerinin) \u00fcretim ortam\u0131na \u00e7ok daha \u00e7abuk ula\u015fmas\u0131n\u0131 sa\u011flar. Kullan\u0131c\u0131 deneyimini iyile\u015ftiren veya kritik bir hatay\u0131 gideren mobil uyumlu bir aray\u00fcz g\u00fcncellemesi, k\u00fc\u00e7\u00fck ve optimize edilmi\u015f bir Docker imaj\u0131 sayesinde dakikalar i\u00e7inde canl\u0131ya al\u0131nabilir. Bu h\u0131z, i\u015fletmelerin pazardaki de\u011fi\u015fimlere daha \u00e7abuk adapte olmas\u0131n\u0131 ve kullan\u0131c\u0131lar\u0131n beklentilerini kar\u015f\u0131lamas\u0131n\u0131 sa\u011flar.<\/p>\n<p><strong>Kaynak T\u00fcketimi ve Maliyet Verimlili\u011fi:<\/strong> Daha k\u00fc\u00e7\u00fck Docker imajlar\u0131, sunucularda daha az depolama alan\u0131 kaplar ve konteyner orkestrasyon platformlar\u0131 (Kubernetes gibi) \u00fczerinde daha az a\u011f bant geni\u015fli\u011fi t\u00fcketir. Bu, \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli altyap\u0131larda veya bulut ortamlar\u0131nda, operasyonel maliyetlerin d\u00fc\u015f\u00fcr\u00fclmesine yard\u0131mc\u0131 olur. Mobil uyumlu web siteleri, d\u00fcnya genelindeki geni\u015f bir kullan\u0131c\u0131 kitlesine hizmet verdi\u011finde, bu maliyet optimizasyonu b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Daha k\u00fc\u00e7\u00fck imajlar, ayn\u0131 donan\u0131m \u00fczerinde daha fazla konteyner \u00e7al\u0131\u015ft\u0131r\u0131labilmesine olanak tan\u0131r, bu da kaynak kullan\u0131m\u0131n\u0131 maksimize eder.<\/p>\n<p><strong>G\u00fcvenlik:<\/strong> Daha \u00f6nce de belirtildi\u011fi gibi, optimize edilmi\u015f imajlar daha az ba\u011f\u0131ml\u0131l\u0131k ve yaz\u0131l\u0131m i\u00e7erir, bu da sald\u0131r\u0131 y\u00fczeyini k\u00fc\u00e7\u00fclt\u00fcr. Mobil uyumlu web uygulamalar\u0131 da birer web uygulamas\u0131d\u0131r ve g\u00fcvenlik a\u00e7\u0131klar\u0131na kar\u015f\u0131 hassast\u0131r. G\u00fcvenli bir Docker imaj\u0131nda \u00e7al\u0131\u015fan bir frontend uygulamas\u0131, potansiyel sald\u0131r\u0131lara kar\u015f\u0131 daha diren\u00e7li olacakt\u0131r.<\/p>\n<p><strong>\u00d6rnek bir Mobil Uyumlu HTML\/CSS Yap\u0131s\u0131:<\/strong><br \/>\nDockerfile optimizasyonu do\u011frudan HTML\/CSS yaz\u0131m\u0131n\u0131 etkilemezken, yukar\u0131da bahsedilen <code>nginx:alpine<\/code> tabanl\u0131 bir frontend Docker imaj\u0131, a\u015fa\u011f\u0131daki gibi mobil uyumlu bir HTML ve CSS i\u00e7eri\u011fini h\u0131zla ve verimli bir \u015fekilde sunmak i\u00e7in kullan\u0131labilir:<\/p>\n<pre><code>\n<!DOCTYPE html>\n<html lang=\"tr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Mobil Uyumlu Sayfa \u00d6rne\u011fi<\/title>\n    <style>\n        body {\n            font-family: Arial, sans-serif;\n            margin: 0;\n            padding: 0;\n            background-color: #f4f4f4;\n            color: #333;\n        }\n        .container {\n            width: 95%;\n            margin: 20px auto;\n            padding: 20px;\n            background-color: #fff;\n            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);\n            border-radius: 8px;\n        }\n        h2 {\n            color: #0056b3;\n            text-align: center;\n        }\n        p {\n            line-height: 1.6;\n        }\n\n        \/* Mobil Cihazlar (Varsay\u0131lan) *\/\n        @media (max-width: 576px) {\n            .container {\n                width: 100%;\n                margin: 0;\n                padding: 15px;\n                border-radius: 0;\n            }\n            h2 {\n                font-size: 1.5em;\n            }\n        }\n\n        \/* Tabletler *\/\n        @media (min-width: 577px) and (max-width: 991px) {\n            .container {\n                width: 80%;\n                padding: 30px;\n            }\n            h2 {\n                font-size: 2em;\n            }\n        }\n\n        \/* Masa\u00fcst\u00fc *\/\n        @media (min-width: 992px) {\n            .container {\n                width: 70%;\n                max-width: 960px;\n                padding: 40px;\n            }\n            h2 {\n                font-size: 2.5em;\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"container\">\n        <h2>Bu Bir Mobil Uyumlu Web Sayfas\u0131d\u0131r<\/h2>\n        <p>Bu sayfa, farkl\u0131 ekran boyutlar\u0131na ve cihazlara otomatik olarak adapte olacak \u015fekilde tasarlanm\u0131\u015ft\u0131r. CSS'teki medya sorgular\u0131 sayesinde, i\u00e7eri\u011fin d\u00fczeni ve boyutlar\u0131, kulland\u0131\u011f\u0131n\u0131z cihaza g\u00f6re dinamik olarak ayarlan\u0131r. Amac\u0131m\u0131z, t\u00fcm kullan\u0131c\u0131lar i\u00e7in en iyi g\u00f6r\u00fcnt\u00fcleme deneyimini sa\u011flamakt\u0131r.<\/p>\n        <p>Dockerfile optimizasyonu sayesinde, bu ve benzeri mobil uyumlu web uygulamalar\u0131, geli\u015ftirme ortam\u0131ndan \u00fcretim ortam\u0131na \u00e7ok daha h\u0131zl\u0131, g\u00fcvenli ve maliyet etkin bir \u015fekilde ta\u015f\u0131nabilir. Konteyner imaj\u0131 ne kadar k\u00fc\u00e7\u00fck olursa, da\u011f\u0131t\u0131m s\u00fcre\u00e7leri o kadar verimli olur.<\/p>\n    <\/div>\n<\/body>\n<\/html>\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte g\u00f6sterildi\u011fi gibi, mobil uyumlu bir web sayfas\u0131, CSS medya sorgular\u0131 (<code>@media<\/code>) kullan\u0131larak farkl\u0131 ekran boyutlar\u0131na adapte olur. Bu HTML\/CSS i\u00e7eri\u011fi, optimize edilmi\u015f bir <code>nginx:alpine<\/code> Docker imaj\u0131 i\u00e7inde \u00e7al\u0131\u015ft\u0131\u011f\u0131nda, h\u0131zl\u0131 y\u00fckleme s\u00fcreleri ve g\u00fcvenli bir da\u011f\u0131t\u0131m ortam\u0131 sayesinde son kullan\u0131c\u0131lara kesintisiz bir deneyim sunulur. Dolay\u0131s\u0131yla, Dockerfile optimizasyonu, sadece altyap\u0131 m\u00fchendislerinin bir meselesi olmaktan \u00e7\u0131k\u0131p, son kullan\u0131c\u0131n\u0131n kar\u015f\u0131la\u015ft\u0131\u011f\u0131 \u00fcr\u00fcn performans\u0131na do\u011frudan etki eden \u00f6nemli bir fakt\u00f6r haline gelir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makale boyunca, \u00e7ok katmanl\u0131 Docker yap\u0131lar\u0131n\u0131n g\u00fcc\u00fcn\u00fc ve bunlar\u0131n Docker imaj boyutlar\u0131n\u0131 nas\u0131l dramatik bir \u015fekilde k\u00fc\u00e7\u00fcltt\u00fc\u011f\u00fcn\u00fc detayl\u0131 bir \u015fekilde inceledik. Geleneksel tek katmanl\u0131 yakla\u015f\u0131mlar\u0131n getirdi\u011fi gereksiz \u015fi\u015fkinli\u011fin aksine, \u00e7ok katmanl\u0131 yap\u0131lar, uygulaman\u0131z\u0131n derleme ve \u00e7al\u0131\u015fma zaman\u0131 ortamlar\u0131n\u0131 ay\u0131rarak yaln\u0131zca gerekli olan ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve derlenmi\u015f \u00e7\u0131kt\u0131lar\u0131 nihai imaja dahil eder. Bu sayede, Node.js gibi pop\u00fcler bir teknolojiyle bile %50 veya daha y\u00fcksek oranlarda boyut k\u00fc\u00e7\u00fclmesi elde etmenin m\u00fcmk\u00fcn oldu\u011funu g\u00f6rd\u00fck.<\/p>\n<p>Daha k\u00fc\u00e7\u00fck imajlar; daha h\u0131zl\u0131 CI\/CD boru hatlar\u0131, daha d\u00fc\u015f\u00fck depolama ve a\u011f maliyetleri, daha h\u0131zl\u0131 da\u011f\u0131t\u0131m s\u00fcreleri ve en \u00f6nemlisi, daha az sald\u0131r\u0131 y\u00fczeyi sayesinde art\u0131r\u0131lm\u0131\u015f g\u00fcvenlik gibi pek \u00e7ok avantaj\u0131 beraberinde getirir. Go'nun statik derlenmi\u015f ikililerinden Java'n\u0131n karma\u015f\u0131k Maven\/Gradle build'lerine, Python'\u0131n sanal ortamlar\u0131ndan modern frontend uygulamalar\u0131n\u0131n Nginx ile sunulmas\u0131na kadar, \u00e7ok katmanl\u0131 yap\u0131lar farkl\u0131 teknoloji y\u0131\u011f\u0131nlar\u0131nda esnek ve etkili \u00e7\u00f6z\u00fcmler sunar. Ayr\u0131ca, <code>.dockerignore<\/code> kullan\u0131m\u0131, do\u011fru katman s\u0131ralamas\u0131 ve minimum temel imajlar\u0131n se\u00e7imi gibi ileri d\u00fczey optimizasyon ipu\u00e7lar\u0131yla bu verimlili\u011fi daha da art\u0131rman\u0131n yollar\u0131n\u0131 ke\u015ffettik. Mobil uyumlu web uygulamalar\u0131n\u0131n h\u0131zl\u0131 ve verimli bir \u015fekilde sunulmas\u0131nda bile, altyap\u0131daki bu optimizasyonun dolayl\u0131 ama kritik bir rol oynad\u0131\u011f\u0131n\u0131 anlam\u0131\u015f olduk. K\u0131sacas\u0131, \u00e7ok katmanl\u0131 Docker yap\u0131lar\u0131, modern konteynerle\u015ftirme stratejisinin temel ta\u015flar\u0131ndan biridir ve her geli\u015ftiricinin ve DevOps m\u00fchendisinin bilgi da\u011farc\u0131\u011f\u0131nda bulunmas\u0131 gereken vazge\u00e7ilmez bir ara\u00e7t\u0131r.<\/p>\n<h4>S\u0131k\u00e7a Sorulan Sorular<\/h4>\n<ul>\n<li>\n        <strong>S: \u00c7ok katmanl\u0131 build her zaman daha m\u0131 iyidir?<\/strong><br \/>\n        <strong>C:<\/strong> \u00c7o\u011fu durumda evet, \u00f6zellikle derleme ad\u0131m\u0131 veya yo\u011fun ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimi gerektiren uygulamalar i\u00e7in \u00e7ok daha verimlidir. Ancak, \u00e7ok basit, ba\u011f\u0131ms\u0131z ve zaten do\u011fal olarak k\u00fc\u00e7\u00fck olan (\u00f6rn. sadece birka\u00e7 sat\u0131r koddan olu\u015fan bir Python scripti) uygulamalar i\u00e7in ek bir karma\u015f\u0131kl\u0131k getirebilir ve faydas\u0131 s\u0131n\u0131rl\u0131 olabilir. Genel olarak, bir imaj boyutu endi\u015fesi varsa, \u00e7ok katmanl\u0131 yap\u0131lar kesinlikle d\u00fc\u015f\u00fcn\u00fclmelidir.\n    <\/li>\n<li>\n        <strong>S: Build stage'inde hangi temel imaj\u0131 kullanmal\u0131y\u0131m?<\/strong><br \/>\n        <strong>C:<\/strong> Build stage'inde, uygulaman\u0131z\u0131n derleme ara\u00e7lar\u0131n\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kurmak i\u00e7in gerekli olan t\u00fcm yaz\u0131l\u0131mlar\u0131 i\u00e7eren bir temel imaj kullanmal\u0131s\u0131n\u0131z. \u00d6rne\u011fin, Node.js i\u00e7in <code>node:16<\/code> veya <code>node:16-alpine<\/code>, Java i\u00e7in <code>maven:3-jdk-11<\/code> veya <code>gradle:7-jdk11<\/code>, Go i\u00e7in <code>golang:1.18<\/code> gibi imajlar uygundur. Bu imajlar genellikle biraz daha b\u00fcy\u00fckt\u00fcr ancak derleme i\u00e7in gerekli her \u015feye sahiptir.\n    <\/li>\n<li>\n        <strong>S: Production stage'inde hangi temel imaj\u0131 kullanmal\u0131y\u0131m?<\/strong><br \/>\n        <strong>C:<\/strong> Production stage'inde, uygulaman\u0131z\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in minimum ba\u011f\u0131ml\u0131l\u0131klar\u0131 olan, m\u00fcmk\u00fcn olan en hafif imaj\u0131 tercih etmelisiniz. \u00d6rne\u011fin, Node.js i\u00e7in <code>node:16-alpine<\/code>, Java i\u00e7in <code>openjdk:11-jre-slim<\/code> veya <code>eclipse-temurin:11-jre-alpine<\/code>, Go i\u00e7in <code>scratch<\/code> veya <code>alpine<\/code>, Python i\u00e7in <code>python:3.9-slim-buster<\/code> veya <code>python:3.9-alpine<\/code>, frontend uygulamalar\u0131 i\u00e7in <code>nginx:alpine<\/code> ideal se\u00e7eneklerdir. Ama\u00e7, sadece \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131n\u0131 sa\u011flamak ve gereksiz her \u015feyi d\u0131\u015far\u0131da b\u0131rakmakt\u0131r.\n    <\/li>\n<li>\n        <strong>S: <code>.dockerignore<\/code> dosyas\u0131n\u0131n \u00f6nemi nedir?<\/strong><br \/>\n        <strong>C:<\/strong> <code>.dockerignore<\/code> dosyas\u0131, Docker'\u0131n build ba\u011flam\u0131na g\u00f6nderilmemesi gereken dosya ve klas\u00f6rleri belirtir. Bu dosya, gereksiz verilerin (\u00f6rn. <code>.git<\/code> klas\u00f6r\u00fc, ge\u00e7ici dosyalar, IDE ayarlar\u0131, <code>node_modules<\/code> klas\u00f6r\u00fc (build stage'inde), <code>target<\/code> klas\u00f6r\u00fc) imaja eklenmesini engelleyerek hem build s\u00fcresini h\u0131zland\u0131r\u0131r hem de nihai imaj boyutunu daha da k\u00fc\u00e7\u00fclt\u00fcr. Optimal bir <code>.dockerignore<\/code> dosyas\u0131, her zaman Dockerfile optimizasyonunun \u00f6nemli bir par\u00e7as\u0131d\u0131r.\n    <\/li>\n<li>\n        <strong>S: Docker imaj\u0131m\u0131n boyutunu nas\u0131l kontrol edebilirim?<\/strong><br \/>\n        <strong>C:<\/strong> Olu\u015fturdu\u011funuz Docker imajlar\u0131n\u0131n boyutlar\u0131n\u0131 kontrol etmek i\u00e7in <code>docker images<\/code> komutunu kullanabilirsiniz. Bu komut, yerel sisteminizdeki t\u00fcm imajlar\u0131, tag'lerini ve boyutlar\u0131n\u0131 (SIZE s\u00fctunu) listeler. Daha detayl\u0131 katman baz\u0131nda inceleme yapmak i\u00e7in <code>docker history <image_id_or_name><\/code> komutunu kullanabilirsiniz. Bu komut, bir imaj\u0131n nas\u0131l olu\u015fturuldu\u011funu ve her bir katman\u0131n boyutunu g\u00f6sterir, b\u00f6ylece en \u00e7ok yer kaplayan katmanlar\u0131 belirlemenize yard\u0131mc\u0131 olur.\n    <\/li>\n<\/ul>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Geli\u015ftirme d\u00fcnyas\u0131nda, uygulamalar\u0131 paketlemek ve da\u011f\u0131tmak i\u00e7in Docker konteynerleri art\u0131k vazge\u00e7ilmez bir ara\u00e7 haline geldi. Ancak, \u00e7o\u011fu zaman&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-33471","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>One Dockerfile, Two Stages: A 50% Size Reduction Story<\/title>\n<meta name=\"description\" content=\"Hi\u00e7bir etiketi bulunamad\u0131.\" \/>\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\/one-dockerfile-two-stages-a-50-size-reduction-story\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"One Dockerfile, Two Stages: A 50% Size Reduction Story\" \/>\n<meta property=\"og:description\" content=\"Hi\u00e7bir etiketi bulunamad\u0131.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/one-dockerfile-two-stages-a-50-size-reduction-story\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-03T05:01:21+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=\"25 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/one-dockerfile-two-stages-a-50-size-reduction-story\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/one-dockerfile-two-stages-a-50-size-reduction-story\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"One Dockerfile, Two Stages: A 50% Size Reduction Story\",\"datePublished\":\"2025-11-03T05:01:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/one-dockerfile-two-stages-a-50-size-reduction-story\/\"},\"wordCount\":4425,\"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\/one-dockerfile-two-stages-a-50-size-reduction-story\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/one-dockerfile-two-stages-a-50-size-reduction-story\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/one-dockerfile-two-stages-a-50-size-reduction-story\/\",\"name\":\"One Dockerfile, Two Stages: A 50% Size Reduction Story\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-03T05:01:21+00:00\",\"description\":\"Hi\u00e7bir etiketi bulunamad\u0131.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/one-dockerfile-two-stages-a-50-size-reduction-story\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/one-dockerfile-two-stages-a-50-size-reduction-story\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/one-dockerfile-two-stages-a-50-size-reduction-story\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"One Dockerfile, Two Stages: A 50% Size Reduction Story\"}]},{\"@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":"One Dockerfile, Two Stages: A 50% Size Reduction Story","description":"Hi\u00e7bir etiketi bulunamad\u0131.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/one-dockerfile-two-stages-a-50-size-reduction-story\/","og_locale":"tr_TR","og_type":"article","og_title":"One Dockerfile, Two Stages: A 50% Size Reduction Story","og_description":"Hi\u00e7bir etiketi bulunamad\u0131.","og_url":"https:\/\/fatihsoysal.com\/blog\/one-dockerfile-two-stages-a-50-size-reduction-story\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-03T05:01:21+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"25 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/one-dockerfile-two-stages-a-50-size-reduction-story\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/one-dockerfile-two-stages-a-50-size-reduction-story\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"One Dockerfile, Two Stages: A 50% Size Reduction Story","datePublished":"2025-11-03T05:01:21+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/one-dockerfile-two-stages-a-50-size-reduction-story\/"},"wordCount":4425,"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\/one-dockerfile-two-stages-a-50-size-reduction-story\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/one-dockerfile-two-stages-a-50-size-reduction-story\/","url":"https:\/\/fatihsoysal.com\/blog\/one-dockerfile-two-stages-a-50-size-reduction-story\/","name":"One Dockerfile, Two Stages: A 50% Size Reduction Story","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-03T05:01:21+00:00","description":"Hi\u00e7bir etiketi bulunamad\u0131.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/one-dockerfile-two-stages-a-50-size-reduction-story\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/one-dockerfile-two-stages-a-50-size-reduction-story\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/one-dockerfile-two-stages-a-50-size-reduction-story\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"One Dockerfile, Two Stages: A 50% Size Reduction Story"}]},{"@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\/33471","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=33471"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33471\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33471"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33471"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33471"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}