Image #
Docker Image adalah fondasi utama dari seluruh ekosistem Docker. Setiap container yang berjalan selalu berasal dari sebuah image. Memahami image Docker secara mendalam akan membantu kamu:
- Membuat aplikasi lebih ringan dan cepat dijalankan
- Mengurangi bug antar environment (works on my machine 😄)
- Meningkatkan keamanan dan efisiensi deployment
- Mengoptimalkan CI/CD pipeline
Secara sederhana:
Docker Image = blueprint (cetakan) immutable untuk membuat Docker Container
Diagram: Hubungan Docker Image dan Docker Container #
Docker Image (Read-Only / Immutable)
┌──────────────────────────────────┐
│ Base Image (OS / Distro) │
│ Dependency Layer │
│ Application Code │
│ Metadata (ENV, CMD, ENTRYPOINT) │
└──────────────────────────────────┘
│
│ docker run
▼
Docker Container (Runtime Instance)
┌──────────────────────────────────┐
│ Writable Layer (Runtime Changes) │ ← log, temp file, cache
│ ──────────────────────────────── │
│ Image Layers (Read-Only) │
└──────────────────────────────────┘
Keterangan diagram:
- Docker Image bersifat immutable (read-only) dan tidak berubah setelah proses build.
- Setiap instruksi di Dockerfile akan membentuk layer image yang tersusun bertumpuk.
- Saat image dijalankan (
docker run), Docker membuat container dengan satu writable layer di bagian paling atas. - Semua perubahan runtime (log, cache, file sementara) hanya terjadi di writable layer.
- Jika container dihapus, perubahan tersebut hilang, tetapi image tetap aman dan dapat digunakan ulang.
Diagram ini menjadi dasar untuk memahami konsep penting seperti layer caching, multi-stage build, dan immutable deployment yang akan dibahas pada bagian selanjutnya.
Artikel ini akan membahas image Docker secara konseptual, teknis, dan praktis, lengkap dengan struktur internal, lifecycle, serta best practice di dunia nyata.
Apa Itu Docker Image? #
Docker Image adalah file system snapshot + metadata yang berisi:
- Source code aplikasi
- Runtime (misalnya Go binary, JVM, Node.js)
- Dependency
- Environment default
- Command untuk menjalankan aplikasi
Image bersifat immutable (read-only). Ketika dijalankan, Docker akan membuat container sebagai layer writable di atas image tersebut.
📌 Analogi sederhana:
- Image → ISO installer OS
- Container → OS yang sedang berjalan dari ISO tersebut
Docker Image vs Docker Container #
| Aspek | Docker Image | Docker Container |
|---|---|---|
| Sifat | Immutable | Mutable (runtime) |
| Fungsi | Template | Instance yang berjalan |
| Dibuat dari | Dockerfile | Docker Image |
| Bisa diubah | ❌ | ✅ |
| Bisa dihentikan | ❌ | ✅ |
Satu image bisa digunakan untuk membuat banyak container sekaligus.
Struktur Internal Docker Image #
Docker image tidak berupa satu file besar, melainkan kumpulan layer.
Konsep Layer #
Setiap instruksi di Dockerfile akan menghasilkan satu layer:
FROM ubuntu:22.04 # layer 1
RUN apt install nginx # layer 2
COPY app /app # layer 3
CMD ["nginx"] # metadata
Struktur ini memungkinkan:
- Layer caching (build lebih cepat)
- Reuse layer antar image
- Image menjadi lebih efisien
Union File System #
Docker menggunakan UnionFS (OverlayFS), yang memungkinkan:
- Layer disusun bertumpuk
- Container hanya menulis di layer paling atas
📌 Jika container dihapus → perubahan hilang, image tetap aman.
Image Registry #
Docker image disimpan di registry.
Jenis Registry #
Public Registry
- Docker Hub
- GHCR (GitHub Container Registry)
Private Registry
- Amazon ECR
- Google Artifact Registry
- Harbor
- Self-hosted Docker Registry
Format Nama Image #
<registry>/<namespace>/<image>:<tag>
Contoh:
docker.io/library/nginx:1.25
123456789.dkr.ecr.ap-southeast-1.amazonaws.com/api:latest
Lifecycle Docker Image #
Build
docker build -t myapp:1.0 .Store (local atau registry)
Push ke Registry
docker push myapp:1.0Pull
docker pull myapp:1.0Run sebagai Container
docker run myapp:1.0
Tag dan Versioning Image #
Tag bukan hanya versi, tapi label bebas.
Contoh Tag #
latest1.0.31.0.3-alpinecommit-sha
Best Practice Tagging #
❌ Hindari di production:
myapp:latest
✅ Gunakan:
myapp:1.4.2
myapp:1.4.2-alpine
myapp:2026-02-07
Image Size dan Dampaknya #
Ukuran image berpengaruh langsung ke:
- Waktu build
- Waktu pull
- Startup container
- Biaya storage & network
Contoh Perbandingan #
| Base Image | Ukuran |
|---|---|
| ubuntu | ~70MB |
| node | ~900MB |
| node:alpine | ~120MB |
| scratch | ~0MB |
| distroless | ~20MB |
Best Practice Docker Image #
Gunakan Base Image Sekecil Mungkin #
FROM golang:1.22-alpine
Atau gunakan distroless untuk production.
Multi-Stage Build #
Menghasilkan image kecil dan aman:
FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN go build -o app
FROM gcr.io/distroless/base-debian12
COPY --from=builder /app/app /app
CMD ["/app"]
📌 Compiler tidak ikut masuk ke image final.
Minimalkan Layer #
❌ Buruk:
RUN apt update
RUN apt install -y curl
✅ Baik:
RUN apt update && apt install -y curl && rm -rf /var/lib/apt/lists/*
Jangan Simpan Secret di Image #
❌ Salah:
ENV DB_PASSWORD=secret
✅ Benar:
- ENV runtime
- Docker secret
- Kubernetes secret
Gunakan .dockerignore #
node_modules
.git
.env
logs
Menghindari:
- Image besar
- Kebocoran file sensitif
Scan Keamanan Image #
Gunakan:
- Trivy
- Snyk
- Docker Scout
Untuk mendeteksi:
- CVE
- Dependency rentan
Immutable Image & Deployment Strategy #
Karena image bersifat immutable:
- Tidak diubah setelah build
- Update = build image baru
Strategi umum:
- Blue-Green Deployment
- Rolling Update
- Canary Release
📌 Ini alasan Docker image sangat cocok untuk microservices & cloud-native.
Penutup #
Docker Image adalah:
- Blueprint utama container
- Immutable, reusable, dan versionable
- Fondasi CI/CD dan cloud-native architecture
Dengan memahami:
- Struktur layer
- Lifecycle
- Registry
- Best practice
Kamu bisa membangun image Docker yang:
- ✅ Kecil
- ✅ Aman
- ✅ Cepat
- ✅ Production-grade