Panduan Teknis dan Troubleshooting Docker
Daftar Isi
- Pengenalan
- Instalasi
- Perintah Dasar Docker
- Manajemen Container
- Docker Images
- Docker Volumes
- Docker Networks
- Docker Compose
- Troubleshooting
- Praktik Terbaik
Pengenalan
Docker adalah platform containerisasi yang memungkinkan developer untuk mengemas aplikasi dan dependensinya ke dalam container. Panduan ini mencakup instalasi, penggunaan dasar, dan troubleshooting untuk Docker pada sistem Linux.
Konsep Kunci
- Container: Paket eksekusi yang ringan dan mandiri yang mencakup semua yang dibutuhkan untuk menjalankan aplikasi
- Image: Template read-only yang digunakan untuk membuat container
- Dockerfile: File teks dengan instruksi untuk membangun Docker image
- Registry: Sistem penyimpanan untuk Docker images (Docker Hub, registry pribadi)
Instalasi
Prasyarat
# Update paket sistem
sudo apt update && sudo apt upgrade -y # Ubuntu/Debian
sudo dnf update -y # CentOS/RHEL/Fedora
# Install paket yang diperlukan
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release # Ubuntu/Debian
sudo dnf install -y curl dnf-plugins-core # CentOS/RHEL/Fedora
Instalasi Docker pada Ubuntu/Debian
# Tambahkan GPG key resmi Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Siapkan repository stabil
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Install Docker Engine
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Instalasi Docker pada CentOS/RHEL/Fedora
# Tambahkan GPG key resmi Docker
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
# Install Docker Engine
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Setup Pasca-Instalasi
# Start dan enable layanan Docker
sudo systemctl start docker
sudo systemctl enable docker
# Tambahkan user saat ini ke grup docker (opsional, untuk menjalankan docker tanpa sudo)
sudo usermod -aG docker $USER
# Verifikasi instalasi
docker --version
docker run hello-world
Verifikasi Instalasi
# Periksa status layanan Docker
sudo systemctl status docker
# Periksa info Docker
docker info
# Test dengan container sederhana
docker run --rm alpine echo "Docker berfungsi!"
Perintah Dasar Docker
Manajemen Image
# Cari image
docker search nginx
# Pull image
docker pull nginx:latest
# Daftar image lokal
docker images
docker image ls
# Hapus image
docker rmi nginx:latest
docker image rm nginx:latest
# Hapus semua image yang tidak digunakan
docker image prune -a
Siklus Hidup Container
# Jalankan container
docker run -d --name web-server -p 8080:80 nginx
# Daftar container yang berjalan
docker ps
# Daftar semua container (termasuk yang berhenti)
docker ps -a
# Hentikan container
docker stop web-server
# Jalankan container yang berhenti
docker start web-server
# Restart container
docker restart web-server
# Hapus container
docker rm web-server
# Hapus semua container yang berhenti
docker container prune
Interaksi Container
# Lihat log container
docker logs web-server
docker logs -f web-server # Ikuti log
# Eksekusi perintah dalam container yang berjalan
docker exec -it web-server /bin/bash
# Salin file ke/dari container
docker cp local-file.txt web-server:/path/in/container/
docker cp web-server:/path/in/container/file.txt local-file.txt
# Lihat detail container
docker inspect web-server
Manajemen Container
Menjalankan Container dengan Opsi
# Container dasar dengan port mapping
docker run -d --name my-app -p 3000:3000 node:18
# Container dengan volume mounting
docker run -d --name data-container -v /host/path:/container/path nginx
# Container dengan variabel lingkungan
docker run -d --name db -e MYSQL_ROOT_PASSWORD=password mysql:8.0
# Container dengan batasan sumber daya
docker run -d --name limited-app --memory="512m" --cpus="1.0" nginx
# Container dengan kebijakan restart
docker run -d --name always-up --restart unless-stopped nginx
# Mode detached dengan penghapusan otomatis
docker run --rm -d --name temp-container nginx
Pemantauan Container
# Lihat penggunaan sumber daya container
docker stats
# Lihat informasi detail container
docker inspect container-name
# Lihat proses container
docker top container-name
# Lihat pemetaan port container
docker port container-name
Docker Images
Membangun Image Kustom
# Contoh Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
# Build image
docker build -t my-app:1.0 .
# Build dengan Dockerfile di direktori berbeda
docker build -t my-app:1.0 -f /path/to/Dockerfile /path/to/context
# Build dengan argumen build
docker build --build-arg NODE_ENV=production -t my-app:prod .
Optimasi Image
# Contoh multi-stage build
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM node:18-alpine AS production
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/app.js"]
Manajemen Image
# Tag image
docker tag my-app:1.0 my-registry/my-app:1.0
# Push ke registry
docker push my-registry/my-app:1.0
# Pull dari registry
docker pull my-registry/my-app:1.0
# Lihat riwayat image
docker history my-app:1.0
# Export/import image
docker save -o my-app.tar my-app:1.0
docker load -i my-app.tar
Docker Volumes
Jenis Volume
# Named volume (dikelola oleh Docker)
docker run -d --name db -v db-data:/var/lib/mysql mysql:8.0
# Bind mount (direktori host)
docker run -d --name web -v /host/www:/usr/share/nginx/html nginx
# Anonymous volume
docker run -d --name temp -v /data busybox
Manajemen Volume
# Daftar volume
docker volume ls
# Buat volume
docker volume create my-volume
# Inspeksi volume
docker volume inspect my-volume
# Hapus volume
docker volume rm my-volume
# Hapus volume yang tidak digunakan
docker volume prune
Backup dan Restore Volume
# Backup volume
docker run --rm -v my-volume:/data -v $(pwd):/backup alpine tar czf /backup/my-volume-backup.tar.gz -C /data .
# Restore volume
docker run --rm -v my-volume:/data -v $(pwd):/backup alpine tar xzf /backup/my-volume-backup.tar.gz -C /data
Docker Networks
Jenis Network
# Bridge network (default)
docker network create my-bridge-network
# Host network
docker run --network=host nginx
# None network
docker run --network=none busybox
# Overlay network (untuk Swarm)
docker network create --driver overlay my-overlay-network
Manajemen Network
# Daftar network
docker network ls
# Buat network
docker network create --driver bridge my-network
# Hubungkan container ke network
docker network connect my-network container-name
# Putuskan container dari network
docker network disconnect my-network container-name
# Inspeksi network
docker network inspect my-network
# Hapus network
docker network rm my-network
Networking Lanjutan
# Network dengan subnet kustom
docker network create --subnet=192.168.0.0/16 my-custom-network
# Network dengan IP alias
docker run --network my-custom-network --ip 192.168.0.10 nginx
# Port mapping dengan IP spesifik
docker run -p 192.168.1.100:8080:80 nginx
Docker Compose
Instalasi Docker Compose
# Docker Compose v2 (termasuk dengan Docker Desktop)
# Untuk instalasi manual di Linux:
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Contoh File Docker Compose
# docker-compose.yml
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- app-network
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: myapp
volumes:
- db-data:/var/lib/mysql
networks:
- app-network
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
networks:
- app-network
depends_on:
- db
volumes:
db-data:
networks:
app-network:
driver: bridge
Perintah Docker Compose
# Start layanan
docker-compose up -d
# Stop layanan
docker-compose down
# Lihat log
docker-compose logs -f
# Scale layanan
docker-compose up -d --scale web=3
# Rebuild layanan
docker-compose up -d --build
# Eksekusi perintah dalam layanan
docker-compose exec web /bin/bash
# Lihat penggunaan sumber daya
docker-compose top
# Pull image
docker-compose pull
# Hapus container yang berhenti
docker-compose rm
Troubleshooting
Masalah Umum dan Solusi
1. Docker Daemon Tidak Berjalan
# Error: Cannot connect to the Docker daemon
sudo systemctl start docker
sudo systemctl enable docker
# Periksa status
sudo systemctl status docker
# Periksa log
sudo journalctl -u docker.service
2. Masalah Izin Akses Ditolak
# Error: permission denied while trying to connect to Docker daemon
# Tambahkan user ke grup docker
sudo usermod -aG docker $USER
# Logout dan login kembali, atau gunakan:
newgrp docker
# Alternatif: Jalankan dengan sudo
sudo docker ps
3. Port Sudah Digunakan
# Error: port is already allocated
# Cari proses yang menggunakan port
sudo netstat -tulpn | grep :8080
sudo lsof -i :8080
# Hentikan proses
sudo kill -9 <PID>
# Atau gunakan port berbeda
docker run -p 8081:80 nginx
4. Container Tidak Mau Start
# Periksa log container
docker logs container-name
# Periksa status container
docker ps -a
# Inspeksi container untuk error
docker inspect container-name
# Jalankan dalam mode interaktif untuk debugging
docker run -it --entrypoint /bin/bash image-name
5. Kehabisan Ruang Disk
# Periksa penggunaan disk Docker
docker system df
# Bersihkan sumber daya yang tidak digunakan
docker system prune -a
# Bersihkan volume (hati-hati!)
docker volume prune
# Bersihkan build cache
docker builder prune -a
6. Masalah Jaringan
# Periksa konektivitas jaringan
docker exec container-name ping google.com
# Periksa resolusi DNS
docker exec container-name nslookup google.com
# Reset jaringan Docker
docker network prune
# Restart Docker daemon
sudo systemctl restart docker
7. Masalah Volume Mount
# Periksa volume mounts
docker inspect container-name | grep Mounts
# Verifikasi direktori host ada
ls -la /host/path
# Periksa izin
ls -ld /host/path
# Perbaiki izin
sudo chown -R $USER:$USER /host/path
8. Masalah Pull Image
# Periksa konektivitas jaringan
ping registry-1.docker.io
# Bersihkan cache Docker
docker system prune -a
# Restart Docker daemon
sudo systemctl restart docker
# Periksa DNS
nslookup registry-1.docker.io
# Gunakan registry mirror yang berbeda
sudo systemctl edit docker
# Tambahkan:
# [Service]
# ExecStart=
# ExecStart=/usr/bin/dockerd --registry-mirror=https://mirror.gcr.io
9. Masalah Sumber Daya Container
# Periksa penggunaan sumber daya container
docker stats
# Lihat batasan container
docker inspect container-name | grep -i memory
# Tingkatkan batasan memori
docker run --memory="2g" nginx
# Periksa sumber daya sistem
free -h
df -h
10. Masalah Docker Build
# Bersihkan build cache
docker builder prune -a
# Periksa build context
docker build --no-cache .
# Debug proses build
docker build --progress=plain .
# Periksa sintaks Dockerfile
docker build --dry-run .
Perintah Debugging
# Informasi sistem
docker info
docker version
# Debugging container
docker inspect container-name
docker logs container-name
docker exec -it container-name /bin/bash
# Debugging jaringan
docker network inspect network-name
docker exec container-name ip addr
docker exec container-name route
# Debugging volume
docker volume inspect volume-name
docker exec container-name ls -la /mount/point
# Pemantauan performa
docker stats --no-stream
docker system df
Analisis Log
# Log Docker daemon
sudo journalctl -u docker.service -f
# Log container dengan timestamp
docker logs -t container-name
# Ikuti log dengan filter
docker logs -f container-name | grep ERROR
# Export log
docker logs container-name > container.log
Praktik Terbaik
Praktik Keamanan
# Gunakan non-root user dalam container
RUN addgroup -g 1001 -S appuser && \
adduser -u 1001 -S appuser
USER appuser
# Gunakan versi image spesifik
FROM node:18.17.0-alpine
# Pindai image untuk kerentanan
docker scan my-app:1.0
# Gunakan .dockerignore untuk mengecualikan file sensitif
echo "node_modules" > .dockerignore
echo ".git" >> .dockerignore
echo "*.secret" >> .dockerignore
Optimasi Performa
# Gunakan multi-stage builds
FROM node:18-alpine AS builder
# ... langkah build
FROM node:18-alpine AS production
COPY --from=builder /app/dist ./dist
# Gunakan .dockerignore untuk mengurangi build context
echo "node_modules" > .dockerignore
echo "*.log" >> .dockerignore
# Minimalkan jumlah layer
RUN apt-get update && apt-get install -y \
curl \
wget \
&& rm -rf /var/lib/apt/lists/*
Manajemen Sumber Daya
# Tetapkan batasan memori
docker run --memory="512m" --memory-swap="1g" nginx
# Tetapkan batasan CPU
docker run --cpus="1.5" nginx
# Tetapkan kebijakan restart
docker run --restart=unless-stopped nginx
# Gunakan health check
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost/ || exit 1
Pemantauan dan Logging
# Gunakan structured logging
docker run --log-driver=json-file --log-opt max-size=10m nginx
# Pantau kesehatan container
docker ps --format "table {{.Names}}\t{{.Status}}"
# Siapkan rotasi log
docker run --log-opt max-size=10m --log-opt max-file=3 nginx
Backup dan Pemulihan
# Backup container
docker export container-name > container-backup.tar
# Backup image
docker save -o images-backup.tar image1 image2
# Backup volume
docker run --rm -v volume-name:/data -v $(pwd):/backup alpine tar czf /backup/volume-backup.tar.gz -C /data .
Referensi Cepat
Perintah Esensial
# Images
docker pull <image> # Pull image
docker build -t <tag> . # Build image
docker images # Daftar image
docker rmi <image> # Hapus image
# Containers
docker run <options> <image> # Jalankan container
docker ps # Daftar container yang berjalan
docker ps -a # Daftar semua container
docker stop <container> # Hentikan container
docker rm <container> # Hapus container
docker logs <container> # Lihat log
# Volumes
docker volume ls # Daftar volume
docker volume create <name> # Buat volume
docker volume rm <name> # Hapus volume
# Networks
docker network ls # Daftar network
docker network create <name> # Buat network
docker network rm <name> # Hapus network
# System
docker system df # Tampilkan penggunaan disk
docker system prune -a # Bersihkan sistem
docker info # Informasi sistem
Opsi Umum
-d # Mode detached
-i # Mode interaktif
-t # Alokasikan TTY
-p <host>:<container> # Port mapping
-v <host>:<container> # Volume mount
-e <KEY>=<VALUE> # Variabel lingkungan
--name <name> # Nama container
--restart <policy> # Kebijakan restart
--memory=<limit> # Batasan memori
--cpus=<limit> # Batasan CPU
Kesimpulan
Panduan ini memberikan gambaran komprehensif tentang instalasi, manajemen, dan troubleshooting Docker. Untuk topik yang lebih lanjut dan kasus penggunaan spesifik, rujuk ke dokumentasi resmi Docker di https://docs.docker.com/.
Ingat untuk selalu menguji konfigurasi Docker di lingkungan pengembangan sebelum mengdeploy ke produksi, dan ikuti praktik keamanan terbaik untuk memastikan keamanan container.