1. Docker Images Commands
💡 Tips
Gunakan docker image prune secara berkala untuk menghapus image yang tidak terpakai dan menghemat disk space.
| Perintah | Keterangan |
docker images | List semua image lokal |
docker pull nginx:latest | Download 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_name | Hapus image |
docker rmi $(docker images -q) | Hapus semua image |
docker tag myapp:v1 registry/myapp:v1 | Buat tag baru untuk image |
docker push registry/myapp:v1 | Push image ke registry |
docker image prune | Hapus dangling images |
docker image prune -a | Hapus semua image tidak terpakai |
docker history myapp:v1 | Lihat layer history image |
docker inspect myapp:v1 | Detail metadata image |
docker save -o myapp.tar myapp:v1 | Export image ke file tar |
docker load -i myapp.tar | Load image dari file tar |
2. Docker Containers Commands
| Perintah | Keterangan |
docker run -d --name web nginx | Jalankan container di background |
docker run -it ubuntu bash | Jalankan container interaktif |
docker run -p 8080:80 nginx | Map port host:container |
docker run -v /host:/container nginx | Mount volume |
docker run -e MY_VAR=value myapp | Set environment variable |
docker run --rm myapp | Hapus otomatis setelah selesai |
docker run --network mynet myapp | Jalankan di network tertentu |
docker ps | List container yang berjalan |
docker ps -a | List semua container |
docker stop container_id | Stop container |
docker start container_id | Start container yang sudah ada |
docker restart container_id | Restart container |
docker rm container_id | Hapus container |
docker rm -f container_id | Force hapus container yang jalan |
docker logs -f container_id | Follow log output |
docker logs --tail 100 container_id | Lihat 100 baris log terakhir |
docker exec -it container_id bash | Masuk shell container |
docker exec container_id cat /etc/os-release | Jalankan perintah di container |
docker cp file.txt container_id:/app/ | Copy file ke container |
docker stats | Monitor CPU, memori, network real-time |
docker top container_id | Lihat proses di dalam container |
docker inspect container_id | Detail metadata container |
docker system df | Cek penggunaan disk Docker |
docker system prune -a | Bersihkan semua resource tidak terpakai |
3. Docker Networking
Tipe Network
| Tipe | Keterangan | Gunakan Untuk |
bridge | Default, isolasi antar container | Single-host app |
host | Container pakai network host langsung | Performance tinggi |
none | Tidak ada network | Isolasi total |
overlay | Cross-host networking (Swarm) | Multi-host cluster |
macvlan | Container punya MAC address sendiri | Legacy 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
| Tipe | Contoh | Keterangan |
| Named Volume | -v mydata:/var/lib/data | Dikelola Docker, persistent |
| Bind Mount | -v /host/path:/container/path | Mount folder host langsung |
| tmpfs | --tmpfs /app/tmp | RAM only, hilang saat restart |
| Anonymous Volume | -v /container/path | Auto-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
| Instruksi | Keterangan | Contoh |
FROM | Base image | FROM node:20-alpine |
WORKDIR | Set working directory | WORKDIR /app |
COPY | Copy file dari context | COPY package*.json ./ |
RUN | Jalankan perintah saat build | RUN npm install |
ENV | Set environment variable | ENV NODE_ENV=production |
EXPOSE | Deklarasi port | EXPOSE 3000 |
CMD | Default command saat run | CMD ["node", "server.js"] |
ENTRYPOINT | Command utama, tidak bisa di-override mudah | ENTRYPOINT ["python"] |
ARG | Build-time variable | ARG VERSION=1.0 |
VOLUME | Mount point | VOLUME ["/data"] |
USER | Set user saat run | USER node |
HEALTHCHECK | Cek kesehatan container | HEALTHCHECK CMD curl -f http://localhost |
ADD | Copy + auto-extract tar | ADD app.tar.gz /app/ |
LABEL | Metadata image | LABEL 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
| Perintah | Keterangan |
docker compose up -d | Jalankan semua service di background |
docker compose down | Stop dan hapus semua service |
docker compose down -v | Stop + hapus volumes juga |
docker compose ps | Status service |
docker compose logs -f | Follow log semua service |
docker compose logs -f web | Follow log service tertentu |
docker compose build | Build semua service |
docker compose pull | Pull image terbaru |
docker compose exec web bash | Masuk shell service |
docker compose restart | Restart semua service |
docker compose config | Validasi dan lihat compose config |
docker compose up --scale web=3 | Scale 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
| Komponen | Keterangan |
| Cluster | Kumpulan node yang menjalankan container |
| Node | Worker machine (VM/physical) yang menjalankan pod |
| Pod | Unit terkecil K8s, berisi 1+ container |
| Deployment | Manage replica set dan rolling update |
| Service | Expose pod dengan IP stabil + load balancing |
| Ingress | HTTP routing dari luar cluster ke service |
| Namespace | Virtual cluster untuk isolasi resource |
| ConfigMap | Simpan konfigurasi non-sensitive |
| Secret | Simpan data sensitif (password, token) |
| PersistentVolume (PV) | Storage cluster-level |
| PersistentVolumeClaim (PVC) | Request storage dari PV |
| StatefulSet | Untuk stateful app (database, cache) |
| DaemonSet | Jalankan 1 pod di setiap node |
| Job / CronJob | Task sekali jalan atau terjadwal |
| HPA | Horizontal 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
| Perintah | Keterangan |
kubectl get pods | List pod di namespace saat ini |
kubectl get pods -A | List pod semua namespace |
kubectl get pods -o wide | Detail pod (IP, node) |
kubectl get pods -l app=web | Filter pod by label |
kubectl get all | List semua resource |
kubectl get svc,deploy,pods | List multi resource type |
kubectl describe pod nama_pod | Detail lengkap pod |
kubectl logs nama_pod | Lihat log pod |
kubectl logs -f nama_pod | Follow log |
kubectl logs nama_pod -c mycontainer | Log container tertentu |
kubectl exec -it nama_pod -- bash | Masuk shell pod |
kubectl apply -f manifest.yaml | Apply YAML manifest |
kubectl delete -f manifest.yaml | Hapus resource dari YAML |
kubectl delete pod nama_pod | Hapus pod |
kubectl scale deploy web --replicas=5 | Scale deployment |
kubectl rollout status deploy web | Cek status rollout |
kubectl rollout history deploy web | Lihat history revisi |
kubectl rollout undo deploy web | Rollback ke revisi sebelumnya |
kubectl top pods | Resource usage pod |
kubectl top nodes | Resource usage node |
kubectl port-forward svc/web 8080:80 | Forward port lokal ke service |
kubectl create namespace dev | Buat namespace |
kubectl api-resources | List 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
| Tipe | Keterangan | Gunakan Untuk |
ClusterIP | IP internal cluster saja | Internal communication |
NodePort | Expose di port node (30000-32767) | Development / testing |
LoadBalancer | External load balancer cloud | Production (GCP, AWS, Azure) |
ExternalName | CNAME ke external service | Referensi 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
| Strategy | Keterangan |
RollingUpdate | Update bertahap, zero-downtime (default) |
Recreate | Hapus semua pod lama, baru buat baru (ada downtime) |
11. Resource Limits & Requests
Satuan Resource
| Resource | Unit | Keterangan |
| CPU | m (millicpu) | 1000m = 1 CPU core |
| CPU | 0.5 | Setengah CPU core |
| Memory | Mi | Mebibyte (1024 KiB) |
| Memory | Gi | Gibibyte (1024 MiB) |
| Ephemeral Storage | Gi | Disk 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
| Perintah | Keterangan |
helm repo add stable https://charts.helm.sh/stable | Tambah chart repository |
helm repo update | Update local repo cache |
helm search repo nginx | Cari chart di repo |
helm search hub wordpress | Cari di Artifact Hub |
helm install my-release stable/nginx | Install chart |
helm install my-release stable/nginx -f values.yaml | Install dengan custom values |
helm install my-release stable/nginx --set replicas=3 | Install dengan set value |
helm upgrade my-release stable/nginx -f values.yaml | Upgrade release |
helm rollback my-release 1 | Rollback ke revisi 1 |
helm list | List semua release |
helm list -A | List release semua namespace |
helm status my-release | Status release |
helm history my-release | History revisi |
helm uninstall my-release | Hapus release |
helm template my-release stable/nginx | Render template (preview YAML) |
helm create my-chart | Buat chart baru |
helm lint my-chart | Validasi chart |
helm package my-chart | Package chart ke .tgz |