Lewati ke konten utama

Docker Buildx: Cara Membangun Citra Kontainer Multi-Platform

Pelajari bagaimana Docker Buildx memperluas build kontainer tradisional dengan dukungan multi-platform, strategi caching tingkat lanjut, dan optimalisasi performa. Panduan ini mencakup segala hal dari konsep dasar hingga teknik lanjutan.
· 14 mnt Baca

Jelajahi bersama AI

Membangun kontainer untuk banyak platform terdengar menakutkan dan memakan waktu, tetapi Anda akan segera melihat bahwa sebenarnya tidak demikian.

Perintah docker buildx menyelesaikan tantangan ini dengan memperluas kemampuan build Docker melalui fitur tingkat lanjut seperti pembuatan citra multi-platform, peningkatan caching, dan pemrosesan build paralel. Perintah ini mengintegrasikan mesin build generasi berikutnya, BuildKit, langsung ke Docker CLI. Dengan perintah buildx, Anda akan membuat citra kontainer yang lebih kecil, lebih cepat, dan lebih aman tanpa perlu mempelajari seperangkat alat yang sepenuhnya baru.

Dalam beberapa tahun terakhir, Buildx menjadi nyaris esensial untuk praktik DevOps terbaik dan pengembangan aplikasi cloud-native. Buildx menyederhanakan pipeline CI/CD dan membantu Anda serta tim mengirimkan aplikasi secara konsisten di berbagai target penerapan, mulai dari perangkat IoT berbasis ARM hingga kumpulan server cloud.

> Baru mengenal Docker? Panduan praktis kami untuk pemula lengkap akan membuat Anda siap dalam waktu singkat.

Dalam artikel ini, saya akan memandu Anda melalui teknik-teknik docker buildx tingkat awal hingga lanjutan.

Memahami Docker Buildx

Kemungkinan Anda sudah menggunakan Docker, jadi Anda mengenal perintah standar docker build. Namun cepat atau lambat, perintah ini akan terasa membatasi, terutama saat proyek Anda menjadi lebih kompleks.

> Docker Buildx mengasumsikan Docker sudah terinstal. Jika belum, dan Anda menjalankan Linux, ikuti panduan ini untuk pemasangan yang mudah.

Docker Buildx memberi Anda pengalaman build yang lebih baik yang sesuai dengan pengetahuan Anda saat ini. Ini bukan alat terpisah yang perlu Anda instal — Buildx sudah dibundel dengan Docker Desktop dan Engine sejak versi 19.03. Buildx menggunakan BuildKit di balik layar, yaitu builder generasi berikutnya dari Docker yang menulis ulang cara citra dibuat. Anda akan merasakan build yang lebih cepat, citra lebih kecil, dan dukungan untuk fitur tambahan.

Lompatan dari docker build ke docker buildx build mungkin terlihat kecil — toh hanya menambah satu kata — namun kemampuan yang Anda dapatkan sangat besar.

Mari jelajahi bagaimana Buildx bekerja dan apa yang membuatnya berbeda dari builder lama.

Fondasi arsitektur Buildx

Keajaiban Buildx berasal dari desain client-server yang cerdas.

Saat Anda menjalankan perintah Buildx, Anda menggunakan Docker CLI sebagai klien yang berkomunikasi dengan daemon BuildKit — komponen server yang menangani pekerjaan berat. Pemisahan ini memungkinkan BuildKit melakukan hal-hal yang tidak bisa dilakukan builder lama, seperti menjalankan tahapan build secara paralel alih-alih berurutan. Instruksi Dockerfile Anda tidak lagi harus dieksekusi satu per satu, yang memangkas waktu build secara signifikan ketika ada tahapan yang saling independen.

Model client-server juga memungkinkan eksekusi build jarak jauh. Anda dapat mengarahkan Docker CLI lokal ke instance BuildKit jarak jauh yang berjalan di mana saja — di server build yang bertenaga, di cloud, atau bahkan di klaster Kubernetes. Fleksibilitas ini berarti Anda tidak perlu menghabiskan sumber daya laptop untuk build besar-besaran atau khawatir tentang masalah kompatibilitas arsitektur.

Desain modular BuildKit juga memungkinkan Anda memasang berbagai parser frontend. Sintaks Dockerfile adalah bawaan, tetapi Anda dapat menggunakan format definisi build alternatif jika lebih cocok dengan alur kerja Anda.

Alur proses build

