← Kembali ke BlogDevOps

Docker untuk Developer: Dari Nol ke Production

M. Hidayatullah·2026-01-18·9 min read
/ cover

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 menitdocker-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

TermPenjelasan singkat
ImageBlueprint (read-only). Berisi OS + dependency + code
ContainerImage yang lagi running
DockerfileResep untuk bikin image
VolumeStorage persistent (data nggak hilang saat container restart)
NetworkCara 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
  • .dockerignore untuk skip vendor/, node_modules/
  • ✅ Pin versi (php:8.2-fpm-alpine bukan php: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:

  1. Build image lokal: docker build -t myapp:1.2.3 .
  2. Tag ke Azure Container Registry: docker tag myapp:1.2.3 registry.azurecr.io/myapp:1.2.3
  3. Push: docker push registry.azurecr.io/myapp:1.2.3
  4. 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 -v hapus volume juga (data ilang!) — pakai docker-compose down aja kalau mau preserve data
  • localhost di dalam container ≠ host laptop — pakai host.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 →