☀️Siang
DevOps & Cloud

Docker untuk Developer: Panduan Praktis

GRATIS

Panduan lengkap belajar Docker dari nol — containers vs VMs, Dockerfile, images, volumes, networking, docker-compose, Docker Hub, dan best practices untuk developer

Artikel: Docker Dasar Artikel: Docker Dasar


1. Pengenalan Docker

Docker adalah platform open-source yang memungkinkan developer untuk mengemas aplikasi beserta seluruh dependensinya ke dalam satu unit yang disebut container. Diperkenalkan oleh Solomon Hykes pada tahun 2013 melalui perusahaan Docker Inc., platform ini telah mengubah cara developer membangun, mengirim, dan menjalankan aplikasi secara drastis.

Sebelum Docker, masalah klasik yang sering dihadapi tim developer adalah "works on my machine" — aplikasi berjalan sempurna di komputer developer, tetapi gagal di lingkungan production. Docker memecahkan masalah ini dengan memastikan bahwa aplikasi berjalan di lingkungan yang konsisten di mana pun — dari laptop developer hingga server production.

Mengapa Docker Penting?

Keunggulan Penjelasan
KonsistensiAplikasi berjalan sama di semua environment — development, staging, production
IsolasiSetiap container terisolasi, tidak saling mengganggu satu sama lain
PortabilitasContainer bisa dipindahkan antar server tanpa perubahan kode
RinganContainer berbagi host OS kernel, jauh lebih ringan dari VM
CepatContainer bisa dimulai dalam hitungan detik, bukan menit
SkalabelMudah menambah atau mengurangi container sesuai beban
Ekosistem LuasDocker Hub menyediakan jutaan image siap pakai
Diagram: Cara Kerja Docker
Cara Kerja Docker

Container 1 Node.js App + libs Node.js App

Container 2 Python App + libs Python App

Container 3 Go App + libs Go App

Docker Daemon (dockerd) Docker Hub ◄ (Registry)...

Docker CLI (Client) ►

Konsep dasar Docker melibatkan tiga komponen utama:

  • Docker Engine — runtime yang menjalankan container (terdiri dari daemon dan CLI)
  • Docker Image — template read-only yang berisi kode aplikasi dan dependencies
  • Docker Container — instance yang berjalan dari sebuah image


2. Containers vs Virtual Machines

Banyak developer pemula bingung antara container dan virtual machines (VM). Meskipun keduanya bertujuan untuk mengisolasi aplikasi, cara kerjanya sangat berbeda dan masing-masing memiliki kelebihan tersendiri.

Apa itu Virtual Machine?

Virtual Machine mensimulasikan seluruh komputer — termasuk hardware virtual, operating system, dan aplikasi. Setiap VM menjalankan OS sendiri (guest OS) di atas hypervisor yang berjalan di host OS. Ini membuat VM sangat berat karena setiap instance membawa overhead OS lengkap.

Apa itu Container?

Container berbagi kernel host OS dan hanya mengisolasi aplikasi beserta dependensinya. Container menggunakan fitur Linux kernel seperti namespaces dan cgroups untuk isolasi dan pembatasan resource. Ini membuat container jauh lebih ringan dan cepat dibanding VM.

Perbandingan Detail

Aspek Container (Docker) Virtual Machine
Ukuran🟢 MB (ringan)🔴 GB (berat)
Startup Time🟢 Detik🔴 Menit
Isolasi🟡 Process-level🟢 Hardware-level
OSBerbagi host kernelOS sendiri per VM
Resource Usage🟢 Rendah🔴 Tinggi
Portability🟢 Sangat portable🟡 Terbatas
Keamanan🟡 Cukup aman🟢 Lebih aman
DensityRatusan per hostPuluhan per host
Contoh ToolDocker, PodmanVMware, VirtualBox, KVM
Diagram: Containers vs Virtual Machines

🟢 Ringan (MB) + cepat

🔴 Berat (GB) + lambat

📦 Container

App A

🐳 Container Runtime (Docker)

App B

🔧 Host OS + Hardware

🖥️ Virtual Machine

