Cara Memperbaiki Docker "No Space Left on Device": Panduan Lengkap
Kuasai penelusuran masalah Docker untuk mengatasi error "no space left on device". Pelajari cara memangkas container yang tidak terpakai dengan aman dan merebut kembali ruang penyimpanan yang hilang.
Error Docker "no space left on device" biasanya muncul di saat yang paling buruk: saat deployment, ketika build kritis berlangsung, atau saat menarik image penting. Saya pernah beberapa kali mengalami error ini, dan saya bisa katakan bahwa terburu-buru menghapus file tanpa diagnosis yang tepat adalah resep kehilangan data.
Yang membuat error ini menantang adalah jarang sekali memiliki satu penyebab. Anda bisa berhadapan dengan akumulasi image Docker, log container yang tak terkendali, inode yang habis karena jutaan file kecil, atau bahkan ruang "hantu" yang dikonsumsi oleh file yang sudah dihapus tetapi masih dibuka oleh proses yang berjalan. Setiap skenario membutuhkan solusi yang berbeda.
Itulah mengapa saya selalu menekankan diagnosis sebelum bertindak. Memahami akar masalah memungkinkan Anda menerapkan solusi yang tepat sasaran secara efisien dan menghindari gangguan pada lingkungan produksi. Dalam panduan ini, saya akan memandu Anda melalui pendekatan sistematis untuk mendiagnosis, menyelesaikan, dan mencegah masalah yang menjengkelkan ini.
Jika Anda baru mengenal Docker, saya merekomendasikan kursus Introduction to Docker kami yang bersifat praktis, yang membahas semua hal yang Anda butuhkan untuk memulai kontainerisasi.
Apa Itu Error Docker "No Space Left on Device"?
Ketika Docker menampilkan error ini, itu menandakan dua masalah mendasar pada penyimpanan sistem Anda:
Kehabisan blok disk fisik
Kehabisan inode
Memahami perbedaan antara kedua penyebab ini sangat penting untuk menerapkan solusi yang tepat.
Penyebab utama di balik error “no space left on device”
Penyebab pertama dan paling mudah dipahami adalah kehabisan blok disk fisik. Sistem file Anda kehabisan ruang penyimpanan aktual untuk menulis data. Ini skenario yang lebih intuitif: Anda hanya memenuhi disk dengan image Docker, container, log, atau file lainnya.
Penyebab kedua yang kurang jelas adalah kehabisan inode. Bahkan dengan ruang kosong gigabyte yang tersedia, sistem file Anda dapat kehabisan inode (struktur metadata yang digunakan untuk melacak file dan direktori). Setiap file dan direktori mengonsumsi satu inode, sehingga aplikasi yang membuat jutaan file kecil (pikirkan file sesi PHP atau direktori node_modules milik npm) dapat menghabiskan inode sementara ruang disk masih tersisa.
Memahami storage driver overlay2
Docker umumnya menggunakan storage driver overlay2, yang berbasis OverlayFS Linux. OverlayFS melapiskan banyak direktori pada satu host dan menyajikannya sebagai satu sistem file terpadu. Lapisan image di-mount sebagai direktori bawah yang read-only, sementara setiap container yang berjalan menambahkan lapisan atas yang tipis dan writable. Tampilan gabungan diekspos sebagai satu direktori ke container.
Driver overlay2 secara native mendukung hingga 128 lapisan OverlayFS bagian bawah secara teoritis, tetapi penyimpanan lapisan Docker memberlakukan batas praktis 125 lapisan dasar per image. Ini memungkinkan komposisi image yang efisien dan peningkatan performa untuk operasi seperti docker build dan docker commit.
Meskipun overlay2 dirancang untuk mengonsumsi lebih sedikit inode daripada storage driver sebelumnya, lingkungan Docker yang berulang kali membangun image, menarik lapisan, atau membuat container tetap dapat memberi tekanan besar pada blok disk dan inode seiring waktu, terutama saat image atau lapisan aplikasi berisi banyak file kecil.
Bagaimana error ini muncul bergantung pada lingkungan deployment:
Pada system Linux native, ini memengaruhi sistem file yang mendukung /var/lib/docker.
Pada Docker Desktop untuk Windows atau macOS, keterbatasan ada di dalam image disk mesin virtual Docker (seperti file .raw atau .vhdx), yang menambahkan pertimbangan tambahan saat merebut kembali atau mengubah ukuran penyimpanan.
Langkah 1: Diagnosis Akar Masalah
Sebelum menghapus apa pun, saya selalu memulai dengan diagnosis menyeluruh. Investasi beberapa menit ini dapat menghemat berjam-jam penelusuran masalah dan mencegah kehilangan data yang tidak disengaja.
Periksa kapasitas tingkat sistem
Mulailah dengan memeriksa penggunaan disk host Anda dengan df -H (df singkatan dari disk free):
Perintah ini menampilkan penggunaan disk dalam format yang mudah dibaca manusia. Cari sistem file yang berada pada atau mendekati kapasitas 100%.
Pada instalasi Linux native, perhatikan secara khusus partisi tempat /var/lib/docker berada. Ini biasanya partisi root Anda (/) atau partisi Docker khusus.
Pada Docker Desktop (Windows/Mac), carilah mount sistem file utama (biasanya /dev/sdf atau sejenisnya), yang menampung data VM Docker, alih-alih referensi spesifik ke /var/lib/docker, karena Docker berjalan di dalam mesin virtual.
Selanjutnya, periksa kehabisan inode menggunakan df -i:
Jika Anda melihat penggunaan inode 100% (IUse%) pada sistem file mana pun, Anda telah menemukan masalahnya. Skenario ini mengejutkan umum di server build dan lingkungan CI/CD, di mana Docker berulang kali membuat dan menghancurkan container dengan banyak file kecil.
Metrik
Perintah
Apa yang dicari
Ruang disk
df -H
Partisi dengan penggunaan 90%+
Inode
df -i
IUse% di 100%
Direktori Docker
du -h /var/lib/docker
Total konsumsi ukuran
Analisis penggunaan khusus Docker
Sekarang setelah kita memastikan apakah masalahnya ruang disk atau inode, mari telusuri lebih dalam dan periksa konsumsi sumber daya spesifik Docker. Perintah docker system df memberikan ringkasan tingkat tinggi yang berlaku universal di semua instalasi Docker:
Keluaran ini merinci penggunaan ruang menjadi empat kategori: image, container, volume lokal, dan build cache.
Kolom RECLAIMABLE sangat bernilai. Ini menunjukkan berapa banyak ruang yang dapat Anda pulihkan tanpa memengaruhi container yang berjalan. Memahami perbedaan antara dua metrik ini adalah kuncinya: ruang "aktif" saat ini digunakan oleh container yang berjalan, sementara ruang "reclaimable" dapat dibebaskan dengan aman.
Untuk detail yang lebih granular, tambahkan flag verbose:
Output verbose ini mencantumkan setiap image, container, dan volume beserta ukurannya, memberikan rincian granular yang Anda butuhkan untuk mengidentifikasi pemakan ruang. Berikut yang perlu diperhatikan pada setiap bagian:
Images: Menampilkan ukuran setiap image dan apakah saat ini digunakan. Cari image besar yang tidak digunakan atau duplikat dengan tag berbeda. Image yang ditandai "unused" dapat dihapus dengan aman tanpa memengaruhi container yang berjalan.
Containers: Menampilkan ukuran lapisan writable untuk setiap container. Jika container yang berhenti menunjukkan SIZE signifikan di sini, berarti ia menulis data ke sistem file-nya. Kolom CREATED membantu mengidentifikasi container lama yang mungkin terlupakan.
Volumes: Mencantumkan ukuran volume dan apakah sedang digunakan. Volume yang ditandai tidak digunakan adalah kandidat aman untuk dihapus, meskipun selalu verifikasi bahwa volume tersebut tidak berisi data penting sebelum memangkasnya.
Build Cache: Sering menjadi konsumen terbesar dan kerap terlewatkan. Ini adalah lapisan perantara dari operasi docker build yang disimpan Docker untuk mempercepat build berikutnya.
Perintah spesifik OS
Untuk pengguna Linux native yang menginginkan wawasan sistem file lebih dalam, Anda dapat secara opsional memeriksa subdirektori secara langsung untuk menunjukkan subdirektori mana (overlay2, containers, volumes) yang paling banyak mengonsumsi ruang:
sudodu-h --max-depth=1 /var/lib/docker |sort-hDidukung oleh
Namun, untuk pengguna Docker Desktop, /var/lib/docker berada di dalam mesin virtual tersembunyi Docker dan tidak dapat diakses secara langsung. Kabar baiknya adalah docker system df -v memberikan semua informasi yang dapat ditindaklanjuti yang Anda butuhkan, terlepas dari platform Anda, sehingga menjadi pendekatan diagnosis paling andal.
Langkah 2: Bersihkan Sistem dengan Docker Prune
Setelah mengidentifikasi di mana ruang dikonsumsi, saya dapat merebutnya kembali dengan aman menggunakan perintah pruning bawaan Docker. Operasi ini dirancang untuk hanya menghapus sumber daya yang tidak digunakan, meminimalkan risiko mengganggu layanan yang berjalan.
Memangkas sumber daya dangling
Docker membedakan antara sumber daya "dangling" dan "unused". Image dangling adalah image tanpa tag dan tanpa referensi container. Biasanya, lapisan perantara dari build yang gagal atau sudah tergantikan. Ini selalu aman untuk dihapus.
Ini menghapus semua container yang tidak digunakan, jaringan, dan image dangling. Ini tidak akan menyentuh image ber-tag atau volume kecuali ditentukan secara eksplisit. Docker akan meminta konfirmasi sebelum melanjutkan.
Untuk lebih agresif dan menghapus semua image yang tidak digunakan (bukan hanya yang dangling), tambahkan flag --all:
Perintah ini menghapus image apa pun yang saat ini tidak terkait dengan container. Berhati-hatilah: deployment berikutnya perlu menarik ulang image yang dihapus.
Jika Anda ingin menyertakan volume dalam pembersihan (yang berisi data persisten), tambahkan flag --volumes:
Peringatan: Ini akan menghapus permanen data di volume yang tidak digunakan. Selalu verifikasi volume tidak berisi data penting sebelum menggunakan flag ini.
Kelola build cache
Di sinilah hal menjadi menarik. Build cache, yang menyimpan lapisan perantara dari operasi Docker build, sering menjadi konsumen ruang terbesar, namun docker system prune sengaja mengecualikannya untuk menjaga performa build.
Jika Anda ingin selektif dan mempertahankan lapisan cache terbaru, gunakan filter berbasis waktu:
docker builder prune --filter"until=24h"Didukung oleh
Ini hanya menghapus lapisan cache yang berusia lebih dari 24 jam, menjaga pekerjaan terbaru Anda tetap utuh.
Bersihkan volume dengan aman
Volume membutuhkan kehati-hatian ekstra karena berisi data persisten, seperti database, file yang diunggah, dan state aplikasi. Menghapus volume yang salah berarti kehilangan data permanen.
Pertama, identifikasi volume dangling (yang tidak terpasang pada container mana pun):
Docker akan meminta konfirmasi sebelum melanjutkan. Jika ragu, cadangkan volume sebelum memangkas.
Langkah 3: Tangani Kelebihan File Log Docker
Log container diam-diam dapat mengonsumsi ruang disk dalam jumlah besar, terkadang melebihi 50 GB per container.
Identifikasi file log yang membengkak
Logging driver json-file bawaan Docker menangkap semua stdout dan stderr container ke file JSON. Tanpa pengaturan ukuran maksimum (bawaan -1, tanpa batas), file ini tumbuh tanpa terkendali.
Periksa ukuran container di semua lingkungan:
dockerps-a--format"table {{.ID}}\t{{.Names}}\t{{.Size}}"Didukung oleh
Untuk memeriksa ukuran file log container tertentu:
ls-lh$(docker inspect --format='{{.LogPath}}'<container-name>)Didukung oleh
Khusus Linux native, temukan file log terbesar secara langsung:
sudofind /var/lib/docker/containers/ -name"*-json.log"-execdu-h{} + |sort-h|tail-10Didukung oleh
Jika docker logs menjadi lambat atau container gagal mulai, log yang terlalu besar kemungkinan menjadi penyebabnya. Untuk mengatasinya, Anda dapat memangkas (truncate) log.
Pangkas log dengan aman
Memangkas log akan menyediakan lebih banyak ruang. Namun, jangan pernah menghapus file log dengan rm saat container berjalan. Docker daemon menahan handle file terbuka ke log ini, dan menghapusnya menciptakan file "deleted but open" yang terus mengonsumsi ruang hingga daemon di-restart.
Pendekatan aman adalah memangkas log menjadi nol:
sudo truncate -s0$(docker inspect --format='{{.LogPath}}'<container-name>)Didukung oleh
Ini langsung melepaskan ruang tanpa merusak handle file. Container terus mencatat ke file yang sama.
Langkah 4: Penelusuran Masalah Lanjutan dan Isu Tersembunyi
Ketika pembersihan standar gagal, kemungkinan Anda berurusan dengan salah satu isu yang kurang umum namun sama berdampaknya berikut:
Kehabisan inode: Sistem file Anda kehabisan struktur metadata file meski ruang disk masih ada
File yang dihapus tetapi masih terbuka: Proses yang menahan handle file pada file yang dihapus, menciptakan penggunaan ruang "hantu"
Pembengkakan disk virtual Docker Desktop: File .raw atau .vhdx di host tidak menyusut setelah Anda menghapus data di dalam VM
Mari tangani masing-masing skenario ini secara sistematis.
Mengatasi kehabisan inode
Ini dapat disebabkan oleh aplikasi yang membuat jutaan file kecil, seperti sesi PHP, node_modules npm, atau artefak build yang mengonsumsi inode dengan laju mengkhawatirkan.
dockerps-a|wc-l# Cek jumlah containerdocker images |wc-l# Cek jumlah imagedocker image prune -a# Hapus image yang tidak digunakan untuk membebaskan inodeDidukung oleh
Untuk instalasi Linux, identifikasi direktori yang padat inode:
fordirin /var/lib/docker/*/;doecho"$dir: $(sudofind $dir -type f 2>/dev/null |wc-l) files"doneDidukung oleh
Menghapus image yang tidak digunakan dengan docker rmi juga membebaskan inode. Untuk masalah di tingkat aplikasi, terapkan pembersihan di dalam container atau gunakan mount volume untuk file sementara.
Tangani file yang dihapus tetapi masih terbuka (khusus Linux)
Ketika file dihapus sementara proses masih membukanya, sistem file tidak melepaskan ruang hingga proses menutup handle file (penggunaan ruang "hantu").
Untuk pengguna Linux, Anda dapat memverifikasi apakah ini terjadi dengan mencari entri "deleted" dalam daftar file terbuka.
Lalu, untuk melepaskan ruang, restart proses tertentu (menggunakan PID dari lsof) atau restart Docker. Setelah Anda melakukan ini, jika Anda menjalankan perintah lagi, file tersebut tidak akan muncul lagi, yang berarti telah dihapus dengan benar.
Sekarang mari kita bahas strategi penelusuran masalah lanjutan terakhir, yang hanya berlaku untuk Docker Desktop: mengelola disk virtual.
Mengelola disk virtual Docker Desktop
Docker Desktop menyimpan data dalam file disk virtual (.raw di Mac, .vhdx di Windows) yang tumbuh secara dinamis tetapi tidak menyusut secara otomatis saat Anda menghapus data. Anda memangkas image dan container, melihat ruang kosong di dalam VM meningkat, tetapi disk host Anda tetap penuh.
Untuk mengelolanya, pendekatan paling aman adalah menggunakan fstrim untuk mengompakkan disk tanpa kehilangan data:
docker run --privileged--pid=host alpine nsenter -t1-m-u-i-n fstrim /Didukung oleh
Perintah ini memangkas sistem file VM Docker Desktop, melepaskan blok yang tidak digunakan kembali ke sistem host Anda. Image, container, dan volume Anda tetap utuh.
Sebagai alternatif, jika Anda ingin memulai benar-benar dari awal (ini menghapus semua data), gunakan Docker Desktop Settings → Troubleshoot → Reset to factory defaults.
Peringatan: Ini bersifat destruktif dan menghapus semua image, container, volume, dan pengaturan. Ini sebaiknya menjadi pilihan terakhir, jika semua cara lain gagal.
Reset ke setelan pabrik
Langkah 5: Cegah Error Docker “No Space Left on Device”
Sekarang setelah kita menyelesaikan krisis langsung, mari terapkan perubahan struktural untuk mencegahnya terulang. Konfigurasi ini memerlukan perencanaan tetapi memberikan keuntungan besar bagi stabilitas sistem.
Pindahkan direktori root Docker (khusus Linux)
Pengguna Docker Desktop tidak dapat dengan mudah mengubah lokasi data root. Sebagai gantinya, Anda dapat:
Tingkatkan ruang disk: Gunakan metode pemadatan disk virtual yang dijelaskan pada Langkah 4
Untuk backend WSL2: Kelola batasan melalui file .wslconfig seperti yang ditunjukkan di Docker Desktop Settings → Resources
Namun, jika Anda berada di Linux dan partisi root Anda terbatas, tetapi Anda memiliki partisi yang lebih besar tersedia (mungkin disk data khusus), memindahkan direktori data Docker adalah solusi permanen.
Docker sekarang menyimpan semua data di lokasi baru. Verifikasi dengan docker info | grep "Docker Root Dir" untuk mengonfirmasi path ke direktori baru.
Konfigurasikan rotasi log global
Rotasi log adalah strategi pencegahan paling efektif yang pernah saya terapkan. Secara bawaan, driver json-file Docker memiliki max-size: -1 (tanpa batas), yang merupakan bencana yang menunggu terjadi di produksi.
Untuk instalasi Linux native, edit /etc/docker/daemon.json untuk menerapkan batas secara global:
{"log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"3"}}Didukung oleh
Setelah mengedit file, restart Docker.
Untuk pengguna Docker Desktop, Anda tidak mengedit /etc/docker/daemon.json secara langsung. Sebagai gantinya:
Buka Docker Desktop
Buka Settings → Docker Engine
Anda akan melihat editor JSON dengan konfigurasi daemon
Tambahkan pengaturan rotasi log ke JSON yang ada:
{"log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"3"}}Didukung oleh
Terakhir, klik Apply & Restart.
Contoh konfigurasi ini membatasi setiap container hingga tiga file log berukuran 10MB masing-masing (total 30MB per container).
Catatan penting: Pengaturan ini hanya berlaku untuk container yang baru dibuat. Container yang sudah ada mempertahankan konfigurasi log aslinya. Anda harus membuat ulang container untuk menerapkan batas baru.
Untuk kompresi dan performa yang lebih baik, pertimbangkan logging driver local:
{"log-driver":"local","log-opts":{"max-size":"10m","max-file":"3","compress":"true"}}Didukung oleh
Selain itu, Anda juga dapat menimpa pengaturan log per layanan di docker-compose.yml:
services:web:image: nginx
logging:driver:"json-file"options:max-size:"50m"max-file:"5"Didukung oleh
Otomatiskan pemeliharaan
Praktik baik lainnya adalah mengotomatiskan proses tertentu. Sering dikatakan bahwa pencegahan lebih baik daripada manajemen krisis. Oleh karena itu, saya merekomendasikan mengotomatiskan pembersihan dengan cron job yang berjalan saat jendela pemeliharaan:
# Buat skrip pembersihansudocat> /usr/local/bin/docker-cleanup.sh <<'EOF'
#!/bin/bash
docker system prune -f
docker builder prune -f --filter "until=168h"
EOFsudochmod +x /usr/local/bin/docker-cleanup.sh
# Tambahkan ke crontab untuk berjalan mingguan pada hari Minggu pukul 2 pagiecho"0 2 * * 0 /usr/local/bin/docker-cleanup.sh"|sudocrontab -Didukung oleh
Skrip ini membuat tugas terjadwal yang secara otomatis menghapus container yang berhenti dan data yang tidak digunakan setiap hari Minggu pukul 2 pagi. Ini juga membersihkan dengan aman lapisan build cache yang lebih lama dari satu minggu (168 jam) untuk mencegah penggunaan disk tumbuh tanpa batas.
Selain itu, optimalkan Dockerfile Anda menggunakan multi-stage builds untuk meminimalkan ukuran image. Multi-stage builds memungkinkan Anda menggunakan satu tahap untuk kompilasi dan build (dengan semua tools pengembangan yang berat), lalu menyalin hanya artefak final ke tahap produksi yang bersih dan minimal.
Ini menghilangkan dependensi build, kode sumber, dan file perantara dari image final Anda, secara dramatis mengurangi ukurannya dan permukaan serangan.
# Build stageFROM node:16 AS builderWORKDIR /appCOPY package*.json ./RUN npm installCOPY . .RUN npm run build# Production stageFROM node:16-alpineWORKDIR /appCOPY--from=builder /app/dist ./distCOPY--from=builder /app/node_modules ./node_modulesCMD ["node", "dist/index.js"]Didukung oleh
Pola ini mengurangi ukuran image produksi dengan mengecualikan tools build dan kode sumber.
Penutup
Memperbaiki error "no space left on device" mengikuti pola yang dapat diprediksi: diagnosis terlebih dahulu untuk memahami apakah Anda berurusan dengan blok disk atau inode, memangkas dengan aman untuk merebut kembali ruang tanpa kehilangan data, lalu mengoptimalkan konfigurasi untuk mencegahnya terulang.
Selama bertahun-tahun mengelola lingkungan Docker, saya belajar bahwa rotasi log adalah strategi pencegahan paling efektif. Konfigurasi sederhana daemon.json dapat mencegah sebagian besar insiden kehabisan ruang.
Saya mendorong Anda untuk mengaudit konfigurasi daemon.json Anda sekarang. Jika Anda belum menyetel max-size dan max-file untuk logging driver Anda, tambahkan segera. Anda akan berterima kasih pada diri sendiri di masa depan saat berhasil menghindari krisis ruang berikutnya.
Apa yang menyebabkan error Docker "no space left on device"?⌄
Error terjadi karena kehabisan disk fisik (penuh oleh image, container, atau log) atau kehabisan inode (terlalu banyak file kecil yang mengonsumsi metadata file). Storage driver overlay2 milik Docker mengakumulasi lapisan yang dengan cepat mengonsumsi ruang disk dan inode, terutama di lingkungan yang intensif build.
Bagaimana cara mengidentifikasi sumber daya Docker mana yang paling banyak mengonsumsi ruang disk?⌄
Gunakan docker system df untuk melihat rincian penggunaan ruang di image, container, volume, dan build cache. Untuk informasi detail, jalankan docker system df -v untuk mencantumkan setiap sumber daya secara individual beserta ukurannya. Kolom RECLAIMABLE menunjukkan jumlah ruang yang dapat dipulihkan dengan aman.
Apa cara teraman untuk membersihkan ruang disk Docker tanpa kehilangan data penting?⌄
Mulailah dengan docker system prune untuk menghapus container yang berhenti, jaringan yang tidak digunakan, dan image dangling. Untuk pembersihan yang lebih agresif, gunakan docker system prune -a untuk menghapus semua image yang tidak digunakan. Jangan pernah menggunakan flag --volumes kecuali Anda telah memverifikasi volume tidak berisi data penting, karena ini menghapus data volume secara permanen.
Bagaimana cara mencegah file log Docker menghabiskan seluruh ruang disk saya?⌄
Konfigurasikan rotasi log global di daemon.json Anda (atau di Docker Desktop Settings → Docker Engine) dengan pengaturan "max-size": "10m" dan "max-file": "3". Ini membatasi setiap container hingga total 30MB log. Ingat bahwa pengaturan ini hanya berlaku untuk container yang baru dibuat. Container yang ada harus dibuat ulang.
Bagaimana saya dapat mencegah Docker kehabisan inode?⌄
Kehabisan inode terjadi saat aplikasi membuat jutaan file kecil. Periksa penggunaan inode dengan df -i dan kurangi dengan menghapus image Docker yang tidak digunakan menggunakan docker image prune -a. Untuk aplikasi yang menghasilkan banyak file sementara (seperti npm atau sesi PHP), gunakan mount volume untuk penyimpanan sementara alih-alih menulis ke lapisan writable container.
Sebagai Founder Martin Data Solutions serta Data Scientist, ML, dan AI Engineer lepas, saya memiliki portofolio beragam dalam Regression, Classification, NLP, LLM, RAG, Neural Networks, Ensemble Methods, dan Computer Vision.
Berhasil mengembangkan sejumlah proyek ML end-to-end, termasuk pembersihan data, analitik, pemodelan, dan deployment di AWS dan GCP, menghadirkan solusi yang berdampak dan dapat diskalakan.
Membangun aplikasi web yang interaktif dan skalabel menggunakan Streamlit dan Gradio untuk berbagai use case industri.
Mengajar dan membimbing mahasiswa dalam data science dan analitik, mendorong perkembangan profesional mereka melalui pendekatan pembelajaran yang dipersonalisasi.
Merancang konten kursus untuk aplikasi retrieval-augmented generation (RAG) yang disesuaikan dengan kebutuhan enterprise.
Menulis blog teknis AI & ML berdampak tinggi, mencakup topik seperti MLOps, vector database, dan LLM, dengan capaian keterlibatan yang signifikan.
Dalam setiap proyek yang saya tangani, saya memastikan menerapkan praktik terkini dalam rekayasa perangkat lunak dan DevOps, seperti CI/CD, code linting, formatting, pemantauan model, pelacakan eksperimen, dan penanganan error yang tangguh. Saya berkomitmen menyajikan solusi menyeluruh, mengubah wawasan data menjadi strategi praktis yang membantu bisnis bertumbuh dan memaksimalkan pemanfaatan data science, machine learning, dan AI.
Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Pelajari kekuatan Docker dan Kubernetes, jalur interaktif ini akan memungkinkan Anda untuk membangun dan mengimplementasikan aplikasi di lingkungan modern.
Error Docker "no space left on device" biasanya muncul di saat yang paling buruk: saat deployment, ketika build kritis berlangsung, atau saat menarik image penting. Saya pernah beberapa kali mengalami error ini, dan saya bisa katakan bahwa terburu-buru menghapus file tanpa diagnosis yang tepat adalah resep kehilangan data.
Yang membuat error ini menantang adalah jarang sekali memiliki satu penyebab. Anda bisa berhadapan dengan akumulasi image Docker, log container yang tak terkendali, inode yang habis karena jutaan file kecil, atau bahkan ruang "hantu" yang dikonsumsi oleh file yang sudah dihapus tetapi masih dibuka oleh proses yang berjalan. Setiap skenario membutuhkan solusi yang berbeda.
Itulah mengapa saya selalu menekankan diagnosis sebelum bertindak. Memahami akar masalah memungkinkan Anda menerapkan solusi yang tepat sasaran secara efisien dan menghindari gangguan pada lingkungan produksi. Dalam panduan ini, saya akan memandu Anda melalui pendekatan sistematis untuk mendiagnosis, menyelesaikan, dan mencegah masalah yang menjengkelkan ini.
Jika Anda baru mengenal Docker, saya merekomendasikan kursus Introduction to Docker kami yang bersifat praktis, yang membahas semua hal yang Anda butuhkan untuk memulai kontainerisasi.
Apa Itu Error Docker "No Space Left on Device"?
Ketika Docker menampilkan error ini, itu menandakan dua masalah mendasar pada penyimpanan sistem Anda:
Memahami perbedaan antara kedua penyebab ini sangat penting untuk menerapkan solusi yang tepat.
Penyebab utama di balik error “no space left on device”
Penyebab pertama dan paling mudah dipahami adalah kehabisan blok disk fisik. Sistem file Anda kehabisan ruang penyimpanan aktual untuk menulis data. Ini skenario yang lebih intuitif: Anda hanya memenuhi disk dengan image Docker, container, log, atau file lainnya.
Penyebab kedua yang kurang jelas adalah kehabisan inode. Bahkan dengan ruang kosong gigabyte yang tersedia, sistem file Anda dapat kehabisan inode (struktur metadata yang digunakan untuk melacak file dan direktori). Setiap file dan direktori mengonsumsi satu inode, sehingga aplikasi yang membuat jutaan file kecil (pikirkan file sesi PHP atau direktori
node_modulesmilik npm) dapat menghabiskan inode sementara ruang disk masih tersisa.Memahami storage driver overlay2
Docker umumnya menggunakan storage driver overlay2, yang berbasis OverlayFS Linux. OverlayFS melapiskan banyak direktori pada satu host dan menyajikannya sebagai satu sistem file terpadu. Lapisan image di-mount sebagai direktori bawah yang read-only, sementara setiap container yang berjalan menambahkan lapisan atas yang tipis dan writable. Tampilan gabungan diekspos sebagai satu direktori ke container.
Driver overlay2 secara native mendukung hingga 128 lapisan OverlayFS bagian bawah secara teoritis, tetapi penyimpanan lapisan Docker memberlakukan batas praktis 125 lapisan dasar per image. Ini memungkinkan komposisi image yang efisien dan peningkatan performa untuk operasi seperti
docker builddandocker commit.Meskipun overlay2 dirancang untuk mengonsumsi lebih sedikit inode daripada storage driver sebelumnya, lingkungan Docker yang berulang kali membangun image, menarik lapisan, atau membuat container tetap dapat memberi tekanan besar pada blok disk dan inode seiring waktu, terutama saat image atau lapisan aplikasi berisi banyak file kecil.
Bagaimana error ini muncul bergantung pada lingkungan deployment:
Pada system Linux native, ini memengaruhi sistem file yang mendukung /var/lib/docker.
Pada Docker Desktop untuk Windows atau macOS, keterbatasan ada di dalam image disk mesin virtual Docker (seperti file
.rawatau.vhdx), yang menambahkan pertimbangan tambahan saat merebut kembali atau mengubah ukuran penyimpanan.Langkah 1: Diagnosis Akar Masalah
Sebelum menghapus apa pun, saya selalu memulai dengan diagnosis menyeluruh. Investasi beberapa menit ini dapat menghemat berjam-jam penelusuran masalah dan mencegah kehilangan data yang tidak disengaja.
Periksa kapasitas tingkat sistem
Mulailah dengan memeriksa penggunaan disk host Anda dengan
df -H(df singkatan dari disk free):Pemeriksaan disk bebas di WSL
Perintah ini menampilkan penggunaan disk dalam format yang mudah dibaca manusia. Cari sistem file yang berada pada atau mendekati kapasitas 100%.
Pada instalasi Linux native, perhatikan secara khusus partisi tempat
/var/lib/dockerberada. Ini biasanya partisi root Anda (/) atau partisi Docker khusus.Pada Docker Desktop (Windows/Mac), carilah mount sistem file utama (biasanya
/dev/sdfatau sejenisnya), yang menampung data VM Docker, alih-alih referensi spesifik ke/var/lib/docker, karena Docker berjalan di dalam mesin virtual.Selanjutnya, periksa kehabisan inode menggunakan
df -i:Pemeriksaan kehabisan inode
Jika Anda melihat penggunaan inode 100% (
IUse%) pada sistem file mana pun, Anda telah menemukan masalahnya. Skenario ini mengejutkan umum di server build dan lingkungan CI/CD, di mana Docker berulang kali membuat dan menghancurkan container dengan banyak file kecil.Metrik
Perintah
Apa yang dicari
Ruang disk
df -HPartisi dengan penggunaan 90%+
Inode
df -iIUse%di 100%Direktori Docker
du -h /var/lib/dockerTotal konsumsi ukuran
Analisis penggunaan khusus Docker
Sekarang setelah kita memastikan apakah masalahnya ruang disk atau inode, mari telusuri lebih dalam dan periksa konsumsi sumber daya spesifik Docker. Perintah
docker system dfmemberikan ringkasan tingkat tinggi yang berlaku universal di semua instalasi Docker:Keluaran ini merinci penggunaan ruang menjadi empat kategori: image, container, volume lokal, dan build cache.
Kolom
RECLAIMABLEsangat bernilai. Ini menunjukkan berapa banyak ruang yang dapat Anda pulihkan tanpa memengaruhi container yang berjalan. Memahami perbedaan antara dua metrik ini adalah kuncinya: ruang "aktif" saat ini digunakan oleh container yang berjalan, sementara ruang "reclaimable" dapat dibebaskan dengan aman.Untuk detail yang lebih granular, tambahkan flag verbose:
Analisis penggunaan Docker
Output verbose ini mencantumkan setiap image, container, dan volume beserta ukurannya, memberikan rincian granular yang Anda butuhkan untuk mengidentifikasi pemakan ruang. Berikut yang perlu diperhatikan pada setiap bagian:
Images: Menampilkan ukuran setiap image dan apakah saat ini digunakan. Cari image besar yang tidak digunakan atau duplikat dengan tag berbeda. Image yang ditandai "unused" dapat dihapus dengan aman tanpa memengaruhi container yang berjalan.
Containers: Menampilkan ukuran lapisan writable untuk setiap container. Jika container yang berhenti menunjukkan
SIZEsignifikan di sini, berarti ia menulis data ke sistem file-nya. KolomCREATEDmembantu mengidentifikasi container lama yang mungkin terlupakan.Volumes: Mencantumkan ukuran volume dan apakah sedang digunakan. Volume yang ditandai tidak digunakan adalah kandidat aman untuk dihapus, meskipun selalu verifikasi bahwa volume tersebut tidak berisi data penting sebelum memangkasnya.
Build Cache: Sering menjadi konsumen terbesar dan kerap terlewatkan. Ini adalah lapisan perantara dari operasi
docker buildyang disimpan Docker untuk mempercepat build berikutnya.Perintah spesifik OS
Untuk pengguna Linux native yang menginginkan wawasan sistem file lebih dalam, Anda dapat secara opsional memeriksa subdirektori secara langsung untuk menunjukkan subdirektori mana (
overlay2,containers,volumes) yang paling banyak mengonsumsi ruang:Namun, untuk pengguna Docker Desktop,
/var/lib/dockerberada di dalam mesin virtual tersembunyi Docker dan tidak dapat diakses secara langsung. Kabar baiknya adalahdocker system df -vmemberikan semua informasi yang dapat ditindaklanjuti yang Anda butuhkan, terlepas dari platform Anda, sehingga menjadi pendekatan diagnosis paling andal.Langkah 2: Bersihkan Sistem dengan Docker Prune
Setelah mengidentifikasi di mana ruang dikonsumsi, saya dapat merebutnya kembali dengan aman menggunakan perintah pruning bawaan Docker. Operasi ini dirancang untuk hanya menghapus sumber daya yang tidak digunakan, meminimalkan risiko mengganggu layanan yang berjalan.
Memangkas sumber daya dangling
Docker membedakan antara sumber daya "dangling" dan "unused". Image dangling adalah image tanpa tag dan tanpa referensi container. Biasanya, lapisan perantara dari build yang gagal atau sudah tergantikan. Ini selalu aman untuk dihapus.
Mulailah dengan perintah prune dasar:
Ini menghapus semua container yang tidak digunakan, jaringan, dan image dangling. Ini tidak akan menyentuh image ber-tag atau volume kecuali ditentukan secara eksplisit. Docker akan meminta konfirmasi sebelum melanjutkan.
Untuk lebih agresif dan menghapus semua image yang tidak digunakan (bukan hanya yang dangling), tambahkan flag
--all:Docker system prune
Perintah ini menghapus image apa pun yang saat ini tidak terkait dengan container. Berhati-hatilah: deployment berikutnya perlu menarik ulang image yang dihapus.
Jika Anda ingin menyertakan volume dalam pembersihan (yang berisi data persisten), tambahkan flag
--volumes:Peringatan: Ini akan menghapus permanen data di volume yang tidak digunakan. Selalu verifikasi volume tidak berisi data penting sebelum menggunakan flag ini.
Kelola build cache
Di sinilah hal menjadi menarik. Build cache, yang menyimpan lapisan perantara dari operasi Docker build, sering menjadi konsumen ruang terbesar, namun
docker system prunesengaja mengecualikannya untuk menjaga performa build.Untuk menargetkan build cache secara khusus:
Jika Anda ingin selektif dan mempertahankan lapisan cache terbaru, gunakan filter berbasis waktu:
Ini hanya menghapus lapisan cache yang berusia lebih dari 24 jam, menjaga pekerjaan terbaru Anda tetap utuh.
Bersihkan volume dengan aman
Volume membutuhkan kehati-hatian ekstra karena berisi data persisten, seperti database, file yang diunggah, dan state aplikasi. Menghapus volume yang salah berarti kehilangan data permanen.
Pertama, identifikasi volume dangling (yang tidak terpasang pada container mana pun):
Tinjau daftar ini dengan saksama. Jika Anda yakin volume ini tidak diperlukan, pangkas:
Docker akan meminta konfirmasi sebelum melanjutkan. Jika ragu, cadangkan volume sebelum memangkas.
Langkah 3: Tangani Kelebihan File Log Docker
Log container diam-diam dapat mengonsumsi ruang disk dalam jumlah besar, terkadang melebihi 50 GB per container.
Identifikasi file log yang membengkak
Logging driver
json-filebawaan Docker menangkap semuastdoutdanstderrcontainer ke file JSON. Tanpa pengaturan ukuran maksimum (bawaan -1, tanpa batas), file ini tumbuh tanpa terkendali.Periksa ukuran container di semua lingkungan:
Untuk memeriksa ukuran file log container tertentu:
Khusus Linux native, temukan file log terbesar secara langsung:
Jika
docker logsmenjadi lambat atau container gagal mulai, log yang terlalu besar kemungkinan menjadi penyebabnya. Untuk mengatasinya, Anda dapat memangkas (truncate) log.Pangkas log dengan aman
Memangkas log akan menyediakan lebih banyak ruang. Namun, jangan pernah menghapus file log dengan
rmsaat container berjalan. Docker daemon menahan handle file terbuka ke log ini, dan menghapusnya menciptakan file "deleted but open" yang terus mengonsumsi ruang hingga daemon di-restart.Pendekatan aman adalah memangkas log menjadi nol:
Ini langsung melepaskan ruang tanpa merusak handle file. Container terus mencatat ke file yang sama.
Langkah 4: Penelusuran Masalah Lanjutan dan Isu Tersembunyi
Ketika pembersihan standar gagal, kemungkinan Anda berurusan dengan salah satu isu yang kurang umum namun sama berdampaknya berikut:
Kehabisan inode: Sistem file Anda kehabisan struktur metadata file meski ruang disk masih ada
File yang dihapus tetapi masih terbuka: Proses yang menahan handle file pada file yang dihapus, menciptakan penggunaan ruang "hantu"
Pembengkakan disk virtual Docker Desktop: File
.rawatau.vhdxdi host tidak menyusut setelah Anda menghapus data di dalam VMMari tangani masing-masing skenario ini secara sistematis.
Mengatasi kehabisan inode
Ini dapat disebabkan oleh aplikasi yang membuat jutaan file kecil, seperti sesi PHP,
node_modulesnpm, atau artefak build yang mengonsumsi inode dengan laju mengkhawatirkan.Pertama, verifikasi kehabisan inode:
Menggunakan perintah Docker (semua lingkungan):
Untuk instalasi Linux, identifikasi direktori yang padat inode:
Menghapus image yang tidak digunakan dengan
docker rmijuga membebaskan inode. Untuk masalah di tingkat aplikasi, terapkan pembersihan di dalam container atau gunakan mount volume untuk file sementara.Tangani file yang dihapus tetapi masih terbuka (khusus Linux)
Ketika file dihapus sementara proses masih membukanya, sistem file tidak melepaskan ruang hingga proses menutup handle file (penggunaan ruang "hantu").
Untuk pengguna Linux, Anda dapat memverifikasi apakah ini terjadi dengan mencari entri "deleted" dalam daftar file terbuka.
Pertama, identifikasi file-file ini:
File Docker yang dihapus
Lalu, untuk melepaskan ruang, restart proses tertentu (menggunakan PID dari
lsof) atau restart Docker. Setelah Anda melakukan ini, jika Anda menjalankan perintah lagi, file tersebut tidak akan muncul lagi, yang berarti telah dihapus dengan benar.Sekarang mari kita bahas strategi penelusuran masalah lanjutan terakhir, yang hanya berlaku untuk Docker Desktop: mengelola disk virtual.
Mengelola disk virtual Docker Desktop
Docker Desktop menyimpan data dalam file disk virtual (
.rawdi Mac,.vhdxdi Windows) yang tumbuh secara dinamis tetapi tidak menyusut secara otomatis saat Anda menghapus data. Anda memangkas image dan container, melihat ruang kosong di dalam VM meningkat, tetapi disk host Anda tetap penuh.Untuk mengelolanya, pendekatan paling aman adalah menggunakan
fstrimuntuk mengompakkan disk tanpa kehilangan data:Perintah ini memangkas sistem file VM Docker Desktop, melepaskan blok yang tidak digunakan kembali ke sistem host Anda. Image, container, dan volume Anda tetap utuh.
Sebagai alternatif, jika Anda ingin memulai benar-benar dari awal (ini menghapus semua data), gunakan Docker Desktop Settings → Troubleshoot → Reset to factory defaults.
Peringatan: Ini bersifat destruktif dan menghapus semua image, container, volume, dan pengaturan. Ini sebaiknya menjadi pilihan terakhir, jika semua cara lain gagal.
Reset ke setelan pabrik
Langkah 5: Cegah Error Docker “No Space Left on Device”
Sekarang setelah kita menyelesaikan krisis langsung, mari terapkan perubahan struktural untuk mencegahnya terulang. Konfigurasi ini memerlukan perencanaan tetapi memberikan keuntungan besar bagi stabilitas sistem.
Pindahkan direktori root Docker (khusus Linux)
Pengguna Docker Desktop tidak dapat dengan mudah mengubah lokasi data root. Sebagai gantinya, Anda dapat:
Tingkatkan ruang disk: Gunakan metode pemadatan disk virtual yang dijelaskan pada Langkah 4
Untuk backend WSL2: Kelola batasan melalui file
.wslconfigseperti yang ditunjukkan di Docker Desktop Settings → ResourcesNamun, jika Anda berada di Linux dan partisi root Anda terbatas, tetapi Anda memiliki partisi yang lebih besar tersedia (mungkin disk data khusus), memindahkan direktori data Docker adalah solusi permanen.
Pertama, hentikan Docker:
Edit
/etc/docker/daemon.jsonuntuk menentukan lokasi baru:Migrasikan data yang ada untuk mempertahankan image dan container Anda:
Terakhir, mulai ulang Docker:
Docker sekarang menyimpan semua data di lokasi baru. Verifikasi dengan
docker info | grep "Docker Root Dir"untuk mengonfirmasi path ke direktori baru.Konfigurasikan rotasi log global
Rotasi log adalah strategi pencegahan paling efektif yang pernah saya terapkan. Secara bawaan, driver
json-fileDocker memilikimax-size: -1(tanpa batas), yang merupakan bencana yang menunggu terjadi di produksi.Untuk instalasi Linux native, edit
/etc/docker/daemon.jsonuntuk menerapkan batas secara global:Setelah mengedit file, restart Docker.
Untuk pengguna Docker Desktop, Anda tidak mengedit
/etc/docker/daemon.jsonsecara langsung. Sebagai gantinya:Terakhir, klik Apply & Restart.
Contoh konfigurasi ini membatasi setiap container hingga tiga file log berukuran 10MB masing-masing (total 30MB per container).
Catatan penting: Pengaturan ini hanya berlaku untuk container yang baru dibuat. Container yang sudah ada mempertahankan konfigurasi log aslinya. Anda harus membuat ulang container untuk menerapkan batas baru.
Untuk kompresi dan performa yang lebih baik, pertimbangkan logging driver local:
Selain itu, Anda juga dapat menimpa pengaturan log per layanan di
docker-compose.yml:Otomatiskan pemeliharaan
Praktik baik lainnya adalah mengotomatiskan proses tertentu. Sering dikatakan bahwa pencegahan lebih baik daripada manajemen krisis. Oleh karena itu, saya merekomendasikan mengotomatiskan pembersihan dengan cron job yang berjalan saat jendela pemeliharaan:
Skrip ini membuat tugas terjadwal yang secara otomatis menghapus container yang berhenti dan data yang tidak digunakan setiap hari Minggu pukul 2 pagi. Ini juga membersihkan dengan aman lapisan build cache yang lebih lama dari satu minggu (168 jam) untuk mencegah penggunaan disk tumbuh tanpa batas.
Selain itu, optimalkan Dockerfile Anda menggunakan multi-stage builds untuk meminimalkan ukuran image. Multi-stage builds memungkinkan Anda menggunakan satu tahap untuk kompilasi dan build (dengan semua tools pengembangan yang berat), lalu menyalin hanya artefak final ke tahap produksi yang bersih dan minimal.
Ini menghilangkan dependensi build, kode sumber, dan file perantara dari image final Anda, secara dramatis mengurangi ukurannya dan permukaan serangan.
Pola ini mengurangi ukuran image produksi dengan mengecualikan tools build dan kode sumber.
Penutup
Memperbaiki error "no space left on device" mengikuti pola yang dapat diprediksi: diagnosis terlebih dahulu untuk memahami apakah Anda berurusan dengan blok disk atau inode, memangkas dengan aman untuk merebut kembali ruang tanpa kehilangan data, lalu mengoptimalkan konfigurasi untuk mencegahnya terulang.
Selama bertahun-tahun mengelola lingkungan Docker, saya belajar bahwa rotasi log adalah strategi pencegahan paling efektif. Konfigurasi sederhana
daemon.jsondapat mencegah sebagian besar insiden kehabisan ruang.Saya mendorong Anda untuk mengaudit konfigurasi
daemon.jsonAnda sekarang. Jika Anda belum menyetelmax-sizedanmax-fileuntuk logging driver Anda, tambahkan segera. Anda akan berterima kasih pada diri sendiri di masa depan saat berhasil menghindari krisis ruang berikutnya.Siap menjadi ahli Docker? Langkah berikutnya adalah mendaftar di Containerization and Virtualization with Docker and Kubernetes skill track, yang sangat saya rekomendasikan.