اگر پوشه /var/lib/docker چندین گیگابایت یا حتی بیشتر فضا گرفته و پارتیشن اصلی سرور در حال پر شدن است، اولین واکنش نباید حذف دستی فایلهای Docker باشد. در بیشتر مواقع میتوان با شناسایی Imageهای قدیمی، Containerهای متوقفشده، Build Cache، Logهای حجیم یا Volumeهای بلااستفاده بخش قابلتوجهی از فضا را بهشکل امن آزاد کرد.
پاسخ سریع: ابتدا با df -h و docker system df -v میزان مصرف را بررسی کنید. سپس بر اساس عامل اصلی، Image، Build Cache، Container یا Logهای اضافی را پاکسازی کنید. هیچوقت برای خالیکردن فضا، فایلهای داخل /var/lib/docker را با rm -rf حذف نکنید.
/var/lib/docker چیست؟
در بیشتر نصبهای کلاسیک Docker روی لینوکس، مسیر /var/lib/docker محل نگهداری دادههای اصلی Docker است. بسته به نسخه و Storage Backend، این مسیر میتواند شامل Imageها، Containerها، Volumeها، Metadata، Build Cache و اطلاعات Storage Driver باشد.
در نتیجه اگر Docker روی یک VPS با دیسک محدود برای مدت طولانی استفاده شود، این دایرکتوری میتواند بهتدریج رشد کند.
⚠️ در Docker Engineهای جدید، مخصوصاً نصب تازه Docker Engine 29.0 و بالاتر، ممکن است Image و Snapshotهای Container داخل /var/lib/containerd ذخیره شوند. بنابراین قبل از پاکسازی، Storage Backend واقعی را بررسی کنید.
مرحله ۱: ابتدا مطمئن شوید واقعاً دیسک پر شده است
روی سرور از طریق SSH این دستور را اجرا کنید:
df -h
ستون Use% را بررسی کنید. اگر پارتیشن / یا پارتیشنی که Docker روی آن قرار دارد نزدیک ۱۰۰٪ باشد، باید مصرف فضا را دقیقتر بررسی کنید.
محل واقعی Data Root داکر را هم مشاهده کنید:
docker info | grep "Docker Root Dir"
در نصب معمولی خروجی میتواند شبیه این باشد:
Docker Root Dir: /var/lib/docker
مرحله ۲: inode را هم بررسی کنید
گاهی دیسک از نظر حجم هنوز فضای آزاد دارد، اما تعداد inodeهای فایلسیستم تمام شده است. در این حالت Docker همچنان میتواند خطای no space left on device بدهد.
df -i
اگر IUse% نزدیک ۱۰۰٪ باشد، مشکل تعداد زیاد فایلهای کوچک است و صرفاً خالیکردن چند فایل حجیم ممکن است کافی نباشد.
مرحله ۳: مشخص کنید Docker چه مقدار فضا مصرف میکند
مهمترین دستور برای شروع عیبیابی:
docker system df
برای جزئیات کاملتر:
docker system df -v
این دستور مصرف فضای بخشهای اصلی را نشان میدهد:
🔹 Docker Images
🔹 Containers
🔹 Local Volumes
🔹 Build Cache
مرحله ۴: حجم واقعی /var/lib/docker را ببینید
sudo du -sh /var/lib/docker
برای اینکه بفهمید کدام زیرپوشه بیشترین مصرف را دارد:
sudo du -h --max-depth=1 /var/lib/docker | sort -h
معمولاً یکی از این بخشها بزرگتر از بقیه است:
🔹 overlay2
🔹 containers
🔹 volumes
🔹 Build Cache و Metadataهای Docker
⚠️ بزرگبودن یک پوشه به معنی مجازبودن حذف مستقیم آن نیست. Docker خودش باید Objectهای بلااستفاده را حذف کند.
مرحله ۵: Imageهای بلااستفاده را پاک کنید
ابتدا Imageهای موجود را ببینید:
docker image ls
برای حذف Imageهای dangling:
docker image prune
اگر میخواهید تمام Imageهایی که Container موجودی از آنها استفاده نمیکند حذف شوند:
docker image prune -a
⚠️ گزینه -a دامنه پاکسازی را بیشتر میکند. قبل از اجرا مطمئن شوید Imageهایی که برای Deploy بعدی لازم دارید در Registry یا منبع دیگری قابل دریافت هستند.
مرحله ۶: Containerهای متوقفشده را بررسی کنید
docker ps -a
برای پاکسازی Containerهای متوقفشدهای که دیگر نیاز ندارید:
docker container prune
قبل از تأیید، Docker اخطار حذف را نمایش میدهد.
مرحله ۷: Build Cache را پاکسازی کنید
روی سرورهایی که مرتب Image ساخته میشود، Build Cache میتواند چندین گیگابایت فضا اشغال کند.
docker builder prune
برای پاکسازی گستردهتر Build Cache بلااستفاده:
docker builder prune -a
بعد از حذف Cache، Buildهای بعدی ممکن است زمان بیشتری ببرند چون برخی Layerها دوباره باید دانلود یا ساخته شوند.
فضای Docker روی VPS کم است؟
اگر چند سرویس Docker، دیتابیس و Build Pipeline روی یک VPS اجرا میکنید، ظرفیت دیسک باید متناسب با Imageها، Logها و دادههای دائمی انتخاب شود. کمبود فضای Root یکی از علتهای متداول توقف ناگهانی سرویسهای Docker است.
مرحله ۸: Logهای Docker را بررسی کنید
یکی از مهمترین دلایل پرشدن /var/lib/docker، Logهای Container است. Docker بهصورت پیشفرض در بسیاری از نصبها از Logging Driver نوع json-file استفاده میکند.
Logging Driver فعلی را بررسی کنید:
docker info --format '{{.LoggingDriver}}'
اگر خروجی json-file بود، اندازه Logهای Container را مشاهده کنید:
sudo du -h /var/lib/docker/containers/*/*-json.log 2>/dev/null | sort -h | tail -n 20
اگر یک فایل Log چند گیگابایت حجم گرفته باشد، علت اصلی پرشدن دیسک احتمالاً مشخص شده است.
⚠️ مستندات Docker توصیه میکند فایلهای Log مربوط به json-file را مستقیماً با ابزارهای خارجی دستکاری نکنید، چون Docker مدیریت این فایلها را بر عهده دارد.
مرحله ۹: Log Rotation را فعال کنید
اگر دلیل اصلی مصرف دیسک Log است، بهتر است برای Containerهای آینده محدودیت حجم تعیین کنید.
فایل تنظیم Docker معمولاً در مسیر زیر قرار دارد:
/etc/docker/daemon.json
یک نمونه تنظیم Log Rotation:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
اگر daemon.json از قبل تنظیماتی دارد، این بخش را با JSON موجود ادغام کنید و کل فایل را جایگزین نکنید.
قبل از Restart کردن Docker صحت JSON را بررسی کنید:
python3 -m json.tool /etc/docker/daemon.json
سپس در زمانی که Restart سرویس باعث اختلال کنترلشده میشود:
sudo systemctl restart docker
تنظیم Logging جدید بهصورت خودکار روی Containerهای از قبل ساختهشده اعمال نمیشود؛ ممکن است لازم باشد Container با تنظیم جدید Recreation شود.
مرحله ۱۰: استفاده از Logging Driver نوع local
Docker برای کاهش خطر پرشدن دیسک، Logging Driver نوع local را نیز ارائه میکند که Log Rotation داخلی دارد.
نمونه:
{
"log-driver": "local",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
این تغییر باید متناسب با نیاز شما به مشاهده، Export یا پردازش Logها انجام شود.
مرحله ۱۱: docker system prune؛ مفید اما با احتیاط
اگر چند نوع Object بلااستفاده دارید، Docker یک فرمان یکپارچه برای پاکسازی دارد:
docker system prune
این دستور میتواند موارد زیر را حذف کند:
🔹 Containerهای متوقفشده.
🔹 Networkهای بلااستفاده.
🔹 Imageهای dangling.
🔹 Build Cache بلااستفاده.
برای پاککردن تمام Imageهای بلااستفاده:
docker system prune -a
⚠️ گزینه –volumes را بدون بررسی اضافه نکنید. Volume میتواند شامل دیتابیس، فایلهای آپلودشده یا اطلاعات دائمی برنامه باشد.
مرحله ۱۲: Volumeها را جداگانه بررسی کنید
فهرست Volumeها:
docker volume ls
قبل از حذف Volume، مشخص کنید به کدام برنامه تعلق دارد.
برای مشاهده جزئیات یک Volume:
docker volume inspect VOLUME_NAME
بهجای VOLUME_NAME نام واقعی Volume را قرار دهید.
Volumeهایی که واقعاً بلااستفادهاند را میتوان با دستور زیر بررسی و پاکسازی کرد:
docker volume prune
⚠️ قبل از حذف Volume در سرور Production از دادههای دیتابیس و فایلهای مهم Backup قابل بازیابی داشته باشید.
مرحله ۱۳: اگر overlay2 بیشترین حجم را گرفته است چه کنیم؟
بزرگشدن overlay2 معمولاً نتیجه تعداد زیاد Image، Layer، Container یا دادهای است که داخل Writable Layer Container نوشته شده است.
اول از فرمانهای خود Docker استفاده کنید:
docker system df -v
docker ps -a
docker image ls
اگر یک برنامه حجم زیادی داخل خود Container تولید میکند، بهتر است داده دائمی آن به Volume یا Bind Mount منتقل شود.
این دستور را اجرا نکنید:
rm -rf /var/lib/docker/overlay2/*
حذف دستی Layerها میتواند Metadata Docker را ناسازگار کند و Containerها و Imageها را از کار بیندازد.
مرحله ۱۴: مصرف /var/lib/containerd را هم بررسی کنید
در Docker Engineهای جدید، اگر containerd image store فعال باشد ممکن است بخش بزرگی از مصرف Storage در مسیر زیر باشد:
sudo du -sh /var/lib/containerd
برای مقایسه:
sudo du -sh /var/lib/docker /var/lib/containerd 2>/dev/null
حتی در این حالت برای حذف Imageها از فرمانهای Docker استفاده کنید و فایلهای containerd را مستقیماً پاک نکنید.
مرحله ۱۵: انتقال Docker Data Root به دیسک بزرگتر
اگر مشکل صرفاً کمبود ظرفیت دیسک است و پاکسازی Objectهای بلااستفاده کافی نیست، میتوانید Docker Data Root را به یک دیسک یا پارتیشن بزرگتر منتقل کنید.
⚠️ این مرحله میتواند باعث Downtime شود. قبل از انتقال، از اطلاعات مهم Backup بگیرید و در زمان مناسب سرویسها را متوقف کنید.
ابتدا Docker را متوقف کنید:
sudo systemctl stop docker
فرض میکنیم فضای جدید روی /mnt/docker-data Mount شده است:
sudo mkdir -p /mnt/docker-data
دادههای فعلی را کپی کنید:
sudo rsync -aHAXx /var/lib/docker/ /mnt/docker-data/
سپس در /etc/docker/daemon.json مقدار Data Root را تعریف کنید:
{
"data-root": "/mnt/docker-data"
}
اگر فایل از قبل تنظیمات دیگری دارد، فقط کلید data-root را به JSON موجود اضافه کنید.
صحت فایل:
python3 -m json.tool /etc/docker/daemon.json
سپس:
sudo systemctl start docker
docker info | grep "Docker Root Dir"
اگر از containerd image store استفاده میکنید، تغییر data-root Docker بهتنهایی مسیر Snapshotهای containerd را تغییر نمیدهد و تنظیم containerd نیز باید جداگانه بررسی شود.
مرحله ۱۶: بعد از پاکسازی دوباره فضا را بررسی کنید
بعد از هر عملیات پاکسازی، دوباره این دو دستور را اجرا کنید:
df -h
docker system df
اگر فضای آزاد به مقدار قابلقبولی برگشته اما دوباره سریع پر میشود، باید عامل رشد مداوم را پیدا کنید؛ معمولاً Log، Build مکرر، فایلهای برنامه یا دادهای است که داخل Writable Layer نوشته میشود.
جدول تشخیص سریع پرشدن /var/lib/docker
| نشانه | عامل محتمل | بررسی |
|---|---|---|
| Imageها بسیار زیاد هستند | Imageهای قدیمی | docker image ls |
| Build Cache بزرگ است | Buildهای مکرر | docker system df -v |
| containers چندین گیگابایت است | Logهای json-file | بررسی فایلهای *-json.log |
| overlay2 بسیار بزرگ است | Image یا Writable Layer | docker system df -v |
| فضا خالی است ولی خطای no space وجود دارد | inode | df -i |
| /var/lib/containerd بزرگ است | containerd image store | du -sh /var/lib/containerd |
ترتیب امن برای آزادسازی فضای Docker
مرحله ۱: با df -h و df -i وضعیت واقعی دیسک را بررسی کنید.
مرحله ۲: با docker system df -v مصرف Docker را پیدا کنید.
مرحله ۳: Imageهای dangling را پاک کنید.
مرحله ۴: Containerهای متوقفشده و بلااستفاده را حذف کنید.
مرحله ۵: Build Cache را بررسی و پاک کنید.
مرحله ۶: Logهای حجیم را شناسایی کنید.
مرحله ۷: Log Rotation را برای جلوگیری از تکرار فعال کنید.
مرحله ۸: Volumeها را فقط پس از شناسایی و Backup بررسی کنید.
مرحله ۹: اگر ظرفیت واقعاً کم است، Data Root را به Storage بزرگتر منتقل کنید.
پرسشهای متداول
آیا میتوان /var/lib/docker را پاک کرد؟
خیر. حذف مستقیم این پوشه میتواند Imageها، Containerها، Volumeها و Metadata Docker را از بین ببرد. برای پاکسازی باید از فرمانهای Docker استفاده شود.
چرا /var/lib/docker اینقدر بزرگ شده است؟
رایجترین علتها Imageهای قدیمی، Build Cache، Logهای بدون Rotation، Containerهای متوقفشده و دادهای هستند که داخل Writable Layer Container نوشته میشود.
آیا docker system prune امن است؟
اگر بدانید چه چیزی حذف میشود، فرمان مفیدی است. نسخه پایه Volumeها را بهطور پیشفرض حذف نمیکند، اما Containerهای متوقفشده، Networkهای بلااستفاده، Imageهای dangling و Build Cache را پاک میکند.
آیا docker system prune -a خطرناک است؟
این گزینه تمام Imageهایی را که Container موجودی استفاده نمیکند نیز حذف میکند. بنابراین ممکن است Imageهایی که برای Deploy بعدی نگه داشتهاید دوباره نیاز به Pull داشته باشند.
چرا Logهای Docker دیسک را پر میکنند؟
Logging Driver پیشفرض json-file بدون Log Rotation میتواند بهمرور فایلهای بسیار بزرگی تولید کند. محدودکردن max-size و max-file از این مشکل جلوگیری میکند.
آیا انتقال /var/lib/docker به دیسک دیگر ممکن است؟
بله. میتوانید با تنظیم data-root مسیر داده Docker را تغییر دهید، اما انتقال باید با توقف سرویس، Backup و کپی صحیح دادهها انجام شود.
چرا با وجود فضای خالی هنوز no space left on device میبینم؟
ممکن است inodeهای فایلسیستم تمام شده باشند. خروجی df -i را بررسی کنید.
منابع رسمی
🔹 راهنمای رسمی Docker برای Prune کردن Objectهای بلااستفاده
🔹 مستندات تنظیم Logging در Docker
🔹 مستندات Docker Daemon و Data Root
جمعبندی
اگر /var/lib/docker پر شده، ابتدا عامل مصرف فضا را پیدا کنید. Imageها، Build Cache و Logها رایجترین علتها هستند. برای پاکسازی از فرمانهای رسمی Docker استفاده کنید و فایلهای داخل Data Root را دستی حذف نکنید. بعد از آزادسازی فضا، Log Rotation را فعال کنید و اگر ظرفیت دیسک برای حجم کاری شما کافی نیست، Docker Data Root را به Storage بزرگتر منتقل کنید.
فضای Docker سرور همچنان پر میشود؟
اگر بعد از پاکسازی Imageها، Cache و Logها همچنان مصرف Storage غیرعادی است، میتوانید برای بررسی Docker Data Root، Volumeها، overlay2 و وضعیت دیسک درخواست فنی ثبت کنید.
تماس با پشتیبانی ایرانیکاسرور: 021-91302467






دیدگاهها (۰)