Secara default, sebuah Docker container berjalan tanpa batas alokasi resource. Container tersebut bebas menggunakan seluruh kapasitas CPU...
Secara default, sebuah Docker container berjalan tanpa batas alokasi resource. Container tersebut bebas menggunakan seluruh kapasitas CPU, RAM, dan I/O disk yang tersedia pada host server Linux. Jika salah satu container mengalami kebocoran memori (memory leak) atau beban kerja ekstrem, kernel Linux akan memicu OOM (Out-Of-Memory) Killer yang sering kali mematikan proses penting sistem atau database utama server.
Melalui implementasi Control Groups versi 2 (cgroups v2) di Linux modern, Docker memungkinkan kita menetapkan batasan resource yang ketat, terprediksi, dan aman.
1. Memeriksa Kesiapan Cgroups v2 pada Host Linux
Ubuntu 22.04 ke atas dan kernel Linux modern telah mengaktifkan cgroups v2 secara default. Anda dapat memastikannya dengan perintah:
docker info | grep -i "cgroup"
# Output ideal: Cgroup Version: 2
# Cgroup Driver: systemd
2. Mengatur Batasan Memori (RAM & Swap)
Ada dua parameter utama dalam pembatasan memori container:
--memory(atau-m): Jumlah maksimum RAM fisik yang boleh dikonsumsi container.--memory-reservation: Batas lunak (soft limit). Container boleh menggunakan lebih jika server senggang, tetapi akan dipaksa turun saat host kekurangan RAM.--memory-swap: Total kapasitas RAM + Swap yang diizinkan.
# Menjalankan container Nginx dengan batas RAM 512MB dan Swap 1GB
docker run -d --name web-app --memory="512m" --memory-reservation="256m" --memory-swap="1g" nginx:alpine
3. Mengatur Alokasi CPU (Quota & Pinning)
Untuk mencegah satu container memonopoli 100% core CPU server, gunakan parameter --cpus atau alokasikan core tertentu dengan --cpuset-cpus:
# Membatasi container agar maksimal menggunakan 1.5 core CPU
docker run -d --name worker-node --cpus="1.5" my-worker:latest
# Mengunci container agar hanya berjalan pada core CPU 0 dan 1
docker run -d --name isolated-app --cpuset-cpus="0,1" my-app:latest
4. Konfigurasi Resource Limits pada Docker Compose
Pada lingkungan produksi, batasan resource umumnya dikonfigurasi melalui file docker-compose.yml menggunakan blok deploy.resources:
version: '3.8'
services:
database:
image: postgres:16-alpine
restart: unless-stopped
deploy:
resources:
limits:
cpus: '2.0'
memory: 2048M
reservations:
cpus: '0.5'
memory: 512M
--oom-kill-disable pada container tanpa alokasi memori yang tepat. Mematikan OOM Killer saat container kehabisan RAM dapat menyebabkan proses freeze permanen dan membekukan thread kernel server host.
5. Monitoring Konsumsi Resource Real-Time
Gunakan perintah monitoring bawaan Docker untuk melihat pemakaian resource aktual secara langsung:
# Memantau CPU%, MEM USAGE, MEM%, NET I/O seluruh container aktif
docker stats --no-stream
Kesimpulan
Penerapan resource limits berbasis Cgroups v2 pada Docker adalah standar wajib untuk menjaga stabilitas server produksi. Dengan membatasi RAM, alokasi CPU, dan swap, Anda memastikan setiap microservice berjalan harmonis tanpa saling mengganggu ketersediaan layanan lainnya.
COMMENTS