← All Notes

Docker dari Nol: Belajar Kontainerisasi

Docker dari Nol: Belajar Kontainerisasi

Minggu pertama belajar DevOps, saya langsung nyemplung ke Docker. Ini catatan ringkasnya.

Apa itu Docker?

Docker adalah platform untuk membangun, mengirim, dan menjalankan aplikasi dalam container. Anggap saja container seperti "kotak" yang berisi aplikasi beserta semua dependensinya — sehingga ia bisa berjalan di mana saja.

Masalah yang diselesaikan Docker:

"It works on my machine" — tidak ada lagi. Container berjalan sama persis di laptop, staging, maupun production.

Konsep Dasar

IstilahPenjelasan
ImageBlueprint/template container (readonly)
ContainerInstance yang berjalan dari sebuah image
DockerfileScript untuk mendefinisikan isi sebuah image
RegistryPenyimpanan image (contoh: Docker Hub, GHCR)

Perintah yang Paling Sering Dipakai

# Pull image dari Docker Hub
docker pull nginx

# Jalankan container
docker run -d -p 8080:80 --name my-nginx nginx

# Lihat container yang berjalan
docker ps

# Masuk ke dalam container
docker exec -it my-nginx sh

# Stop & hapus container
docker stop my-nginx && docker rm my-nginx

# Build image dari Dockerfile
docker build -t my-app:latest .

# Lihat semua images
docker images

Membuat Dockerfile Pertama

# Base image
FROM node:20-alpine

# Direktori kerja di dalam container
WORKDIR /app

# Copy file dependency
COPY package*.json ./
RUN npm ci

# Copy source code
COPY . .

# Build aplikasi
RUN npm run build

# Expose port
EXPOSE 3000

# Jalankan aplikasi
CMD ["node", "server.js"]

Docker Compose — Jalankan Banyak Container Sekaligus

services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: secret
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:

Jalankan dengan: docker compose up -d

Pelajaran Penting

  1. Multi-stage build — pisahkan stage build dan production untuk image yang lebih kecil
  2. .dockerignore — jangan copy node_modules ke dalam image
  3. Non-root user — jangan jalankan container sebagai root di production
  4. Named volumes — untuk data yang perlu persisten (database, uploads)

Apa Selanjutnya?

  • Belajar networking antar container
  • Publish image ke Docker Hub / GHCR
  • Masuk ke Kubernetes untuk orchestrasi

Tulisan ini adalah catatan pribadi selama proses belajar. Mungkin ada yang kurang tepat — feedback sangat diterima!