☀️Siang
DevOps & Cloud

Cheatsheet Docker & Kubernetes: Command Line, YAML, dan Best Practices

GRATIS

Referensi cepat Docker dan Kubernetes — CLI commands, Dockerfile, docker-compose, kubectl, YAML manifests, Helm, dan best practices dalam satu halaman



1. Docker Images Commands

💡 Tips

Gunakan docker image prune secara berkala untuk menghapus image yang tidak terpakai dan menghemat disk space.

PerintahKeterangan
docker imagesList semua image lokal
docker pull nginx:latestDownload image dari registry
docker build -t myapp:v1 .Build image dari Dockerfile
docker build -f Dockerfile.prod -t myapp:prod .Build dengan Dockerfile tertentu
docker rmi image_nameHapus image
docker rmi $(docker images -q)Hapus semua image
docker tag myapp:v1 registry/myapp:v1Buat tag baru untuk image
docker push registry/myapp:v1Push image ke registry
docker image pruneHapus dangling images
docker image prune -aHapus semua image tidak terpakai
docker history myapp:v1Lihat layer history image
docker inspect myapp:v1Detail metadata image
docker save -o myapp.tar myapp:v1Export image ke file tar
docker load -i myapp.tarLoad image dari file tar

2. Docker Containers Commands

PerintahKeterangan
docker run -d --name web nginxJalankan container di background
docker run -it ubuntu bashJalankan container interaktif
docker run -p 8080:80 nginxMap port host:container
docker run -v /host:/container nginxMount volume
docker run -e MY_VAR=value myappSet environment variable
docker run --rm myappHapus otomatis setelah selesai
docker run --network mynet myappJalankan di network tertentu
docker psList container yang berjalan
docker ps -aList semua container
docker stop container_idStop container
docker start container_idStart container yang sudah ada
docker restart container_idRestart container
docker rm container_idHapus container
docker rm -f container_idForce hapus container yang jalan
docker logs -f container_idFollow log output
docker logs --tail 100 container_idLihat 100 baris log terakhir
docker exec -it container_id bashMasuk shell container
docker exec container_id cat /etc/os-releaseJalankan perintah di container
docker cp file.txt container_id:/app/Copy file ke container
docker statsMonitor CPU, memori, network real-time
docker top container_idLihat proses di dalam container
docker inspect container_idDetail metadata container
docker system dfCek penggunaan disk Docker
docker system prune -aBersihkan semua resource tidak terpakai

3. Docker Networking

Tipe Network

TipeKeteranganGunakan Untuk
bridgeDefault, isolasi antar containerSingle-host app
hostContainer pakai network host langsungPerformance tinggi
noneTidak ada networkIsolasi total
overlayCross-host networking (Swarm)Multi-host cluster
macvlanContainer punya MAC address sendiriLegacy app

Network Commands

# Buat custom bridge network
docker network create mynet

# List semua network
docker network ls

# Hubungkan container ke network
docker network connect mynet container_id

# Putuskan container dari network
docker network disconnect mynet container_id

# Inspect network
docker network inspect mynet

# Hapus network
docker network rm mynet

# Jalankan container di custom network
docker run -d --name app --network mynet myapp:v1

# Container di network yang sama bisa saling reach via nama
# Contoh: dari container 'app' bisa ping 'db' jika satu network
docker exec app ping db

4. Docker Volumes & Storage

Tipe Storage

TipeContohKeterangan
Named Volume-v mydata:/var/lib/dataDikelola Docker, persistent
Bind Mount-v /host/path:/container/pathMount folder host langsung
tmpfs--tmpfs /app/tmpRAM only, hilang saat restart
Anonymous Volume-v /container/pathAuto-generated, sulit di-reuse

Volume Commands

# Buat named volume
docker volume create mydata

# List semua volume
docker volume ls

# Inspect volume
docker volume inspect mydata

# Hapus volume
docker volume rm mydata

# Hapus semua volume tidak terpakai
docker volume prune

# Contoh penggunaan dengan container
docker run -d --name db \
  -v pgdata:/var/lib/postgresql/data \
  -e POSTGRES_PASSWORD=secret \
  postgres:16

# Bind mount untuk development
docker run -d --name dev \
  -v $(pwd)/src:/app/src \
  -p 3000:3000 \
  node:20 npm run dev

5. Dockerfile Reference

Instruksi Dockerfile

InstruksiKeteranganContoh
FROMBase imageFROM node:20-alpine
WORKDIRSet working directoryWORKDIR /app
COPYCopy file dari contextCOPY package*.json ./
RUNJalankan perintah saat buildRUN npm install
ENVSet environment variableENV NODE_ENV=production
EXPOSEDeklarasi portEXPOSE 3000
CMDDefault command saat runCMD ["node", "server.js"]
ENTRYPOINTCommand utama, tidak bisa di-override mudahENTRYPOINT ["python"]
ARGBuild-time variableARG VERSION=1.0
VOLUMEMount pointVOLUME ["/data"]
USERSet user saat runUSER node
HEALTHCHECKCek kesehatan containerHEALTHCHECK CMD curl -f http://localhost
ADDCopy + auto-extract tarADD app.tar.gz /app/
LABELMetadata imageLABEL maintainer="dev@example.com"

