Docker telah menjadi standar de facto untuk containerization dalam modern development workflow. Debian 12 (Bookworm) menyediakan dukungan Docker yang sangat baik dengan repository official yang up-to-date. Artikel ini akan membahas instalasi Docker di Debian 12 secara lengkap beserta konfigurasi optimal untuk development dan production.
Persiapan Sebelum Instalasi
Update Sistem
# Update package list dan upgrade existing packages
sudo apt update
sudo apt upgrade -y
Install dependencies yang dibutuhkan
sudo apt install -y ca-certificates curl gnupg lsb-release
Hapus Docker Versi Lama (jika ada)
# Hapus versi Docker lama jika terinstall dari repository Debian
sudo apt remove docker.io docker-doc docker-compose podman-docker containerd runc
Hapus juga file konfigurasi lama (opsional)
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
Instalasi Docker dari Official Repository
Menggunakan official Docker repository direkomendasikan untuk mendapatkan versi terbaru.
1. Add Docker GPG Key
# Buat directory untuk keyrings
sudo install -m 0755 -d /etc/apt/keyrings
Download dan add Docker GPG key
curl -fsSL
https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
Set permission keyring
sudo chmod a+r /etc/apt/keyrings/docker.gpg
2. Add Docker Repository
# Add repository ke APT sources
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Update package list
sudo apt update
3. Install Docker Engine
# Install Docker Engine, CLI, containerd, dan Docker Compose
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
4. Verifikasi Instalasi
# Cek Docker version
docker --version
# Output: Docker version 24.0.7, build afdd53b
Cek Docker Compose version
docker compose version
Output: Docker Compose version v2.21.0
Test dengan running hello-world container
sudo docker run hello-world
Output akan menampilkan pesan "Hello from Docker!"
Konfigurasi User Permissions
Secara default, Docker hanya bisa dijalankan oleh root. Untuk security dan kemudahan, tambahkan user ke docker group.
1. Add User ke Docker Group
# Tambahkan current user ke docker group
sudo usermod -aG docker $USER
Verifikasi user sudah dalam group
groups $USER
Apply group membership (logout dan login kembali, atau gunakan):
newgrp docker
Test tanpa sudo
docker run hello-world
2. Setup Docker Rootless Mode (Opsional tapi Recommended untuk Security)
Rootless mode memungkinkan Docker berjalan tanpa root privileges.
# Install uidmap
sudo apt install -y uidmap
Setup rootless Docker
dockerd-rootless-setuptool.sh install
Atau setup manual
curl -fsSL
https://get.docker.com/rootless | sh
Export environment variables (tambahkan ke ~/.bashrc)
export PATH=/usr/bin:$PATH
export DOCKER_HOST=unix:///run/user/$(id - u)/docker.sock
Start rootless daemon
dockerd-rootless.sh
Konfigurasi Docker Daemon
1. Konfigurasi Dasar daemon.json
# Buat atau edit konfigurasi Docker
sudo nano /etc/docker/daemon.json
Konfigurasi optimal untuk development:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"storage-driver": "overlay2",
"exec-opts": ["native.cgroupdriver=systemd"],
"live-restore": true,
"userland-proxy": false,
"experimental": false,
"metrics-addr": "0.0.0.0:9323",
"default-address-pools": [
{
"base": "172.30.0.0/16",
"size": 24
}
]
}
Penjelasan opsi:
– log-driver: Format logging container
– storage-driver: overlay2 adalah driver tercepat untuk modern kernels
– live-restore: Container tetap berjalan saat daemon restart
– userland-proxy: Disable untuk performance lebih baik
– default-address-pools: Pool IP untuk Docker networks
2. Reload Docker Daemon
# Reload konfigurasi
sudo systemctl daemon-reload
sudo systemctl restart docker
Cek status
sudo systemctl status docker
3. Enable Docker Start on Boot
# Enable Docker service
sudo systemctl enable docker
Enable containerd (dependency Docker)
sudo systemctl enable containerd
Optimasi Storage dan Performance
1. Setup Docker Data Directory di Disk Terpisah (Opsional)
# Stop Docker
sudo systemctl stop docker
sudo systemctl stop containerd
Copy data ke lokasi baru (misal: /mnt/docker-data)
sudo mkdir -p /mnt/docker-data
sudo rsync -aP /var/lib/docker/ /mnt/docker-data/
Backup dan hapus data lama
sudo mv /var/lib/docker /var/lib/docker.old
Create symlink
sudo ln -s /mnt/docker-data /var/lib/docker
Start Docker kembali
sudo systemctl start containerd
sudo systemctl start docker
Verifikasi
docker info | grep "Docker Root Dir"
2. Optimasi untuk SSD
# Edit daemon.json untuk SSD optimization
sudo nano /etc/docker/daemon.json
Tambahkan:
{
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
3. Clean Up Docker Resources
# Hapus containers yang sudah stopped
docker container prune -f
Hapus images yang tidak terpakai
docker image prune -a -f
Hapus volumes yang tidak terpakai
docker volume prune -f
Hapus networks yang tidak terpakai
docker network prune -f
Hapus semua (build cache, containers, images, networks)
docker system prune -a -f --volumes
Hapus spesifik resource lama
Hapus images lebih dari 7 hari
docker image prune -a --filter "until=168h" -f
Docker Compose untuk Development
1. Contoh docker-compose.yml untuk Web Development
version: '3.8'services: web: build: . ports:
- "8080:80"
volumes: - ./html:/usr/share/nginx/html:ro - ./nginx.conf:/etc/nginx/nginx.conf:ro depends_on: - db networks: - frontend - backenddb:
image: postgres:15-alpine
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- postgres_data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
networks: - backend healthcheck: test: ["CMD-SHELL", "pg_isready -U user -d myapp"] interval: 10s timeout: 5s retries: 5redis:
image: redis:7-alpine
volumes:
- redis_data:/data
networks: - backend command: redis-server --appendonly yesvolumes:
postgres_data:
redis_data:networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true2. Docker Compose Commands
# Start all services docker compose up -dBuild dan start
docker compose up --build -d
Stop services
docker compose down
Stop dan hapus volumes (hati-hati!)
docker compose down -v
View logs
docker compose logs -f
View logs service spesifik
docker compose logs -f web
Scale service
docker compose up -d --scale web=3
Execute command di container
docker compose exec db psql -U user -d myapp
Restart service
docker compose restart web
Update images dan restart
docker compose pull docker compose up -d
Networking di Docker
1. Custom Bridge Network
# Buat custom network docker network create --driver bridge myapp-networkRun container dengan custom network
docker run -d --name web --network myapp-network nginx
Connect container ke network
docker network connect myapp-network existing-container
Inspect network
docker network inspect myapp-network
2. Expose Port dengan Range
# Expose port range (berguna untuk development) docker run -d -p 8080-8090:8080-8090 myapp3. Container-to-Container Communication
# Gunakan container name sebagai hostname docker run -d --name database postgres docker run -d --name webapp --link database:db myappDi dalam webapp container, akses database via hostname "db"
Security Best Practices
1. Run Container sebagai Non-Root User
# Dockerfile example FROM node:18-alpineCreate non-root user
RUN addgroup -g 1001 -S nodejs RUN adduser -S nodejs -u 1001
WORKDIR /app COPY package*.json ./ RUN npm ci --only=production
USER nodejs
COPY . .
EXPOSE 3000 CMD ["node", "server.js"]
2. Limit Container Resources
# Limit CPU dan Memory docker run -d \ --memory="512m" \ --memory-swap="1g" \ --cpus="1.5" \ --name limited-app \ myappLimit juga di docker-compose.yml
3. Read-Only Root Filesystem
# Run container dengan read-only root filesystem docker run -d --read-only \ --tmpfs /tmp:rw,noexec,nosuid,size=100m \ --tmpfs /var/cache:rw,noexec,nosuid,size=100m \ nginx4. Scan Images untuk Vulnerabilities
# Install Trivy untuk scanning sudo apt install -y trivyScan image
trivy image myapp:latest
Scan dengan severity filter
trivy image --severity HIGH,CRITICAL myapp:latest
Backup dan Restore Docker Data
1. Backup Container
# Export container ke tar docker export -o myapp-backup.tar myapp-containerAtau commit sebagai image baru
docker commit myapp-container myapp-backup:v1.0
Save image ke tar
docker save -o myapp-image.tar myapp-backup:v1.0
2. Restore Container
# Import dari tar cat myapp-backup.tar | docker import - myapp:restoredLoad image dari tar
docker load -i myapp-image.tar
Run container dari image yang di-load
docker run -d myapp:restored
3. Backup Volumes
# Backup named volume docker run --rm -v myapp_data:/data -v $(pwd):/backup alpine tar czf /backup/backup.tar.gz -C /data .Restore named volume
docker run --rm -v myapp_data:/data -v $(pwd):/backup alpine sh -c "cd /data && tar xzf /backup/backup.tar.gz"
Troubleshooting Docker
1. Permission Denied saat Run Docker
# Error: Got permission denied while trying to connect to Docker daemonSolusi: pastikan user dalam docker group
groups $USER
Jika belum, tambahkan dan relogin
sudo usermod -aG docker $USER newgrp docker
2. Container Tidak Bisa Akses Internet
# Check Docker network docker network ls docker network inspect bridgeRestart Docker networking
sudo systemctl restart docker
Atau flush iptables rules (hati-hati!)
sudo iptables -F sudo iptables -X sudo systemctl restart docker
3. Storage Driver Issues
# Check storage driver docker info | grep "Storage Driver"Jika menggunakan vfs (slow), switch ke overlay2
Pastikan kernel support overlay2
sudo modprobe overlay
Edit daemon.json untuk force storage driver
{ "storage-driver": "overlay2" }
4. High Disk Usage
# Analisis disk usage docker system dfHapus resources tidak terpakai
docker system prune -a
Limit log size di daemon.json
{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }
Kesimpulan
Docker di Debian 12 Bookworm berjalan sangat baik dengan repository official yang memberikan versi terbaru. Dengan konfigurasi yang tepat:
- Docker Engine berjalan optimal dengan overlay2 storage driver
- Security terjaga dengan user permissions dan rootless mode
- Resource management efisien dengan limits dan cleanup routines
- Development workflow streamlined dengan Docker Compose
- Production ready dengan proper networking dan security settings
Untuk development modern, Docker adalah tool yang hampir wajib dimiliki. Dengan mengikuti panduan ini, Anda memiliki setup Docker yang robust dan secure di Debian 12.
Jangan lupa untuk secara berkala update Docker dengan
sudo apt update && sudo apt upgradedan monitor resource usage untuk menjaga performa sistem tetap optimal.
Ditulis oleh
Hendra Wijaya