Saat Anda menjalankan docker buildx build, CLI terlebih dulu memilih instance builder, baik yang bawaan maupun yang Anda tentukan. Konteks build dan Dockerfile Anda dikirim ke daemon BuildKit, yang lalu mem-parsing instruksi dan membuat directed acyclic graph (DAG) dari langkah-langkah build. Berbeda dengan builder lama yang memproses setiap instruksi secara berurutan, BuildKit menganalisis grafik ini untuk menentukan langkah mana yang dapat dijalankan paralel.

Builder kemudian mengeksekusi langkah-langkah ini dengan algoritme caching yang efisien dan jauh lebih cerdas daripada cache berbasis layer lama. BuildKit melacak masukan dan keluaran persis dari setiap langkah, sehingga menghindari rebuild yang tidak perlu ketika tidak ada perubahan relevan. BuildKit juga mendukung pendistribusian build ke beberapa node pekerja untuk pemrosesan yang lebih cepat.

Setelah selesai, Buildx dapat mengekspor hasil dalam berbagai format, tidak hanya sebagai citra Docker. Anda dapat mengekspor ke format OCI, direktori lokal, atau tarball, bahkan melewati pembuatan citra sepenuhnya jika Anda hanya ingin menguji proses build.

Benar — bagian ini jelas akan lebih kuat dengan contoh praktis dan visual untuk menunjukkan bagaimana Buildx bekerja di skenario nyata. Begini cara saya meningkatkannya dengan lebih banyak contoh kode dan saran gambar:

Fungsi Inti dan Fitur

Docker Buildx bukan hanya tentang membangun citra lebih cepat, meski itu memang terjadi. Intinya adalah memperluas kemungkinan pipeline build Anda.

Mari selami fitur-fitur unggulan yang membuat Buildx layak dipertimbangkan untuk proyek berikutnya.

> Mencari ide proyek Docker? 10 ini akan memperkuat portofolio DevOps Anda.

Aplikasi Python yang digunakan

Untuk keperluan artikel ini, saya membuat aplikasi Python Flask sederhana. Untuk mengikutinya, buat 3 berkas — app.py, requirements.txt, dan Dockerfile.

Berikut isi masing-masing:

app.py

from flask import Flask, render_template_string
import platform
import socket
import psutil
import datetime

app = Flask(__name__)


@app.route("/")
def home():
    html = """
    <!DOCTYPE html>
    <html>
      <head>
        <title>Docker Buildx Python Demo</title>
        <style>
          body {
            
            max-width: 800px;
            
            
          }
          .container {
            border: 1px solid #ddd;
            border-radius: 5px;
            
            background-
          }
          .info {
            
          }
          .platform {
            font-weight: bold;
            
          }
        </style>
      </head>
      <body>
        <h1>Docker Buildx Multi-Platform Demo (Python)</h1>
        <div class="container">
          <div class="info">Hostname: {{ hostname }}</div>
          <div class="info">Platform: <span class="platform">{{ os_platform }} ({{ architecture }})</span></div>
          <div class="info">CPUs: {{ cpu_count }}</div>
          <div class="info">Total Memory: {{ memory_mb }} MB</div>
          <div class="info">Server Time: {{ server_time }}</div>
        </div>
      </body>
    </html>
    """
    return render_template_string(
        html,
        hostname=socket.gethostname(),
        os_platform=platform.system(),
        architecture=platform.machine(),
        cpu_count=psutil.cpu_count(),
        memory_mb=round(psutil.virtual_memory().total / (1024 * 1024)),
        server_time=datetime.datetime.now().isoformat(),
    )


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

requirements.txt

flask==3.1.0
psutil==7.0.0

Dockerfile

FROM python:3.13-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY app.py .

EXPOSE 5000

CMD ["python", "app.py"]

Setelah selesai, buka jendela Terminal baru dan arahkan ke folder proyek.

Konstruksi citra multi-platform

Membangun citra yang berjalan di berbagai arsitektur CPU terdengar seperti mimpi buruk, tetapi Buildx membuatnya mengejutkan mudah.

Perhatikan perintah ini:

docker buildx build --platform linux/amd64,linux/arm64 -t myapp:latest .

Gambar 1 - Menggunakan Docker Buildx

Gambar 1 - Menggunakan Docker Buildx

Singkatnya, ini memungkinkan Anda membuat citra untuk beberapa arsitektur secara bersamaan. Buildx menanganinya melalui tiga pendekatan cerdas: menggunakan QEMU untuk emulasi arsitektur (memungkinkan Anda membangun citra ARM di mesin x86), terhubung ke node builder native untuk setiap platform target, atau menggabungkan keduanya untuk kinerja optimal. Hasilnya adalah daftar manifes multi-arsitektur — kadang disebut "fat manifest" — yang memuat varian citra Anda untuk setiap platform.