App A

📦 Guest OS

App B

⚙️ Hypervisor (VMware/KVM)

🔧 Host OS + Hardware

💡 Tips

Container dan VM bukan saling menggantikan — mereka bisa digunakan bersama. Banyak perusahaan besar menjalankan Docker containers di dalam VM untuk mendapatkan keuntungan dari keduanya: isolasi hardware VM dan efisiensi container.



3. Instalasi Docker

Docker tersedia untuk berbagai platform. Berikut panduan instalasi untuk masing-masing sistem operasi:

Linux (Ubuntu/Debian)

Diagram

HOST MACHINE

bridge network (my-network) web-app ► postgres-...

postgres-db :5432

web-app :3000

Port 3000



8. Docker Compose

Docker Compose adalah tool untuk mendefinisikan dan menjalankan aplikasi multi-container. Dengan satu file YAML (docker-compose.yml), Anda bisa mendefinisikan semua layanan, jaringan, dan volumes yang dibutuhkan aplikasi Anda. Compose sangat memudahkan setup development dan deployment.

Contoh docker-compose.yml Lengkap

YAML — docker-compose.yml
# docker-compose.yml
# Aplikasi Web + Database + Redis
version: "3.8"

services:
  # === Aplikasi Web (Node.js) ===
  web:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: web-app
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgresql://user:password@db:5432/myapp
      - REDIS_URL=redis://cache:6379
    volumes:
      - ./uploads:/app/uploads
    depends_on:
      db:
        condition: service_healthy
      cache:
        condition: service_started
    networks:
      - app-network
    restart: unless-stopped

  # === Database PostgreSQL ===
  db:
    image: postgres:16-alpine
    container_name: postgres-db
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: myapp
    volumes:
      - postgres-data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user -d myapp"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - app-network
    restart: unless-stopped

  # === Redis Cache ===
  cache:
    image: redis:7-alpine
    container_name: redis-cache
    command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru
    volumes:
      - redis-data:/data
    networks:
      - app-network
    restart: unless-stopped

  # === Nginx Reverse Proxy ===
  nginx:
    image: nginx:alpine
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./ssl:/etc/nginx/ssl:ro
    depends_on:
      - web
    networks:
      - app-network
    restart: unless-stopped

volumes:
  postgres-data:
  redis-data:

networks:
  app-network:
    driver: bridge

Perintah Docker Compose

Bash
# Jalankan semua layanan (foreground)
docker compose up

# Jalankan di background (detached)
docker compose up -d

# Build ulang image sebelum start
docker compose up --build

# Hentikan semua layanan
docker compose down

# Hentikan dan hapus volumes (HATI-HATI: data hilang!)
docker compose down -v

# Lihat status layanan
docker compose ps

# Lihat log layanan tertentu
docker compose logs web
docker compose logs -f db   # -f = follow (live)

# Jalankan perintah di dalam container
docker compose exec web npm run migrate
docker compose exec db psql -U user -d myapp

# Scale layanan tertentu
docker compose up -d --scale web=3

# Restart satu layanan
docker compose restart web
💡 Tips

Gunakan depends_on dengan health check untuk memastikan layanan dependency benar-benar siap sebelum layanan utama dimulai. Tanpa ini, aplikasi bisa gagal karena database belum siap menerima koneksi.



9. Docker Hub

Docker Hub adalah registry publik terbesar untuk Docker images. Di Docker Hub, Anda bisa menemukan jutaan image siap pakai — dari database, web server, bahasa pemrograman, hingga aplikasi lengkap. Docker Hub juga mendukung automated builds yang bisa membangun image langsung dari repository GitHub atau Bitbucket.

Perintah Docker Hub

Bash
# Login ke Docker Hub
docker login
# Masukkan username dan password

# Tarik image dari Docker Hub
docker pull nginx:latest
docker pull postgres:16-alpine
docker pull python:3.12-slim

# Cari image di Docker Hub
docker search mysql
docker search redis