Contoh Multi-Stage Dockerfile

# Stage 1: Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

# Stage 2: Production
FROM node:20-alpine
WORKDIR /app
RUN addgroup -g 1001 appgroup && adduser -u 1001 -G appgroup -s /bin/sh -D appuser
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
USER appuser
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http://localhost:3000/health || exit 1
CMD ["node", "dist/server.js"]

6. Docker Compose

Compose Commands

PerintahKeterangan
docker compose up -dJalankan semua service di background
docker compose downStop dan hapus semua service
docker compose down -vStop + hapus volumes juga
docker compose psStatus service
docker compose logs -fFollow log semua service
docker compose logs -f webFollow log service tertentu
docker compose buildBuild semua service
docker compose pullPull image terbaru
docker compose exec web bashMasuk shell service
docker compose restartRestart semua service
docker compose configValidasi dan lihat compose config
docker compose up --scale web=3Scale service ke 3 replica

Contoh docker-compose.yml

version: "3.9"

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DB_HOST=db
      - DB_PORT=5432
    depends_on:
      db:
        condition: service_healthy
    networks:
      - appnet
    restart: unless-stopped

  db:
    image: postgres:16-alpine
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U admin"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - appnet

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    volumes:
      - redisdata:/data
    networks:
      - appnet

volumes:
  pgdata:
  redisdata:

networks:
  appnet:
    driver: bridge

7. Kubernetes Concepts

Komponen Utama

KomponenKeterangan
ClusterKumpulan node yang menjalankan container
NodeWorker machine (VM/physical) yang menjalankan pod
PodUnit terkecil K8s, berisi 1+ container
DeploymentManage replica set dan rolling update
ServiceExpose pod dengan IP stabil + load balancing
IngressHTTP routing dari luar cluster ke service
NamespaceVirtual cluster untuk isolasi resource
ConfigMapSimpan konfigurasi non-sensitive
SecretSimpan data sensitif (password, token)
PersistentVolume (PV)Storage cluster-level
PersistentVolumeClaim (PVC)Request storage dari PV
StatefulSetUntuk stateful app (database, cache)
DaemonSetJalankan 1 pod di setiap node
Job / CronJobTask sekali jalan atau terjadwal
HPAHorizontal Pod Autoscaler

8. kubectl Commands

Context & Cluster

# Lihat context saat ini
kubectl config current-context

# Ganti context
kubectl config use-context my-cluster

# List semua context
kubectl config get-contexts

# Set namespace default
kubectl config set-context --current --namespace=my-ns

Resource Commands

PerintahKeterangan
kubectl get podsList pod di namespace saat ini
kubectl get pods -AList pod semua namespace
kubectl get pods -o wideDetail pod (IP, node)
kubectl get pods -l app=webFilter pod by label
kubectl get allList semua resource
kubectl get svc,deploy,podsList multi resource type
kubectl describe pod nama_podDetail lengkap pod
kubectl logs nama_podLihat log pod
kubectl logs -f nama_podFollow log
kubectl logs nama_pod -c mycontainerLog container tertentu
kubectl exec -it nama_pod -- bashMasuk shell pod
kubectl apply -f manifest.yamlApply YAML manifest
kubectl delete -f manifest.yamlHapus resource dari YAML
kubectl delete pod nama_podHapus pod
kubectl scale deploy web --replicas=5Scale deployment
kubectl rollout status deploy webCek status rollout
kubectl rollout history deploy webLihat history revisi
kubectl rollout undo deploy webRollback ke revisi sebelumnya
kubectl top podsResource usage pod
kubectl top nodesResource usage node
kubectl port-forward svc/web 8080:80Forward port lokal ke service
kubectl create namespace devBuat namespace
kubectl api-resourcesList semua resource type

9. K8s YAML Manifests

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  namespace: default
  labels:
    app: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: web
          image: myapp:v1.2.0
          ports:
            - containerPort: 3000
          env:
            - name: NODE_ENV
              value: "production"
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: db-secret
                  key: password
          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"
            limits:
              cpu: "500m"
              memory: "256Mi"
          livenessProbe:
            httpGet:
              path: /health
              port: 3000
            initialDelaySeconds: 15
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /ready
              port: 3000
            initialDelaySeconds: 5
            periodSeconds: 5

Service

apiVersion: v1
kind: Service
metadata:
  name: web-service
  namespace: default
spec:
  selector:
    app: web
  type: ClusterIP
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000
---
# Service type LoadBalancer (expose ke internet)
apiVersion: v1
kind: Service
metadata:
  name: web-lb
spec:
  selector:
    app: web
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000

Tipe Service

TipeKeteranganGunakan Untuk
ClusterIPIP internal cluster sajaInternal communication
NodePortExpose di port node (30000-32767)Development / testing
LoadBalancerExternal load balancer cloudProduction (GCP, AWS, Azure)
ExternalNameCNAME ke external serviceReferensi service di luar cluster

