Lewati ke konten
Kembali ke Blog

Cara Install dan Konfigurasi Docker di Debian 12 Bookworm

· · 9 menit baca

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
  - backend

db:
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: 5

redis:
image: redis:7-alpine
volumes:

  • redis_data:/data
networks:
  - backend
command: redis-server --appendonly yes

volumes:
postgres_data:
redis_data:

networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true

2. Docker Compose Commands

# Start all services
docker compose up -d

Build 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-network

Run 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 myapp

3. Container-to-Container Communication

# Gunakan container name sebagai hostname
docker run -d --name database postgres
docker run -d --name webapp --link database:db myapp

Di dalam webapp container, akses database via hostname "db"

Security Best Practices

1. Run Container sebagai Non-Root User

# Dockerfile example
FROM node:18-alpine

Create 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 \
  myapp

Limit 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 \
  nginx

4. Scan Images untuk Vulnerabilities

# Install Trivy untuk scanning
sudo apt install -y trivy

Scan 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-container

Atau 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:restored

Load 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 daemon

Solusi: 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 bridge

Restart 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 df

Hapus 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:

  1. Docker Engine berjalan optimal dengan overlay2 storage driver
  2. Security terjaga dengan user permissions dan rootless mode
  3. Resource management efisien dengan limits dan cleanup routines
  4. Development workflow streamlined dengan Docker Compose
  5. 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 upgrade dan monitor resource usage untuk menjaga performa sistem tetap optimal.

Ditulis oleh

Hendra Wijaya

Tinggalkan Komentar

Email tidak akan ditampilkan.