Docker untuk Developer: Dari Nol ke Production
Saat saya pertama kali ketemu Docker di Volantis Technology, mindset saya masih "ini sih kerjaan DevOps, ngapain developer harus paham?" Setelah handle CI/CD pipeline ke AKS (Azure Kubernetes Service), saya sadar: Docker itu skill developer, bukan ops. Berikut journey praktis dari nol.
1. Kenapa Developer Wajib Paham Docker
- "Works on my machine" gone forever — environment lokal & production identik
- Onboarding new dev jadi 5 menit —
docker-compose up, beres - Deploy lebih predictable — yang di test = yang di production
Bukan masalah trend, ini quality of life upgrade.
2. Konsep Inti yang Harus Diketahui
| Term | Penjelasan singkat |
|---|---|
| Image | Blueprint (read-only). Berisi OS + dependency + code |
| Container | Image yang lagi running |
| Dockerfile | Resep untuk bikin image |
| Volume | Storage persistent (data nggak hilang saat container restart) |
| Network | Cara container saling ngomong |
3. Dockerfile untuk Aplikasi Laravel
Contoh real dari project Minerba:
FROM php:8.2-fpm-alpine
# Install system deps
RUN apk add --no-cache git zip unzip oniguruma-dev libpq-dev
# Install PHP extensions
RUN docker-php-ext-install pdo pdo_pgsql mbstring
# Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /var/www
COPY . .
RUN composer install --no-dev --optimize-autoloader
EXPOSE 9000
CMD ["php-fpm"]Tips:
- ✅ Multi-stage build untuk reduce image size
- ✅
.dockerignoreuntuk skipvendor/,node_modules/ - ✅ Pin versi (
php:8.2-fpm-alpinebukanphp:latest)
4. Docker Compose untuk Local Dev
version: '3.9'
services:
app:
build: .
volumes: ['./:/var/www']
depends_on: [db, redis]
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: minerba
POSTGRES_PASSWORD: secret
volumes: ['db-data:/var/lib/postgresql/data']
redis:
image: redis:7-alpine
volumes:
db-data:docker-compose up -d → semua service jalan. Onboarding tim baru = 1 command.
5. Push ke Registry & Deploy
Workflow di Volantis:
- Build image lokal:
docker build -t myapp:1.2.3 . - Tag ke Azure Container Registry:
docker tag myapp:1.2.3 registry.azurecr.io/myapp:1.2.3 - Push:
docker push registry.azurecr.io/myapp:1.2.3 - AKS pull image baru via deployment manifest
CI/CD via Azure DevOps otomatis nge-handle step 1-3 setiap merge ke main.
6. Dari Docker ke Kubernetes
Kalau punya 1-2 container → Docker Compose cukup. Kalau punya 10+ service yang harus auto-scale, self-heal, rolling update → masuk ke Kubernetes.
Konsep dasar K8s yang harus paham:
- Pod — wrapper untuk 1+ container
- Deployment — manage replica & rolling update
- Service — load balancer internal
- Ingress — entrypoint dari luar
- ConfigMap & Secret — config & credential
Manifest paling sederhana:
apiVersion: apps/v1
kind: Deployment
metadata:
name: minerba-api
spec:
replicas: 3
selector:
matchLabels: { app: minerba-api }
template:
metadata:
labels: { app: minerba-api }
spec:
containers:
- name: api
image: registry.azurecr.io/minerba:1.2.3
ports: [{ containerPort: 9000 }]3 replica, auto-distribute ke node. Salah satu pod mati? K8s spawn yang baru.
7. Hal yang Sering Bikin Pemula Confused
docker-compose down -vhapus volume juga (data ilang!) — pakaidocker-compose downaja kalau mau preserve datalocalhostdi dalam container ≠ host laptop — pakaihost.docker.internal- Image size > 1GB biasanya karena
COPY . .tanpa.dockerignore - Volume mount nge-overwrite isi folder image — di Laravel saya pernah volume-mount root project trus
vendor/dari image ilang
Kesimpulan
Docker bukan optional skill lagi. Kalau kamu engineer di tim yang ngirim ke production, paham Docker = paham bagaimana code kamu beneran jalan. Mulai dari containerize project sampingan, naikin ke compose untuk multi-service, baru explore K8s saat memang dibutuhkan.
Tulisan oleh M. Hidayatullah — Software Engineer Indonesia.
Diskusi Proyek →