# Push image ke Docker Hub
# 1. Tag image dengan format username/repo:tag
docker tag my-app:v1.0 username/my-app:v1.0
docker tag my-app:v1.0 username/my-app:latest

# 2. Push ke Docker Hub
docker push username/my-app:v1.0
docker push username/my-app:latest

# Logout dari Docker Hub
docker logout

Private Registry

Selain Docker Hub, Anda juga bisa menggunakan private registry untuk keamanan lebih:

Bash
# Jalankan registry lokal (untuk development)
docker run -d -p 5000:5000 --name registry registry:2

# Tag dan push ke registry lokal
docker tag my-app:v1.0 localhost:5000/my-app:v1.0
docker push localhost:5000/my-app:v1.0

# Tarik dari registry lokal
docker pull localhost:5000/my-app:v1.0

# Cloud registries:
# - AWS ECR:      aws ecr
# - Google GCR:   gcr.io
# - Azure ACR:    azurecr.io
# - GitHub GHCR:  ghcr.io
# - GitLab:       registry.gitlab.com


10. Best Practices Docker

Mengikuti best practices saat bekerja dengan Docker sangat penting untuk keamanan, performa, dan maintainability. Berikut adalah panduan lengkap yang harus Anda ikuti:

1. Gunakan Multi-Stage Build

Dockerfile
# ❌ JELEK — image besar dengan semua build tools
FROM node:20
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
CMD ["node", "dist/server.js"]

# ✅ BAIK — multi-stage, image kecil
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/server.js"]

2. Gunakan .dockerignore

.dockerignore
node_modules
.git
.gitignore
.env
.env.local
*.md
docker-compose*.yml
Dockerfile
.dockerignore
coverage
.nyc_output
dist
build
*.log
.vscode
.idea

3. Best Practices Lainnya

Praktik Alasan
Gunakan image versi spesifiknode:20.11-alpine lebih stabil dari node:latest
Jangan pakai root userSerangan container escape bisa akses host
Minimalkan layersGabungkan RUN commands untuk kurangi ukuran
Copy requirements duluManfaatkan layer caching saat dependency tidak berubah
Gunakan HEALTHCHECKDocker bisa monitor kesehatan container
Scan image untuk vulnerabilitiesGunakan docker scout atau Trivy
Jangan simpan secrets di imageGunakan environment variable atau Docker secrets
Gunakan restart policyrestart: unless-stopped untuk high availability
Set resource limitsBatasi CPU dan memory agar container tidak rakus
Bash
# Scan image untuk vulnerabilities
docker scout cves my-app:v1.0

# Batasi resource container
docker run -d \
  --name my-app \
  --memory="512m" \
  --cpus="1.5" \
  --restart=unless-stopped \
  my-app:v1.0

# Lihat resource usage container
docker stats

# Bersihkan semua resource tidak terpakai
docker system prune -a --volumes

# Lihat ukuran image
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"


11. Quiz: Uji Pemahamanmu!

Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang Docker:

Pertanyaan 1: Apa perbedaan utama antara container dan virtual machine?

a) Container lebih berat dari VM
b) Container berbagi host kernel, VM menjalankan OS sendiri
c) Container hanya bisa di Linux, VM bisa di semua OS
d) Tidak ada perbedaan, hanya istilah berbeda

Pertanyaan 2: Instruksi apa di Dockerfile yang digunakan untuk mendefinisikan base image?

a) BASE
b) IMAGE
c) FROM
d) START

Pertanyaan 3: Tipe volume apa yang direkomendasikan untuk production?

a) Bind mount
b) tmpfs mount
c) Named volume
d) Anonymous volume

Pertanyaan 4: Bagaimana cara container dalam satu Docker network saling mengakses?

a) Menggunakan IP address container
b) Menggunakan nama container sebagai hostname
c) Melalui port mapping di host
d) Tidak bisa saling mengakses

Pertanyaan 5: Apa manfaat utama multi-stage build di Dockerfile?

a) Mempercepat proses build
b) Mengurangi ukuran image final
c) Meningkatkan keamanan container
d) Memungkinkan menjalankan banyak container
🔍 Zoom
100%
🎨 Tema