Docker telah mengubah cara kita develop, ship, dan run applications. Di tahun 2026, hampir semua startup dan perusahaan besar menggunakan Docker dalam workflow mereka. Tapi sebelum langsung praktik, pahami dulu konsep dasarnya.
Kenapa Docker Penting?
Sebelum Docker, problem utama developer adalah: "Di komputer saya bisa, di server kok error?" Docker menyelesaikan masalah ini dengan membungkus aplikasi beserta semua dependensinya ke dalam container yang portable.
- Konsistensi — environment yang sama di development, staging, dan production
- Isolation — aplikasi satu tidak mengganggu aplikasi lain
- Portability — container bisa jalan di mana saja yang ada Docker
- Scalability — mudah scale horizontal dengan menambah container
Container vs VM
Container bukanlah virtual machine. Ini perbedaan fundamental:
- Container — share kernel dengan host OS, hanya meng-isolasi process dan filesystem. Startup dalam hitungan detik, footprint MB.
- VM — punya kernel sendiri, meng-emu entire OS. Startup dalam hitungan menit, footprint GB.
Dalam praktiknya, satu VPS 2GB RAM bisa menjalankan 20+ container, tapi cuma 2-3 VM. Itulah kenapa Docker menjadi standar untuk microservices.
Image vs Container
Image adalah blueprint (template), Container adalah instance dari image. Analogi sederhana:
- Image = resep masakan (blueprint)
- Container = masakan yang sudah jadi (instance)
Satu image bisa menghasilkan banyak container, seperti satu resep bisa menghasilkan banyak porsi masakan. Yang membuat Docker efisien: semua container dari image yang sama share layer yang sama, jadi hemat disk space.
Dockerfile
Dockerfile adalah instruksi untuk membangun image. Setiap baris adalah satu layer:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
Best Practice Dockerfile
- Gunakan
.dockerignoreuntuk exclude file yang tidak perlu (node_modules, .git, .env) - Order layer dari yang jarang berubah ke yang sering berubah (build cache)
- Gunakan multi-stage build untuk mengurangi image size
- Jangan run sebagai root — buat user khusus
# Multi-stage build example
FROM node:18-alpine AS builder
WORKDIR /app
COPY . .
RUN npm ci && npm run build
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
USER node
CMD ["node", "dist/index.js"]
Volume
Volume memungkinkan data persist setelah container dihapus. Tanpa volume, semua data di container hilang saat container dihapus — termasuk database, uploads, dan logs.
# Named volume (recommended)
docker run -v pgdata:/var/lib/postgresql/data postgres:16
# Bind mount (untuk development)
docker run -v $(pwd)/src:/app/src node:18-alpine
Network
Docker network memungkinkan container berkomunikasi satu sama lain. Tiga tipe network utama:
- bridge — default, container dalam satu host bisa saling akses
- host — container share network stack dengan host (performa lebih baik)
- overlay — untuk multi-host networking (Docker Swarm)
Saat menggunakan Docker Compose, semua service otomatis berada di network bridge yang sama. Container bisa akses service lain menggunakan nama service sebagai hostname.
Perintah Dasar Docker
# Jalankan container
docker run -d -p 8080:80 nginx:alpine
# Lihat container yang berjalan
docker ps
# Masuk ke container
docker exec -it container_name sh
# Lihat logs
docker logs -f container_name
# Hentikan dan hapus container
docker stop container_name && docker rm container_name
# Hapus image yang tidak terpakai
docker image prune -a
Langkah Selanjutnya
Setelah memahami konsep dasar ini, langkah selanjutnya adalah belajar Docker Compose untuk manage multi-container applications. Untuk panduan lengkap membangun server, baca panduan self-hosting dari nol.