Jika Anda menerapkan ke lingkungan beragam seperti instance AWS Graviton, klaster Raspberry Pi, atau infrastruktur campuran, dukungan multi-platform ini sangat krusial.

Strategi caching yang ditingkatkan

Buildx sepenuhnya mentransformasi cara kerja caching build dan secara umum mempercepat build Anda.

Sistem ini menerapkan strategi caching tiga lapis yang melampaui caching layer sederhana pada build Docker tradisional:

  1. Inline cache embedding: Pertama, Buildx menggunakan cache inline yang disematkan dalam citra Anda, memungkinkan pemanfaatan layer cache dari build sebelumnya bahkan di lingkungan yang baru.
  2. Local build cache: Kedua, Buildx mendukung cache build lokal yang dikelola cerdas berdasarkan masukan instruksi build, bukan hanya urutannya.
  3. Registry-based caching: Ketiga, Buildx menawarkan caching berbasis registry yang memungkinkan Anda berbagi cache build lintas mesin, ideal untuk pipeline CI/CD atau tim terdistribusi.

Dengan aplikasi Python kita, mari lihat cara menggunakan strategi cache lokal:

# Buat direktori untuk cache lokal
mkdir -p buildx-cache

# Build pertama - ekspor cache ke direktori lokal
docker buildx build --cache-to type=local,dest=./buildx-cache -t myapp:latest .

# Lakukan perubahan kecil pada app.py
echo "# Small comment change" >> app.py

# Build kedua - gunakan cache lokal
docker buildx build --cache-from type=local,src=./buildx-cache -t myapp:latest .

Build kedua akan jauh lebih cepat karena menggunakan ulang layer cache dari build pertama.

Gambar 2 - Strategi caching lokal

Gambar 2 - Strategi caching lokal

Anda juga dapat menggunakan inline caching, yang menyematkan metadata cache di citra itu sendiri:

docker buildx build --cache-to type=inline -t myapp:latest .

Anda dapat mengonfigurasi backend cache ini dengan flag sederhana seperti --cache-to dan --cache-from, yang diarahkan ke direktori lokal, repository registry, atau bahkan layanan cache khusus. Fleksibilitas ini membuat build Anda tetap cepat di berbagai lingkungan tanpa mengorbankan reprodusibilitas.

Fitur keamanan

Buildx menyertakan alat yang akan menyingkirkan kekhawatiran keamanan dari benak Anda.

Misalkan aplikasi Python Anda perlu mengakses API cuaca selama proses build. Alih-alih menaruh hardcode kunci API di Dockerfile, Anda dapat menggunakan build secrets:

# Simpan kunci API Anda di berkas lokal
echo "abc123yourweatherapikey" > ./api_key.txt

# Build dengan secret
docker buildx build --secret id=weather_api_key,src=./api_key.txt -t myapp:latest .

Lalu di Dockerfile, Anda dapat mengakses secret hanya ketika diperlukan:

FROM python:3.13-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
# Buat berkas konfigurasi menggunakan secret saat build
RUN --mount=type=secret,id=weather_api_key \
    echo "WEATHER_API_KEY=$(cat /run/secrets/weather_api_key)" > .env
EXPOSE 5000
CMD ["python", "app.py"]

Anda dapat memverifikasi bahwa kunci API tidak ada di citra akhir dengan memeriksa riwayat citra atau dengan menjalankan:

docker run --rm myapp:latest cat .env

Gambar 3 - Mengelola variabel lingkungan

Gambar 3 - Mengelola variabel lingkungan

Di app.py, Anda bisa memuat kunci API seperti ini:

import os
from dotenv import load_dotenv

load_dotenv()  # Load variables from .env file
api_key = os.getenv("WEATHER_API_KEY", "")
# ...

Pendekatan ini membuat kunci API sensitif Anda hanya tersedia selama langkah build spesifik ketika dibutuhkan, tetapi tidak tersimpan di layer citra mana pun. Siapa pun yang menarik citra Anda tidak akan bisa mengekstrak kunci API, bahkan jika mereka memeriksa layer citra.

Untuk keamanan tambahan, Anda juga bisa menggunakan kontainer build sementara yang otomatis dihapus setelah build:

docker buildx build --secret id=weather_api_key,src=./api_key.txt --rm -t myapp:latest .

Flag --rm memastikan kontainer intermediate apa pun yang dibuat selama proses build dihapus, semakin mengurangi risiko kredensial bocor.