10. Rolling Updates & Rollbacks

⚠️ Peringatan

Selalu set maxUnavailable: 0 untuk zero-downtime deployment. Gunakan readinessProbe untuk memastikan pod baru siap sebelum traffic dipindahkan.

# Update image deployment
kubectl set image deploy/web web=myapp:v1.3.0

# Cek status rollout
kubectl rollout status deploy/web

# Lihat history revisi
kubectl rollout history deploy/web

# Lihat detail revisi tertentu
kubectl rollout history deploy/web --revision=2

# Rollback ke revisi sebelumnya
kubectl rollout undo deploy/web

# Rollback ke revisi tertentu
kubectl rollout undo deploy/web --to-revision=3

# Pause rollout (untuk multi-update sekaligus)
kubectl rollout pause deploy/web

# Resume rollout
kubectl rollout resume deploy/web

Strategy Types

StrategyKeterangan
RollingUpdateUpdate bertahap, zero-downtime (default)
RecreateHapus semua pod lama, baru buat baru (ada downtime)

11. Resource Limits & Requests

Satuan Resource

ResourceUnitKeterangan
CPUm (millicpu)1000m = 1 CPU core
CPU0.5Setengah CPU core
MemoryMiMebibyte (1024 KiB)
MemoryGiGibibyte (1024 MiB)
Ephemeral StorageGiDisk space pod sementara
# Contoh resource spec di Deployment
resources:
  requests:
    cpu: "250m"       # Minimum yang dijamin
    memory: "256Mi"
  limits:
    cpu: "1000m"      # Maksimum yang diizinkan
    memory: "512Mi"

# Jika melebihi limit:
# - CPU: di-throttle (diperlambat)
# - Memory: OOMKilled (pod di-kill)

Resource Quota per Namespace

apiVersion: v1
kind: ResourceQuota
metadata:
  name: dev-quota
  namespace: dev
spec:
  hard:
    requests.cpu: "4"
    requests.memory: "8Gi"
    limits.cpu: "8"
    limits.memory: "16Gi"
    pods: "20"

12. ConfigMaps & Secrets

ConfigMap

# Buat ConfigMap dari literal
kubectl create configmap app-config \
  --from-literal=DB_HOST=postgres \
  --from-literal=DB_PORT=5432 \
  --from-literal=CACHE_TTL=300

# Buat ConfigMap dari file
kubectl create configmap nginx-conf \
  --from-file=nginx.conf

# YAML ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  DB_HOST: "postgres"
  DB_PORT: "5432"
  CACHE_TTL: "300"
  nginx.conf: |
    server {
      listen 80;
      location / {
        proxy_pass http://web:3000;
      }
    }

Secret

# Buat Secret dari literal
kubectl create secret generic db-secret \
  --from-literal=username=admin \
  --from-literal=password=s3cretP@ss

# Buat Secret dari file
kubectl create secret generic tls-secret \
  --from-file=tls.crt=server.crt \
  --from-file=tls.key=server.key

# YAML Secret (nilai harus base64 encoded)
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  username: YWRtaW4=        # echo -n 'admin' | base64
  password: czNjcmV0UEBzcw==  # echo -n 's3cretP@ss' | base64

Menggunakan ConfigMap & Secret di Pod

# Sebagai environment variable
env:
  - name: DB_HOST
    valueFrom:
      configMapKeyRef:
        name: app-config
        key: DB_HOST
  - name: DB_PASSWORD
    valueFrom:
      secretKeyRef:
        name: db-secret
        key: password

# Sebagai volume mount
volumes:
  - name: config-vol
    configMap:
      name: nginx-conf
containers:
  - name: nginx
    volumeMounts:
      - name: config-vol
        mountPath: /etc/nginx/conf.d

13. Helm Basics

💡 Tips

Helm adalah package manager untuk Kubernetes. Mengelola manifest YAML yang kompleks menjadi satu unit yang mudah di-deploy, di-update, dan di-rollback.

Helm Commands

PerintahKeterangan
helm repo add stable https://charts.helm.sh/stableTambah chart repository
helm repo updateUpdate local repo cache
helm search repo nginxCari chart di repo
helm search hub wordpressCari di Artifact Hub
helm install my-release stable/nginxInstall chart
helm install my-release stable/nginx -f values.yamlInstall dengan custom values
helm install my-release stable/nginx --set replicas=3Install dengan set value
helm upgrade my-release stable/nginx -f values.yamlUpgrade release
helm rollback my-release 1Rollback ke revisi 1
helm listList semua release
helm list -AList release semua namespace
helm status my-releaseStatus release
helm history my-releaseHistory revisi
helm uninstall my-releaseHapus release
helm template my-release stable/nginxRender template (preview YAML)
helm create my-chartBuat chart baru
helm lint my-chartValidasi chart
helm package my-chartPackage chart ke .tgz
← Sebelumnya Cheatsheet ESP32 & IoT Selanjutnya → Artikel Lainnya
🔍 Zoom
100%
🎨 Tema