{"id":280,"date":"2026-08-28T12:00:00","date_gmt":"2026-08-28T12:00:00","guid":{"rendered":"https:\/\/konteynerium.com\/?p=220"},"modified":"2026-10-06T11:34:00","modified_gmt":"2026-10-06T11:34:00","slug":"multi-arch-build-arm-x86-destegi-buildx","status":"publish","type":"post","link":"https:\/\/konteynerium.com\/index.php\/2026\/08\/28\/multi-arch-build-arm-x86-destegi-buildx\/","title":{"rendered":"Multi-Arch Build: Tek \u0130majla ARM ve x86 Deste\u011fi (Buildx)"},"content":{"rendered":"<p>Apple Silicon Mac&#8217;ler (M1\/M2\/M3), AWS Graviton sunucular\u0131 ve Raspberry Pi gibi cihazlar\u0131n yayg\u0131nla\u015fmas\u0131yla, art\u0131k t\u00fcm d\u00fcnya x86_64 (Intel\/AMD) mimarisinde \u00e7al\u0131\u015fm\u0131yor \u2014 ARM64 de g\u00fcndelik bir ger\u00e7ek. Bir imaj\u0131 sadece tek bir mimari i\u00e7in build ederseniz, di\u011fer mimaride \u00e7al\u0131\u015fan bir makinede o imaj ya hi\u00e7 \u00e7al\u0131\u015fmaz ya da yava\u015f bir em\u00fclasyon katman\u0131 \u00fczerinden \u00e7al\u0131\u015f\u0131r. <strong>Multi-arch build<\/strong>, ayn\u0131 imaj etiketinin birden fazla mimari i\u00e7in otomatik olarak do\u011fru s\u00fcr\u00fcm\u00fc sunmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Sorunu somutla\u015ft\u0131ral\u0131m<\/h2>\n<p>Bir imaj\u0131 Intel tabanl\u0131 bir CI sunucusunda build edip Docker Hub&#8217;a g\u00f6nderdi\u011finizde, o imaj sadece <code>linux\/amd64<\/code> mimarisi i\u00e7in \u00fcretilmi\u015ftir. Bu imaj\u0131 bir M-serisi Mac&#8217;te veya bir ARM sunucusunda \u00e7al\u0131\u015ft\u0131rmaya \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131zda Docker, QEMU tabanl\u0131 bir em\u00fclasyon katman\u0131na d\u00fc\u015fer \u2014 \u00e7al\u0131\u015f\u0131r ama belirgin \u015fekilde yava\u015ft\u0131r, baz\u0131 durumlarda hi\u00e7 \u00e7al\u0131\u015fmaz.<\/p>\n<h2>Docker Buildx: \u00e7oklu mimari i\u00e7in resmi ara\u00e7<\/h2>\n<p>Docker Buildx, g\u00fcncel Docker s\u00fcr\u00fcmlerinde yerle\u015fik gelir ve tek bir komutla birden fazla mimari i\u00e7in build yap\u0131p bunlar\u0131 tek bir &#8220;manifest listesi&#8221; alt\u0131nda birle\u015ftirir:<\/p>\n<pre><code># Buildx'in QEMU tabanl\u0131 em\u00fclat\u00f6rlerini bir kerelik kurun\ndocker run --privileged --rm tonistiigi\/binfmt --install all\n\n# \u00c7oklu platform destekleyen bir builder olu\u015fturun ve kullan\u0131n\ndocker buildx create --name coklu-mimari --use\ndocker buildx inspect --bootstrap\n\n# amd64 ve arm64 i\u00e7in ayn\u0131 anda build edip do\u011frudan push edin\ndocker buildx build \\\n  --platform linux\/amd64,linux\/arm64 \\\n  -t kullanici-adi\/benim-api:1.0 \\\n  --push .<\/code><\/pre>\n<p>Bu komut \u00e7al\u0131\u015ft\u0131\u011f\u0131nda Docker Hub&#8217;da <code>kullanici-adi\/benim-api:1.0<\/code> etiketinin alt\u0131nda asl\u0131nda <strong>iki farkl\u0131 imaj<\/strong> yay\u0131nlan\u0131r (biri amd64, biri arm64) ve bunlar\u0131 tek bir &#8220;manifest listesi&#8221; birbirine ba\u011flar. Birisi <code>docker pull kullanici-adi\/benim-api:1.0<\/code> dedi\u011finde, Docker istemcisi otomatik olarak <strong>kendi mimarisine uygun<\/strong> s\u00fcr\u00fcm\u00fc indirir \u2014 kullan\u0131c\u0131 hangi mimarinin \u00e7ekildi\u011fini bilmesine bile gerek kalmaz.<\/p>\n<div class=\"callout\">\n  <span class=\"glyph\">i<\/span><\/p>\n<p><code>--push<\/code> bayra\u011f\u0131 zorunludur \u00e7\u00fcnk\u00fc \u00e7oklu platform manifest listeleri yerel Docker imaj deposunda (<code>docker images<\/code>) tam olarak saklanamaz \u2014 do\u011frudan bir registry&#8217;ye g\u00f6nderilmeleri gerekir. Sadece yerelde test etmek isterseniz tek seferde tek bir platform i\u00e7in <code>--load<\/code> bayra\u011f\u0131n\u0131 kullanabilirsiniz.<\/p>\n<\/div>\n<h2>GitHub Actions&#8217;ta multi-arch build<\/h2>\n<pre><code>- name: QEMU kur\n  uses: docker\/setup-qemu-action@v3\n\n- name: Buildx kur\n  uses: docker\/setup-buildx-action@v3\n\n- name: \u00c7oklu mimari build ve push\n  uses: docker\/build-push-action@v5\n  with:\n    context: .\n    platforms: linux\/amd64,linux\/arm64\n    push: true\n    tags: kullanici-adi\/benim-api:latest<\/code><\/pre>\n<h2>Her imaj multi-arch olmal\u0131 m\u0131?<\/h2>\n<p>Hay\u0131r \u2014 baz\u0131 durumlarda gerek yoktur:<\/p>\n<ul>\n<li>Uygulaman\u0131z sadece belirli, bilinen bir mimaride (\u00f6rn. \u015firket i\u00e7i tek tip x86_64 sunucular) \u00e7al\u0131\u015facaksa ekstra karma\u015f\u0131kl\u0131\u011fa gerek yok.<\/li>\n<li>Build s\u00fcresi kritikse: iki mimari i\u00e7in build etmek, tek mimari build etmekten belirgin \u015fekilde daha uzun s\u00fcrer (QEMU em\u00fclasyonu build s\u0131ras\u0131nda da devreye girer, \u00f6zellikle derleme gerektiren dillerde).<\/li>\n<\/ul>\n<p>Buna kar\u015f\u0131l\u0131k, a\u00e7\u0131k kaynak bir imaj yay\u0131nl\u0131yorsan\u0131z, ekibinizde hem Intel\/AMD hem Apple Silicon Mac kullanan geli\u015ftiriciler varsa, veya ARM tabanl\u0131 bulut sunucular\u0131na (maliyet avantaj\u0131 i\u00e7in giderek daha pop\u00fcler) deploy ediyorsan\u0131z multi-arch build neredeyse zorunlu hale gelir.<\/p>\n<h2>Dockerfile&#8217;da mimariye \u00f6zg\u00fc davran\u0131\u015f gerekiyorsa<\/h2>\n<p>Baz\u0131 build ad\u0131mlar\u0131 mimariye g\u00f6re farkl\u0131la\u015fabilir (\u00f6rn. farkl\u0131 bir binary indirmek). Buildx, bunun i\u00e7in otomatik olarak <code>TARGETARCH<\/code> gibi build arg\u00fcmanlar\u0131n\u0131 sa\u011flar:<\/p>\n<pre><code>FROM alpine:3.20\nARG TARGETARCH\nRUN echo \"Bu imaj \u015fu mimari i\u00e7in build ediliyor: $TARGETARCH\"\n# TARGETARCH de\u011feri: amd64, arm64 vb. \u2014 buildx taraf\u0131ndan otomatik doldurulur<\/code><\/pre>\n<p>\u0130maj\u0131n\u0131z art\u0131k farkl\u0131 donan\u0131m mimarilerinde de sorunsuz ve h\u0131zl\u0131 \u00e7al\u0131\u015f\u0131yor. \u015eimdi \u00f6\u011frendi\u011fimiz t\u00fcm par\u00e7alar\u0131 (build, volume, network, registry, CI\/CD, izleme, multi-arch) bir araya getirip u\u00e7tan uca ger\u00e7ek bir projeyi s\u0131f\u0131rdan production&#8217;a ta\u015f\u0131yal\u0131m \u2014 bunu bir sonraki, seri sonu yaz\u0131m\u0131zda yap\u0131yoruz.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Apple Silicon ve ARM tabanl\u0131 bulut sunucular\u0131 yayg\u0131nla\u015ft\u0131k\u00e7a neden tek mimarili imajlar yetmez oldu; Docker Buildx ile tek etiket alt\u0131nda amd64 ve arm64&#8217;\u00fc ayn\u0131 anda nas\u0131l yay\u0131nlars\u0131n\u0131z.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"seviye":[9],"class_list":["post-280","post","type-post","status-publish","format-standard","hentry","category-production-uygulamalar","seviye-ileri"],"_links":{"self":[{"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/posts\/280","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/comments?post=280"}],"version-history":[{"count":1,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/posts\/280\/revisions"}],"predecessor-version":[{"id":579,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/posts\/280\/revisions\/579"}],"wp:attachment":[{"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/media?parent=280"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/categories?post=280"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/tags?post=280"},{"taxonomy":"seviye","embeddable":true,"href":"https:\/\/konteynerium.com\/index.php\/wp-json\/wp\/v2\/seviye?post=280"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}