Konfigurasi Operasional

Menyiapkan Buildx untuk alur kerja Anda hanya butuh beberapa perintah, tetapi memahami opsinya membantu Anda memaksimalkan manfaatnya.

Mari bahas cara mengonfigurasi dan mengelola Buildx di lingkungan lokal sesuai kebutuhan spesifik Anda.

Manajemen instance builder

Docker Buildx menggunakan konsep "builder" — instance BuildKit terpisah dengan kapabilitas dan konfigurasi berbeda. Anda dapat membuat beberapa builder untuk tujuan berbeda.

Pertama, mari lihat builder apa saja yang sudah ada:

docker buildx ls

Anda akan melihat keluaran serupa ini:

Gambar 4 - Builder yang tersedia

Gambar 4 - Builder yang tersedia

Untuk membuat instance builder baru, jalankan perintah berikut:

# Buat builder baru
docker buildx create --name mybuilder

# Beralih untuk menggunakan builder tersebut
docker buildx use mybuilder

# Bootstrap builder (menyalakan)
docker buildx inspect --bootstrap

Anda bisa memverifikasi bahwa builder berfungsi dengan:

# Periksa status
docker buildx ls

Gambar 5 - Beralih ke builder kustom

Gambar 5 - Beralih ke builder kustom

Jika perlu menghapus builder, jalankan saja:

docker buildx rm mybuilder

Penanganan output

Buildx memberi Anda opsi fleksibel untuk menangani citra yang dibangun. Anda bisa memuatnya langsung ke daemon Docker lokal, mengekspornya sebagai tarball, atau menyimpannya ke direktori lokal.

Mari lihat cara menggunakan opsi ini dengan aplikasi Python kita:

# Muat citra langsung ke Docker (perilaku default)
docker buildx build --load -t myapp:latest .

# Ekspor citra sebagai tarball
docker buildx build --output type=docker,dest=myapp.tar -t myapp:latest .

# Simpan isi citra ke direktori lokal
docker buildx build --output type=local,dest=./image-output -t myapp:latest .

Setelah menggunakan ekspor tarball, Anda dapat memuatnya ke Docker dengan:

docker load < myapp.tar

Gambar 6 - Memuat citra dari ekspor tarball

Gambar 6 - Memuat citra dari ekspor tarball

Output direktori lokal sangat berguna untuk inspeksi. Mari lihat apa yang dibuat:

ls -la ./image-output

Anda akan melihat filesystem citra mentah:

Gambar 7 - Isi ekspor direktori lokal

Gambar 7 - Isi ekspor direktori lokal

Anda bahkan dapat menjalankan tahapan build tertentu tanpa membuat citra final. Ini berguna untuk debugging atau menguji langkah build:

# Buat Dockerfile multi-tahap
cat > Dockerfile.multi << 'EOF'
FROM python:3.13-slim AS base
WORKDIR /app
COPY requirements.txt .

FROM base AS dev-deps
RUN pip install --no-cache-dir -r requirements.txt
RUN pip install pytest

FROM base AS prod-deps
RUN pip install --no-cache-dir -r requirements.txt

FROM prod-deps AS final
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]
EOF

# Build hanya tahap dev-deps dan ekspor filesystem-nya
docker buildx build --file Dockerfile.multi --target dev-deps --output type=local,dest=./dev-deps-output .

Sekarang Anda bisa menginspeksi paket apa saja yang terpasang di lingkungan dev:

cat ./dev-deps-output/usr/local/lib/python3.13/site-packages/pytest/__init__.py

Gambar 8 - Isi berkas dari tahap dev-deps

Gambar 8 - Isi berkas dari tahap dev-deps

Singkatnya, opsi output ini memberi Anda kendali penuh atas ke mana citra yang dibangun diarahkan, baik untuk debugging lokal maupun menyiapkan citra yang akan dibagikan dengan tim.

Kasus Penggunaan Lanjutan

Sejauh ini, saya telah menunjukkan perintah dan kasus penggunaan Buildx dasar. Masih banyak lagi yang bisa dilakukan Buildx, dengan beberapa fitur yang mustahil diterapkan dengan builder klasik.

Mari jelajahi beberapa teknik lanjutan untuk membawa alur kerja kontainerisasi Anda ke level berikutnya.

Optimasi build multi-tahap

Build multi-tahap adalah salah satu fitur paling kuat dari Docker untuk membuat citra yang efisien, dan Buildx membuatnya semakin baik.

Untuk demonstrasi, mari buat aplikasi Python yang dioptimalkan dengan beberapa tahap:

