
مقدمه
داکر مدیریت اپلیکیشنها و سرویسهایتان را در کانتینرها آسان میکند تا بتوانید همهجا اجرایشان کنید. اما هنگام کار با داکر، انباشت تعداد اضافی از ایمیجهای بلااستفاده، کانتینرها و Volumeهای داده که خروجی را شلوغ و فضای دیسک را مصرف میکنند هم آسان است.
داکر همه ابزارهای لازم برای پاکسازی سیستمتان را از خط فرمان فراهم میکند. این راهنما به سبک برگه-تقلب، مرجعی سریع به دستوراتی فراهم میکند که برای آزاد کردن فضای دیسک و منظم نگهداشتن سیستم با حذف ایمیجها، کانتینرها و Volumeهای بلااستفاده داکر مفیدند.
نحوه استفاده از این راهنما:
- این راهنما به قالب برگه تقلب با قطعات خط فرمانِ خودکفاست.
- به هر بخشی که با کاری که سعی در انجامش دارید مرتبط است بپرید.
نکات کلیدی
- داکر دستورات پاکسازی داخلی مانند
docker rm،docker rmiوdocker pruneرا شامل میشود؛ که به حذف کانتینرها، ایمیجها، Volumeها و شبکههای بلااستفاده کمک میکنند تا فضای دیسک آزاد شود. - دستور
docker system pruneراه سریعی برای پاکسازی کانتینرهای متوقفشده، شبکههای بلااستفاده و ایمیجهای Dangling فراهم میکند؛ با فلگهای اختیاری برای حذف کاملتر منابع داکر. - ایمیجهای بلااستفاده داکر را میتوان بهصورت منفرد، انبوه یا با اعمال فیلترهایی مانند وضعیت Dangling یا الگوهای نام حذف کرد تا مدیریت ذخیرهسازی محلی داکر کارآمدتر شود.
- کانتینرهای داکر را میتوان دستی، خودکار پس از خروج یا بهصورت دستهای بر اساس وضعیتشان حذف کرد؛ که مدیریت چرخه حیات کانتینر را آسانتر و قابل اطمینانتر میسازد.
- Volumeهای داکر هنگام حذف کانتینرها خودکار حذف نمیشوند و باید صریحاً پاکسازی شوند تا جلوی مصرف فضای دیسک توسط دادههای ماندگار گرفته شود.
- دانستن تفاوت دستورات
docker rm،docker rmiوdocker pruneبه اجتناب از دست رفتن تصادفی داده کمک میکند؛ در حالی که محیطهای داکر تمیز و بهینه میمانند.
نکته: سینتکس جایگزینی دستور
$(command)استفادهشده در دستورات، در شلهای محبوب زیادی مانند bash، zsh و Windows PowerShell موجود است.
اگر راه ۱-کلیکی برای دیپلوی اپلیکیشن داکری روی سرور زنده میخواهید، به پلتفرم اپ پارمین کلود نگاهی بیندازید.
پاکسازی همه منابع بلااستفاده یا Dangling: ایمیجها، کانتینرها، Volumeها و شبکهها
داکر دستور منفردی فراهم میکند که هر منبع بلااستفادهای را پاکسازی میکند—کانتینرهای متوقفشده، شبکههای بلااستفاده و ایمیجهای Dangling:
docker system prune
بهطور پیشفرض، docker system prune هیچ Volumeای را حذف نمیکند. برای حذف Volumeهای بلااستفاده، باید صریحاً فلگ --volumes را اضافه کنید.
برای حذف اضافیِ همه کانتینرهای متوقفشده و همه ایمیجهای بلااستفاده (نه فقط Danglingها)، فلگ -a را به دستور اضافه کنید:
docker system prune -a
حذف ایمیجهای داکر
حذف یک یا چند ایمیج خاص
از دستور docker images با فلگ -a برای پیدا کردن شناسه ایمیجهایی که میخواهید حذف کنید استفاده کنید. این همه ایمیجها—شامل لایههای میانی—را به شما نشان میدهد. وقتی ایمیجهای موردنظر را پیدا کردید، میتوانید شناسه یا تگشان را به docker rmi پاس کنید:
فهرست کردن:
docker images -a
حذف:
docker rmi Image Image
نکته: فلگ
-aیا--allدر دستور docker images، همه ایمیجهای داکر—شامل میانیهایی که توسط هیچ تگی ارجاع نشدهاند—را نمایش میدهد. بهطور پیشفرض، docker images فقط ایمیجهای دارای حداقل یک تگ را نشان میدهد. اما ممکن است ایمیجهایی بدون تگ وجود داشته باشند که همچنان روی سیستم فضای دیسک مصرف میکنند. فلگ-aدر شناسایی ایمیجهایی که میتوان برای صرفهجویی در فضا حذفشان کرد مفید است. وقتی با دستور docker rmi استفاده میشود، فلگ-fیا--forceهم میتواند برای حذف ایمیجهای بدون تگ به کار رود.
حذف ایمیجهای Dangling
ایمیجهای داکر از چند لایه تشکیل شدهاند. ایمیجهای Dangling لایههاییاند که هیچ رابطهای با هیچ ایمیج تگشدهای ندارند. دیگر هدفی ندارند و فضای دیسک مصرف میکنند. میتوان آنها را با افزودن فلگ فیلتر -f با مقدار dangling=true به دستور docker images پیدا کرد. وقتی مطمئن شدید میخواهید حذفشان کنید، میتوانید از دستور docker image prune استفاده کنید:
نکته: اگر ایمیجی را بدون تگ بسازید، آن ایمیج در فهرست Danglingها ظاهر میشود؛ چون هیچ ارتباطی با ایمیج تگشدهای ندارد. میتوانید با ارائه تگ هنگام ساخت از این وضعیت اجتناب کنید؛ و میتوانید بهصورت بعدی با دستور
docker tagبه ایمیجی تگ بدهید.
فهرست کردن:
docker images -f dangling=true
حذف:
docker image prune
حذف ایمیجها بر اساس الگو
میتوانید همه ایمیجهایی که با الگویی مطابقت دارند را با ترکیب docker images و grep پیدا کنید. وقتی راضی شدید، میتوانید با استفاده از awk شناسهها را به docker rmi پاس بدهید. دقت کنید این ابزارها توسط داکر عرضه نمیشوند و لزوماً روی همه سیستمها موجود نیستند:
فهرست کردن:
docker images -a | grep "pattern"
حذف:
docker images -a | grep "pattern" | awk '{print $1":"$2}' | xargs docker rmi
حذف همه ایمیجها
همه ایمیجهای داکر روی سیستم را میتوان با افزودن -a به docker images فهرست کرد. وقتی مطمئن شدید میخواهید همه را حذف کنید، میتوانید فلگ -q را اضافه کنید تا شناسه ایمیجها به docker rmi پاس شود:
فهرست کردن:
docker images -a
حذف:
docker rmi $(docker images -a -q)
نکته: پاکسازی کش بیلد داکر: از دستور
docker builder pruneبرای حذف دادههای کشِ بلااستفاده BuildKit استفاده کنید؛ که در روندهای کاری مدرن داکر میتواند فضای دیسک قابل توجهی مصرف کند.
حذف کانتینرها
حذف یک یا چند کانتینر خاص
از دستور docker ps با فلگ -a برای پیدا کردن نام یا شناسه کانتینرهایی که میخواهید حذف کنید استفاده کنید:
فهرست کردن:
docker ps -a
حذف:
docker rm ID_or_Name ID_or_Name
حذف کانتینر هنگام خروج
اگر هنگام ساخت کانتینری میدانید که بعد از اتمام کار نمیخواهید باقی بماند، میتوانید docker run --rm را اجرا کنید تا هنگام خروج خودکار حذف شود:
اجرا و حذف:
docker run --rm image_name
حذف همه کانتینرهای خارجشده
میتوانید کانتینرها را با docker ps پیدا و بر اساس وضعیتشان فیلتر کنید: created، restarting، running، paused یا exited. برای مرور فهرست کانتینرهای خارجشده، از فلگ -f برای فیلتر بر اساس وضعیت استفاده کنید. وقتی تأیید کردید میخواهید آن کانتینرها را حذف کنید، از -q استفاده کنید تا شناسهها به دستور docker rm پاس شوند:
فهرست کردن:
docker ps -a -f status=exited
حذف:
docker rm $(docker ps -a -f status=exited -q)
حذف کانتینرها با بیش از یک فیلتر
فیلترهای داکر را میتوان با تکرار فلگ فیلتر ترکیب کرد. وقتی کلیدهای فیلتر متفاوتی استفاده میکنید (مثلاً status و name)، داکر کانتینرهایی را برمیگرداند که با همه آن معیارها مطابقت دارند (AND منطقی). وقتی همان کلید فیلتر (مثل status) را با چند مقدار تکرار میکنید، داکر کانتینرهایی را برمیگرداند که با هر کدام از آن مقادیر مطابقت دارند (OR منطقی). مثلاً اگر میخواهید همه کانتینرهای علامتخورده بهعنوان created (وضعیتی که میتواند از اجرای کانتینر با دستور نامعتبر نتیجه شود) یا exited را حذف کنید، میتوانید دو فیلتر وضعیت استفاده کنید:
فهرست کردن:
docker ps -a -f status=exited -f status=created
حذف:
docker rm $(docker ps -a -f status=exited -f status=created -q)
حذف کانتینرها بر اساس الگو
میتوانید همه کانتینرهایی که با الگویی مطابقت دارند را با ترکیب docker ps و grep پیدا کنید. وقتی مطمئن شدید فهرست موردنظر برای حذف را دارید، میتوانید از awk و xargs برای تأمین شناسه به docker rm استفاده کنید. دقت کنید این ابزارها توسط داکر عرضه نمیشوند و لزوماً روی همه سیستمها موجود نیستند:
فهرست کردن:
docker ps -a | grep "pattern"
حذف:
docker ps -a | grep "pattern" | awk '{print $1}' | xargs docker rm
متوقف و حذف همه کانتینرها
میتوانید کانتینرهای روی سیستمتان را با docker ps مرور کنید. افزودن فلگ -a همه کانتینرها را نشان میدهد. وقتی مطمئن شدید میخواهید حذفشان کنید، میتوانید فلگ -q را اضافه کنید تا شناسهها به دستورات docker stop و docker rm تأمین شوند:
فهرست کردن:
docker ps -a
حذف:
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
حذف Volumeها
حذف یک یا چند Volume خاص
از دستور docker volume ls برای پیدا کردن نام Volume یا Volumeهایی که میخواهید حذف کنید استفاده کنید. سپس میتوانید یک یا چند Volume را با دستور docker volume rm حذف کنید:
فهرست کردن:
docker volume ls
حذف:
docker volume rm volume_name volume_name
حذف Volumeهای Dangling
چون Volumeها طوری طراحی شدهاند که مستقل از کانتینرها وجود داشته باشند، وقتی کانتینری حذف میشود، Volume همزمان خودکار حذف نمیشود. وقتی Volumeای وجود دارد و دیگر به هیچ کانتینری متصل نیست، Dangling نامیده میشود. برای پیدا کردنشان و تأیید اینکه میخواهید حذفشان کنید، میتوانید از دستور docker volume ls با فیلتری برای محدود کردن نتایج به Volumeهای Dangling استفاده کنید. وقتی از فهرست راضی بودید، میتوانید همه را با docker volume prune حذف کنید:
فهرست کردن:
docker volume ls -f dangling=true
حذف:
docker volume prune
حذف کانتینر بههمراه Volumeاش
اگر Volume بینامی بسازید، میتواند همزمان با کانتینر با فلگ -v حذف شود. دقت کنید این فقط با Volumeهای بینام کار میکند. وقتی کانتینر با موفقیت حذف شد، شناسهاش نمایش داده میشود. داکر صریحاً به حذف Volume اشاره نمیکند. اگر بینام باشد، بیصدا از سیستم حذف میشود. اگر نام داشته باشد، بیصدا باقی میماند.
حذف:
docker rm -v container_name
docker rm در مقابل docker rmi در مقابل docker prune
| دستور | توضیح | اهداف | فلگها |
|---|---|---|---|
docker rm | یک یا چند کانتینر را حذف میکند | کانتینرها | -f برای حذف اجباری، -v برای حذف Volumeها |
docker rmi | یک یا چند ایمیج را حذف میکند | ایمیجها | -f برای حذف اجباری |
docker prune | منابع بلااستفاده یا Dangling را حذف میکند | ایمیجها، کانتینرها، Volumeها، شبکهها | -a برای حذف همه منابع بلااستفاده، -f برای حذف اجباری |
نکته: فلگ
-fبرای حذف اجباری منابع بدون درخواست تأیید استفاده میشود. فلگ-aبرای حذف همه منابع بلااستفاده—including موارد Dangling—استفاده میشود.
خطاهای رایج و دیباگ
مدیریت مسائل همگامسازی ترد وقتی چند کانتینر Volumeها را شریک میکنند
وقتی چند کانتینر Volumeها را شریک میکنند، مسائل همگامسازی ترد میتوانند بروز کنند؛ که بالقوه به خرابی داده یا رفتار غیرمنتظره منجر میشوند. برای مدیریت این مسائل، میتوانید از استراتژیهای زیر استفاده کنید:
۱. استفاده از Volumeهای نامدار: Volumeهای نامدار کنترل و مدیریت بهتری روی دادههای مشترک فراهم میکنند. اینجا مثالی از نحوه استفاده از Volumeهای نامدار در فایل Docker Compose هست:
version: '3.8'
services:
app:
image: myapp
volumes:
- myvolume:/app/node_modules
volumes:
myvolume:
۲. پیادهسازی قفل فایل: از سازوکارهای قفل فایل برای تضمین اینکه فقط یک کانتینر در هر لحظه میتواند به فایلی دسترسی داشته باشد استفاده کنید. این کار با ابزارهایی مثل flock یا lockfile درون کد اپلیکیشنتان قابل انجام است.
۳. استفاده از Docker Compose: Docker Compose به شما اجازه میدهد اپلیکیشنهای چندکانتینری را تعریف و مدیریت کنید؛ و همگامسازی مناسب و اشتراک Volume را تضمین میکند:
version: '3.8'
services:
app:
image: myapp
volumes:
- myvolume:/app/node_modules
depends_on:
- db
db:
image: mydb
volumes:
- myvolume:/var/lib/mysql
volumes:
myvolume:
دیباگ گلوگاههای کارایی ناشی از لایههای اضافی ایمیج
لایههای اضافی ایمیج میتوانند به گلوگاههای کارایی—بهویژه حین فرایند بیلد و دیپلوی—منجر شوند. برای دیباگ و رفع این مسائل، این مراحل را دنبال کنید:
۱. تحلیل لایههای ایمیج: از دستور docker history <image> برای بازرسی لایههای ایمیج و شناسایی لایههای غیرضروری استفاده کنید. مثلاً:
docker history myapp
۲. بهینهسازی Dockerfile: چند دستور RUN را در دستور منفردی ترکیب کنید تا تعداد لایهها کم شود. مثلاً بهجای:
RUN apt update && apt install -y python3
RUN apt install -y python3-pip
استفاده کنید:
RUN apt update && apt install -y python3 python3-pip
۳. استفاده از بیلدهای چندمرحلهای (Multi-Stage): بیلدهای چندمرحلهای به شما اجازه میدهند با کپی کردن فقط artifactهای لازم از مراحل میانی، ایمیجهای کوچکتر و کارآمدتری بسازید. اینجا مثالی است:
FROM scratch AS base
WORKDIR /app
COPY go.mod ./
COPY go.sum ./
RUN go mod download
FROM base AS builder
RUN go build -o myapp
FROM scratch
COPY --from=builder /app/myapp .
CMD ["./myapp"]
رفع خطاهای «container is running» هنگام تلاش برای حذف کانتینر فعال
وقتی سعی میکنید کانتینر فعالی را حذف کنید، ممکن است با خطای «container is running» روبهرو شوید. برای رفع این مسئله چند گزینه دارید:
اول کانتینر را متوقف، سپس حذفش کنید:
docker stop <container_id>
docker rm <container_id>
حذف اجباری کانتینر در یک دستور:
docker rm -f <container_id>
متوقف و حذف همه کانتینرها:
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
استفاده از Docker Compose برای متوقف و حذف کانتینرها:
docker compose down
اگر از Docker Desktop استفاده میکنید، میتوانید از GUI هم برای متوقف و حذف کانتینرها با راست-کلیک روی کانتینر در حال اجرا و انتخاب «Stop» و سپس «Remove» استفاده کنید.
سوالات متداول
۱. چطور همه کانتینرهای متوقفشده را در داکر حذف کنم؟
برای حذف همه کانتینرهای متوقفشده در داکر، از دستور زیر استفاده کنید:
docker compose down
این دستور همه کانتینرهای تعریفشده در فایل docker-compose.yml شما را متوقف و حذف میکند و روی هیچ کانتینر متوقفشده دیگری اثر نمیگذارد. اگر میخواهید هر کانتینر متوقفشدهای را حذف کنید، استفاده کنید:
docker container prune
۲. وقتی docker system prune را اجرا میکنم چه اتفاقی میافتد؟
وقتی docker system prune را اجرا میکنید، داکر همه کانتینرهای متوقفشده و همه شبکههایی را که توسط حداقل یک کانتینر استفاده نشدهاند حذف میکند. علاوه بر این، اگر از فلگ -a استفاده کنید، داکر همه ایمیجهای بلااستفاده را هم حذف میکند. این دستور برای آزاد کردن فضای دیسک و پاکسازی محیط داکر شما مفید است.
۳. آیا میتوانم کانتینر در حال اجرا را حذف کنم؟
بله، میتوانید کانتینر در حال اجرا را با فلگ -f همراه دستور docker rm حذف کنید. این حذف کانتینر را بدون توقف اول اجباری میکند. اینجا مثالی است:
docker rm -f <container_id>
۴. چطور فضای دیسکِ استفادهشده توسط داکر را آزاد کنم؟
برای آزاد کردن فضای دیسکِ استفادهشده توسط داکر، میتوانید از دستورات زیر استفاده کنید:
docker system prune -a # برای حذف همه ایمیجهای بلااستفاده
docker system prune -a -v # برای حذف همه ایمیجها و Volumeهای بلااستفاده
docker volume prune -a # برای حذف همه Volumeهای بلااستفاده
docker network prune -a # برای حذف همه شبکههای بلااستفاده
۵. تفاوت docker rm و docker rmi چیست؟
docker rm برای حذف کانتینر استفاده میشود؛ در حالی که docker rmi برای حذف ایمیج. دستور docker rm کانتینر و منابع مرتبطش را حذف میکند؛ اما ایمیجی را که کانتینر بر پایهاش ساخته شده بود حذف نمیکند. docker rmi از طرف دیگر، ایمیج را حذف میکند؛ اما هیچ کانتینری را که بر پایه آن ایمیج ساخته شدهاند حذف نمیکند.
۶. چطور ایمیج داکر را کاملاً حذف کنم؟
برای حذف کامل ایمیج داکر، از دستور زیر استفاده کنید:
docker rmi <image-id>
<image-id> را با شناسه یا نام ایمیج جایگزین کنید. اگر ایمیج توسط کانتینری در حال استفاده است، باید اول کانتینر را قبل از حذف ایمیج حذف کنید.
۷. چطور ایمیجهای بلااستفاده داکر را حذف کنم؟
ایمیجهای بلااستفاده (Dangling و بدون-تگ) را میتوان با دستور زیر حذف کرد:
docker image prune
برای حذف همه ایمیجهای بلااستفاده، از فلگ --all استفاده کنید:
docker image prune --all
۸. چطور همه ایمیجها و کش داکر را پاک کنم؟
برای حذف همه ایمیجها، کانتینرها، Volumeها و شبکههای داکر، از این دستور استفاده کنید:
docker system prune --all --volumes
نکته: این دستور همهچیزِ مربوط به داکر—including همه کانتینرهای متوقفشده و Volumeها—را حذف میکند.
۹. چطور فایلها را از ایمیج داکر حذف کنم؟
نمیتوانید ایمیج داکر را مستقیم تغییر دهید. بهجایش، ایمیج جدیدی بدون فایلهای ناخواسته بسازید. اینطور:
کانتینر را از ایمیج شروع و داخلش وارد شوید:
docker run -it <image-id> /bin/bash
حالا، فایلها را درون کانتینر در صورت نیاز حذف کنید.
سپس، تغییرات را به ایمیج جدیدی Commit کنید:
docker commit <container-id> <new-image-name>
نکته: استفاده از docker commit عموماً برای روندهای کاری پروداکشن منع میشود. رویکرد توصیهشده، بهروزرسانی Dockerfile برای حذف فایلهای ناخواسته و بیلد مجدد ایمیج است. docker commit فقط برای آزمایشهای سریع یا دیباگ استفاده شود.
۱۰. چطور کانتینرهای قدیمی داکر را حذف کنم؟
برای حذف کانتینرهایی که برای زمان مشخصی غیرفعاب بودهاند، از این استفاده کنید:
docker ps -a --filter "status=exited" --filter "status=created"
docker rm $(docker ps -a -q --filter "status=exited" --filter "status=created")
این کانتینرهای با وضعیت exited یا created را حذف میکند. فیلتر را بر اساس نیازتان تنظیم کنید.
۱۱. ایمیجهای داکر کجا ذخیره میشوند؟
داکر ایمیجها و دادههای کانتینرش را بسته به سیستمعامل و بکاند در حال استفاده، در مکانهای مختلف نگه میدارد.
لینوکس:
روی سیستمهای لینوکسی، داکر همه لایههای ایمیج، کانتینرها و متادیتای مرتبط را بهطور پیشفرض زیر دایرکتوری منفردی ذخیره میکند:
/var/lib/docker
چیدمان داخلی این دایرکتوری بر اساس درایور ذخیرهسازی پیکربندیشده روی هاست—مثل overlay2 یا containerd—متغیر است.
macOS:
هنگام استفاده از Docker Desktop روی macOS، کانتینرها و ایمیجهای لینوکسی داخل فایل دیسک مجازی—بهجای مستقیم روی فایلسیستم هاست—ذخیره میشوند. این فایل معمولاً اینجا پیدا میشود:
~/Library/Containers/com.docker.docker/Data/vms/0/Docker.raw
میتوانید مکان ذخیره این دیسک ایمیج را از رابط Docker Desktop با ناوبری به: Settings ← Resources ← Advanced ← Disk image location بررسی یا تغییر دهید.
ویندوز:
روی ویندوز، مسیر ذخیرهسازی داکر به حالت کانتینر و بکاند بستگی دارد:
کانتینرهای لینوکسی با WSL 2: دادهها درون پروفایل کاربر ذخیره میشوند:
%USERPROFILE%\AppData\Local\Docker\wsl\data
کانتینرهای ویندوزی (درایور windowsfilter): دادههای ایمیج و کانتینر زیر اینها قرار دارند:
C:\ProgramData\docker\image
C:\ProgramData\docker\windowsfilter
بکاند Hyper-V (قدیمی): دایرکتوری ذخیرهسازی هنگام نصب با گزینه نصبکننده --hyper-v-default-data-root قابل پیکربندی است.
میتوانید درایور و مسیر ذخیرهسازی را با این تأیید کنید:
docker info | grep "Docker Root Dir"
۱۲. چطور کانتینر را وقتی داکر تمام شد حذف کنم؟
برای حذف خودکار کانتینر بعد از خروجش، از فلگ --rm هنگام شروع کانتینر استفاده کنید:
docker run --rm <image-id>
این تضمین میکند کانتینر بهمحض توقف حذف شود.
نتیجهگیری
این راهنما برخی از دستورات رایجِ استفادهشده برای حذف ایمیجها، کانتینرها و Volumeها با داکر را پوشش میدهد. ترکیبها و فلگهای زیادی دیگر هم هست که با هر کدام میتوان استفاده کرد. برای راهنمای جامعی از موارد موجود، مستندات داکر برای docker system prune، docker rmi، docker rm و docker volume rm را ببینید. اگر وظایف پاکسازی رایجی هست که دوست دارید در راهنما ببینید، لطفاً در نظرات بپرسید یا پیشنهاد بدهید.