# Dockerfile.optimized
FROM python:3.13-slim AS base
WORKDIR /app
COPY requirements.txt .

FROM base AS builder
RUN pip install --no-cache-dir --target=/install -r requirements.txt

FROM base AS linter
COPY --from=builder /install /usr/local/lib/python3.13/site-packages
COPY app.py .
RUN pip install pylint && pylint app.py || exit 0

FROM base AS tester
COPY --from=builder /install /usr/local/lib/python3.9/site-packages
COPY app.py .
RUN pip install pytest && python -m pytest app.py -v || exit 0

FROM python:3.13-alpine AS final
WORKDIR /app
COPY --from=builder /install /usr/local/lib/python3.13/site-packages
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]

Dengan Buildx, Anda dapat membangunnya lebih efisien:

docker buildx build --file Dockerfile.optimized -t myapp:optimized --load .

Gambar 9 - Build multi-tahap

Gambar 9 - Build multi-tahap

Jadi, apa yang membuatnya istimewa? Buildx memproses tahap-tahap yang independen secara paralel. Sementara builder lama mengeksekusi setiap tahap berurutan, Buildx mengidentifikasi bahwa tahap linter dan tester tidak saling bergantung dan membangunnya secara simultan.

Satu manfaat tambahan dari optimasi build ini adalah pengurangan ukuran berkas. Anda dapat memverifikasi ukuran citra dengan menjalankan:

docker images myapp

Anda akan melihat sesuatu seperti ini:

Gambar 10 - Ukuran citra Docker

Gambar 10 - Ukuran citra Docker

Citra final berbasis alpine jauh lebih kecil.

Integrasi pipeline CI/CD

Saat Anda bekerja secara lokal, Anda tetap bisa menyiapkan konfigurasi Buildx yang mencerminkan lingkungan CI/CD Anda.

Sebagai awal, buat berkas .dockerignore untuk menjaga build tetap bersih:

.git
__pycache__
*.pyc
*.pyo
*.pyd
.Python
env
venv
*.so
.coverage
htmlcov

Lalu buat skrip build yang meniru apa yang mungkin dilakukan pipeline CI Anda:

#!/bin/bash
# build.sh - Simulasi CI/CD lokal

echo "Starting CI/CD build process..."

# Menyiapkan builder dengan dukungan emulasi
echo "Setting up builder..."
docker buildx create --name cibuilder --use || true
docker buildx inspect --bootstrap

# Jalankan linting
echo "Running lint stage..."
docker buildx build --file Dockerfile.optimized --target linter .

# Jalankan tes
echo "Running test stage..."
docker buildx build --file Dockerfile.optimized --target tester .

# Build untuk banyak platform
echo "Building multi-platform image..."
docker buildx build --file Dockerfile.optimized \
  --platform linux/amd64,linux/arm64 \
  --tag myapp:$(date +%Y%m%d) \
  --tag myapp:latest \
  --load \
  --progress=plain \
  .

echo "Build process complete!"

Singkatnya, skrip ini melakukan hal berikut:

  • Membuat builder khusus untuk CI/CD.
  • Menjalankan tahap linting.
  • Menjalankan tahap pengujian.
  • Membangun citra final multi-platform dengan tag versi.

Sekarang bagian yang menyenangkan — buat skrip dapat dieksekusi dan jalankan:

chmod +x build.sh
./build.sh

Pengeditan lokal

Kendala umum saat bekerja dengan Docker adalah setiap kali Anda mengubah berkas sumber, Anda harus membangun ulang citra dan menjalankan kontainer. Ini terlalu memakan waktu.

Kabar baiknya: untuk pengembangan lokal dengan iterasi lebih cepat, Anda dapat membuat versi pengembangan:

# Dockerfile.dev
FROM python:3.13-slim
WORKDIR /app

RUN pip install flask psutil python-dotenv

# Instal alat pengembangan
RUN pip install pytest pylint watchdog

# Mount kode aplikasi saat runtime alih-alih menyalin
CMD ["python", "app.py"]

Jalankan dengan mount volume untuk live reloading kode:

docker buildx build -f Dockerfile.dev -t myapp:dev --load .
docker run -it --rm -p 5000:5000 -v $(pwd):/app myapp:dev

Sekarang Anda bisa mengedit berkas app.py secara lokal, dan perubahan akan langsung tercermin di kontainer yang berjalan!

Selanjutnya, mari bahas performa.

Pertimbangan Performa

Tidak ada yang suka alur kerja pengembangan yang lambat, dan kekuatan paralelisasi dengan Docker Buildx dapat membantu.

Mari jelajahi cara mengoptimalkan build Anda dan memanfaatkan fitur performa Buildx untuk membuat citra lebih cepat.

Teknik paralelisasi build

Salah satu keunggulan terbesar Buildx adalah kemampuannya membangun tahap secara paralel. Builder Docker tradisional mengeksekusi setiap langkah berurutan, tetapi Buildx menganalisis Dockerfile Anda dan mengidentifikasi langkah mana yang dapat dijalankan bersamaan.

Untuk demonstrasi, saya akan menggunakan dua berkas — Dockerfile.standard dan Dockerfile.parallel. Berikut isi keduanya:

Dockerfile.standard

FROM python:3.13-slim
WORKDIR /app

# System dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc \
    g++ \
    && rm -rf /var/lib/apt/lists/*

# Python dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Application code
COPY app.py .

# Linting
RUN pip install pylint && pylint app.py || true

EXPOSE 5000
CMD ["python", "app.py"]

Dockerfile.parallel

FROM python:3.13-slim AS python-base
WORKDIR /app

# Independent stage for installing system dependencies
FROM python-base AS system-deps
RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc \
    g++ \
    && rm -rf /var/lib/apt/lists/*

# Independent stage for installing Python dependencies
FROM python-base AS python-deps
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Independent stage for static code analysis
FROM python-deps AS linting
COPY app.py .
RUN pip install pylint && pylint app.py || true

# Final stage that combines dependencies
FROM python-base AS final
# Copy from system deps stage
COPY --from=system-deps /usr/bin/gcc /usr/bin/gcc
# Copy from Python deps stage
COPY --from=python-deps /usr/local/lib/python3.13/site-packages /usr/local/lib/python3.13/site-packages
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]

Mari ukur bagaimana struktur paralel ini meningkatkan waktu build:

# Ukur waktu build berurutan standar
time docker build -t myapp:standard -f Dockerfile.standard .

# Ukur waktu build yang dioptimalkan paralel dengan Buildx
time docker buildx build --load -t myapp:parallel -f Dockerfile.parallel .

Sebagai referensi, build standar memakan waktu 18,48 detik sementara build paralel hanya 1,17 detik!

Untuk performa yang lebih baik lagi, Anda bisa mencoba menggunakan flag --cache-from dan --cache-to untuk memanfaatkan caching disk lokal:

# Build pertama - buat cache
docker buildx build --load -t myapp:latest --cache-to type=local,dest=./buildcache .

# Build selanjutnya - gunakan cache
docker buildx build --load -t myapp:latest --cache-from type=local,src=./buildcache .

Anda juga dapat membatasi ukuran konteks dengan berkas .dockerignore yang cermat:

# Buat .dockerignore yang komprehensif
cat > .dockerignore << 'EOF'
.git
.github
.dockerignore
.pytest_cache
__pycache__
*.pyc
*.pyo
*.pyd
.Python
venv
env
node_modules
.coverage
htmlcov
.DS_Store
EOF

Singkatnya, dengan menata Dockerfile Anda dengan pemikiran paralelisasi dan memanfaatkan caching tingkat lanjut Buildx, Anda akan menghabiskan lebih sedikit waktu menunggu build dan lebih banyak waktu mengembangkan fitur.

Integrasi Ekosistem

Docker Buildx tidak berdiri sendiri. Buildx dibangun untuk berintegrasi mulus dengan alat lain di lingkungan pengembangan Anda.

Mari jelajahi bagaimana Buildx bekerja dengan alat pengembang lokal dan membuat alur kerja kontainer Anda lebih efisien.

Klaster build Kubernetes

Kubernetes menawarkan kapabilitas kuat untuk menjalankan operasi Docker Buildx terdistribusi di seluruh klaster. Saat mengintegrasikan Buildx dengan Kubernetes, Anda bisa mendapatkan build yang lebih cepat dan tangguh yang dapat diskalakan sesuai kebutuhan proyek.

> Baru di Kubernetes? Baca Kubernetes vs Docker: Perbedaan yang Perlu Diketahui Setiap Pengembang sebagai langkah berikutnya.

Menggunakan Kubernetes untuk infrastruktur build menawarkan beberapa keuntungan:

  1. Penskalaan otomatis: Kubernetes dapat menaikkan atau menurunkan skala node builder berdasarkan permintaan, mengalokasikan sumber daya secara efisien di seluruh klaster. Anda bahkan dapat menetapkan aturan autoscaling berdasarkan utilisasi CPU.
  2. Optimasi sumber daya: Penjadwalan Kubernetes memastikan build Anda mendapatkan sumber daya yang dibutuhkan tanpa membebani node individual. Anda dapat menetapkan limit dan request sumber daya untuk kinerja yang konsisten.
  3. High availability: Dengan mendistribusikan instance BuildKit di beberapa node, infrastruktur build Anda tetap tersedia bahkan jika ada node yang gagal.
  4. Lingkungan konsisten: Setiap anggota tim terhubung ke infrastruktur build yang sama, menghilangkan masalah "berfungsi di mesin saya".
  5. Eksekusi paralel: Build kompleks dengan banyak tahap dapat berjalan paralel di beberapa node, secara signifikan mengurangi waktu build. Proyek yang mungkin butuh 15 menit dibangun secara lokal bisa selesai dalam 3–4 menit saat terdistribusi.

Anggap bagian ini lebih "teoretis", karena menggali lebih dalam Kubernetes adalah topik lanjutan tersendiri.

Untuk memulai, buat berkas bernama buildkit-deployment.yaml dengan isi berikut:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: buildkit
  namespace: buildkit
spec:
  replicas: 3
  selector:
    matchLabels:
      app: buildkit
  template:
    metadata:
      labels:
        app: buildkit
    spec:
      containers:
      - name: buildkit
        image: moby/buildkit:latest
        args:
        - --addr
        - tcp://0.0.0.0:1234
        ports:
        - containerPort: 1234
        securityContext:
          privileged: true
---
apiVersion: v1
kind: Service
metadata:
  name: buildkit
  namespace: buildkit
spec:
  type: ClusterIP
  ports:
  - port: 1234
    targetPort: 1234
  selector:
    app: buildkit

Langkah berikutnya adalah menerapkan berkas ini ke klaster Kubernetes Anda:

kubectl create namespace buildkit
kubectl apply -f buildkit-deployment.yaml

Terakhir, sambungkan ke deployment ini dari mesin lokal Anda:

docker buildx create --name k8s-builder \
  --driver remote \
  --driver-opt endpoint=tcp://<cluster-ip>:1234 \
  --use

Dan selesai, Anda siap melanjutkan!

Dukungan plugin IDE

IDE seperti Visual Studio Code menawarkan integrasi yang sangat baik dengan Docker Buildx melalui ekstensi Docker-nya. Integrasi ini memudahkan pengelolaan alur kerja Buildx langsung dari lingkungan pengembangan Anda.

Untuk memulai Docker Buildx di VS Code, instal ekstensi "Docker" dari marketplace VS Code.

Setelah terpasang, Anda akan mendapatkan beberapa fitur khusus Buildx:

  • Klik kanan pada Dockerfile mana pun untuk melihat menu konteks dengan opsi "Build Image..." yang mendukung Buildx.
  • Akses argumen build, target platform, dan opsi output melalui antarmuka.
  • Kemampuan mengelola dan beralih antar instance builder yang berbeda.
  • Integrasi dengan terminal VS Code untuk menjalankan perintah Buildx yang kompleks.

Gambar 12 - Ekstensi Docker untuk VSCode

Gambar 11 - Ekstensi Docker untuk VSCode

Berikut contoh kustomisasi tugas VS Code untuk menggunakan Buildx dengan membuat berkas .vscode/tasks.json:

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Docker: Buildx Build",
      "type": "shell",
      "command": "docker buildx build --load -t ${input:imageName} .",
      "group": {
        "kind": "build",
        "isDefault": true
      }
    },
    {
      "label": "Docker: Buildx Multi-Platform",
      "type": "shell",
      "command": "docker buildx build --platform linux/amd64,linux/arm64 -t ${input:imageName} ."
    }
  ],
  "inputs": [
    {
      "id": "imageName",
      "description": "Image name (with tag):",
      "default": "myapp:latest",
      "type": "promptString"
    }
  ]
}

Dengan konfigurasi ini, Anda dapat dengan cepat mengakses perintah Buildx yang umum dari menu Tasks VS Code (Terminal > Run Task). Ekstensi juga menyediakan penyorotan sintaks untuk Dockerfile dan pelengkapan otomatis untuk perintah Docker umum, yang semuanya membuat alur kerja Buildx Anda lebih produktif.

Pemecahan Masalah dan Debugging

Setiap alat pengembangan terkadang (terlalu sering) butuh pemecahan masalah, dan Docker Buildx tidak terkecuali. Di bagian ini, saya akan memandu Anda melalui beberapa masalah umum agar Anda bisa mendiagnosisnya sendiri dengan cepat dan kembali ke jalur semula.

Masalah umum dan penyelesaiannya

Saat bekerja dengan Buildx, Anda mungkin menemui beberapa tantangan umum. Berikut masalah yang paling sering terjadi dan solusinya:

  • Pembuatan builder gagal. Jika Anda melihat galat saat membuat builder dengan docker buildx create, periksa versi Docker Anda:
docker version

Buildx memerlukan Docker 19.03 atau lebih baru. Jika Anda menggunakan versi lebih lama, tingkatkan Docker untuk mengakses fitur Buildx.

Untuk galat "no such plugin", pastikan Buildx terinstal dengan benar dengan menjalankan:

docker buildx version
  • Kegagalan build multi-platform. Saat membangun untuk beberapa platform dengan galat seperti "exec format error" atau "no matching manifest", periksa apakah QEMU terpasang:
docker buildx inspect --bootstrap

Jika perlu, pasang emulator platform:

docker run --privileged --rm tonistiigi/binfmt --install all
  • Masalah terkait cache. Untuk masalah caching, coba bersihkan cache build lokal Anda:
# Hapus cache builder tertentu
docker buildx prune -b mybuilder

# Hapus semua cache build
docker buildx prune --all

> Apa sebenarnya perintah Docker prune? Pelajari dengan banyak contoh praktik.

  • Masalah koneksi daemon BuildKit. Jika Anda melihat "failed to solve" atau galat koneksi, mulai ulang builder:
docker buildx rm mybuilder
docker buildx create --name mybuilder --use
docker buildx inspect --bootstrap
  • Masalah terkait performa. Untuk build yang lambat, coba output debug untuk mengidentifikasi bottleneck:
docker buildx build --progress=plain --no-cache .

Output verbose ini membantu menelusuri tahap build mana yang paling memakan waktu, sehingga Anda bisa mengoptimalkan Dockerfile sesuai kebutuhan.

  • Kegagalan perintah "load". Jika Anda menemui "error: docker exporter does not currently support exporting manifest lists" saat menggunakan --load dengan build multi-platform, ingat bahwa memuat banyak platform ke daemon Docker secara simultan tidak didukung. Sebagai gantinya:
# Build untuk platform Anda saat ini dan muat
docker buildx build --platform linux/amd64 --load -t myapp:latest .
  • Praktik debugging. Untuk masalah yang lebih kompleks, pendekatan debugging berikut akan membantu:
# Aktifkan log debug BuildKit
BUILDKIT_DEBUG=1 docker buildx build .

# Inspeksi status internal builder
docker buildx inspect

# Periksa persyaratan sistem
docker info

# Untuk kegagalan tahap tertentu, build hanya sampai tahap itu
docker buildx build --target problem-stage .

# Verifikasi konteks Docker Anda
docker context ls

Dengan bekerja sistematis melalui langkah-langkah pemecahan masalah ini, Anda dapat menyelesaikan sebagian besar isu Buildx dan menjaga alur kerja build kontainer tetap efisien.

Ringkasan Panduan Docker Buildx

Kita telah membahas banyak hal dalam artikel Docker Buildx ini! Anda telah melihat bagaimana alat yang kuat ini dapat membuat build kontainer lebih cepat dan lebih fleksibel.

Ingat manfaat utamanya: Anda dapat membangun citra untuk banyak platform dengan satu perintah, mempercepat build dengan caching tingkat lanjut, dan menjaga citra tetap aman dengan pengelolaan secret yang tepat. Peningkatan performanya nyata, terutama saat Anda menata Dockerfile untuk memanfaatkan build paralel.

Saya menggunakannya sepanjang waktu di Macbook chip M, karena tidak semua citra tersedia untuk ARM.

Baik Anda pengembang solo atau bagian dari tim besar, Buildx memberi Anda alat yang sesuai dengan alur kerja. Anda dapat menjalankan build secara lokal, mendistribusikannya ke kontainer, atau bahkan menskalakan ke klaster Kubernetes sesuai kebutuhan yang berkembang.

Untuk mempelajari lebih lanjut tentang Docker dan Docker Buildx, saya merekomendasikan mendaftar ke kursus DataCamp berikut:

Dario Radečić

Penulis

Dario Radečić

Senior Data Scientist yang berbasis di Kroasia. Penulis Tekno Teratas dengan lebih dari 700 artikel yang telah diterbitkan, menghasilkan lebih dari 10 juta tayangan. Penulis buku Machine Learning Automation with TPOT.

Topik

Terkait

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

blogs

Tutorial Korelasi di R