داکر به شما اجازه میدهد اپلیکیشنها و سرویسها را در قالب کانتینر اجرا کنید. با این حال، در طول استفاده، ممکن است تعداد زیادی ایمیجهای استفادهنشده، کانتینرهای متوقفشده و ولومهای اضافی ایجاد شود که فضای دیسک را اشغال میکنند.
داکر ابزارهای داخلی برای پاکسازی این موارد در اختیار قرار میدهد. این راهنما، دستورات مهم برای حذف منابع بلااستفاده و مدیریت بهتر فضای سیستم را معرفی میکند.
نکات مهم
- داکر شامل دستورهایی مانند
docker rm،docker rmiوdocker pruneاست که برای حذف کانتینرها، ایمیجها، ولومها و شبکههای بلااستفاده استفاده میشوند. - دستور
docker system pruneیک روش سریع برای حذف کانتینرهای متوقفشده، شبکههای بلااستفاده و ایمیجهای dangling است و با گزینههای اضافی میتواند پاکسازی کاملتری انجام دهد. - ایمیجهای استفادهنشده را میتوان بهصورت تکی، گروهی یا با فیلترهایی مانند dangling یا الگوهای نام حذف کرد.
- کانتینرها را میتوان بهصورت دستی، گروهی یا بر اساس وضعیت حذف کرد.
- ولومها بهصورت خودکار حذف نمیشوند و باید بهصورت جداگانه پاک شوند.
- آشنایی با تفاوت بین
docker rm،docker rmiوdocker pruneبرای جلوگیری از حذف ناخواسته دادهها ضروری است.
پاکسازی همه ایمیجها، کانتینرها، ولومها و شبکههای بلااستفاده یا dangling
داکر یک دستور واحد برای پاکسازی منابع بلااستفاده ارائه میدهد؛ شامل کانتینرهای متوقفشده، شبکههای استفادهنشده و ایمیجهای dangling:
docker system prune
بهصورت پیشفرض، دستور docker system prune ولومها را حذف نمیکند. برای حذف ولومهای استفادهنشده باید بهصورت صریح از فلگ --volumes استفاده کنید.
برای پاکسازی بیشتر، از جمله حذف همه کانتینرهای متوقفشده و همه ایمیجهای استفادهنشده (نه فقط ایمیجهای dangling)، باید از فلگ -a استفاده کنید:
docker system prune -a
حذف ایمیجهای Docker
برای پیدا کردن ID ایمیجهایی که میخواهید حذف کنید، از دستور docker images با فلگ -a استفاده کنید. این دستور همه ایمیجها را نمایش میدهد، از جمله لایههای میانی.
بعد از پیدا کردن ایمیجهای موردنظر، میتوانید ID یا tag آنها را به دستور docker rmi بدهید:
لیست کردن ایمیجها:
docker images -a
حذف ایمیجها:
docker rmi Image Image
نکته مهم:
فلگ -a یا --all در دستور docker images همه ایمیجهای داکر را نمایش میدهد، از جمله لایههای میانی که به هیچ تگی متصل نیستند. بهصورت پیشفرض، docker images فقط ایمیجهایی را نشان میدهد که حداقل یک tag دارند. با این حال ممکن است برخی ایمیجها بدون tag در سیستم باقی بمانند و همچنان فضای دیسک را اشغال کنند. استفاده از فلگ -a برای شناسایی این ایمیجها و امکان پاکسازی آنها مفید است. همچنین هنگام استفاده از docker rmi میتوان از فلگ -f یا --force برای حذف اجباری ایمیجهای بدون tag استفاده کرد.
حذف ایمیجهای Dangling در Docker
داکر ایمیجها از چندین لایه تشکیل شدهاند. ایمیجهای dangling به لایههایی گفته میشود که هیچ ارتباطی با ایمیجهای دارای tag ندارند. این لایهها دیگر کاربردی ندارند اما همچنان فضای دیسک را اشغال میکنند.
برای پیدا کردن این ایمیجها میتوان از فیلتر زیر در دستور docker images استفاده کرد:
لیست:
docker images -f dangling=true
برای حذف آنها از دستور زیر استفاده میشود:
حذف:
docker image prune
نکته مهم:
اگر یک ایمیج را بدون tag بسازید، در لیست ایمیجهای dangling نمایش داده میشود، چون به هیچ ایمیج tag شدهای متصل نیست. برای جلوگیری از این وضعیت، بهتر است هنگام ساخت ایمیج از tag استفاده کنید. همچنین میتوانید بعدا با دستور docker tag به یک ایمیج بدون tag، tag اضافه کنید.
حذف ایمیجها بر اساس الگو یا Pattern
داکر میتوانید ایمیجهایی را که با یک الگو مشخص مطابقت دارند، با ترکیب docker images و grep پیدا کنید. پس از اطمینان از نتیجه، میتوانید با استفاده از awk شناسهها را به docker rmi منتقل کرده و آنها را حذف کنید.
توجه: ابزارهایی مانند grep و awk جزو داکر نیستند و ممکن است روی همه سیستمها در دسترس نباشند.
لیست:
docker images -a | grep "pattern"
حذف:
docker images -a | grep "pattern" | awk '{print $1":"$2}' | xargs docker rmi
حذف همه ایمیجها
برای نمایش همه ایمیجهای سیستم:
docker images -a
برای حذف همه ایمیجها، میتوان ID همه آنها را با گزینه -q به docker rmi پاس داد:
حذف:
docker rmi $(docker images -a -q)
پاکسازی کش Build در Docker
برای حذف دادههای کش BuildKit که توسط فرآیند build ایجاد میشوند و ممکن است فضای زیادی اشغال کنند، از دستور زیر استفاده میشود:
docker builder prune
حذف کانتینرها در Docker
داکر امکان مدیریت و حذف کانتینرها را بهصورت دقیق یا گروهی فراهم میکند.
حذف یک یا چند کانتینر مشخص
برای پیدا کردن نام یا ID کانتینرها از دستور زیر استفاده کنید:
لیست کانتینرها:
docker ps -a
پس از شناسایی کانتینر موردنظر، میتوانید آن را با نام یا ID حذف کنید:
حذف کانتینر:
docker rm ID_or_Name ID_or_Name
حذف خودکار کانتینر هنگام خروج
اگر از ابتدا مشخص باشد که کانتینر بعد از اجرا نیازی به نگهداری ندارد، میتوان از گزینه --rm استفاده کرد تا پس از توقف، بهصورت خودکار حذف شود:
اجرای کانتینر و حذف خودکار:
docker run --rm image_name
حذف همه کانتینرهای متوقفشده
برای مشاهده کانتینرهای متوقفشده:
لیست:
docker ps -a -f status=exited
برای حذف آنها:
حذف:
docker rm $(docker ps -a -f status=exited -q)
حذف کانتینرها با چند فیلتر
فیلترهای داکر میتوانند ترکیب شوند. اگر فیلترهای مختلف (مثل status و name) استفاده شوند، نتیجه شامل کانتینرهایی است که همه شرایط را همزمان دارند (AND).
اگر یک فیلتر مانند status چند بار استفاده شود، نتیجه شامل همه مقادیر خواهد بود (OR).
مثلا برای حذف کانتینرهایی که در حالت exited یا created هستند:
لیست:
docker ps -a -f status=exited -f status=created
حذف:
docker rm $(docker ps -a -f status=exited -f status=created -q)
حذف کانتینرها بر اساس الگو یا Pattern
داکر میتوانید کانتینرهایی را که با یک الگوی مشخص مطابقت دارند، با ترکیب docker ps و grep پیدا کنید. پس از بررسی لیست، میتوانید با استفاده از awk و xargs شناسهها را به docker rm منتقل کرده و آنها را حذف کنید.
توجه: ابزارهایی مانند grep، awk و xargs جزو داکر نیستند و ممکن است روی همه سیستمها در دسترس نباشند.
لیست:
docker ps -a | grep "pattern"
حذف:
docker ps -a | grep "pattern" | awk '{print $1}' | xargs docker rm
توقف و حذف همه کانتینرها
برای مشاهده همه کانتینرها:
docker ps -a
برای توقف و حذف همه کانتینرها:
توقف:
docker stop $(docker ps -a -q)
حذف:
docker rm $(docker ps -a -q)
حذف ولومها در Docker
داکر امکان مدیریت و حذف ولومها را بهصورت جداگانه فراهم میکند. ولومها برای ذخیره دادهها بهصورت مستقل از کانتینرها طراحی شدهاند، بنابراین معمولا بهصورت خودکار حذف نمیشوند.
حذف یک یا چند ولوم مشخص
برای پیدا کردن نام ولومها از دستور زیر استفاده کنید:
لیست ولومها:
docker volume ls
پس از شناسایی ولومهای موردنظر، میتوانید آنها را حذف کنید:
حذف ولومها:
docker volume rm volume_name volume_name
حذف ولومهای dangling
ولومها بهطور مستقل از کانتینرها وجود دارند، بنابراین پس از حذف یک کانتینر، ولوم مربوط به آن بهصورت خودکار حذف نمیشود. اگر ولومی دیگر به هیچ کانتینری متصل نباشد، به آن dangling volume گفته میشود.
برای مشاهده ولومهای dangling:
docker volume ls -f dangling=true
برای حذف آنها:
docker volume prune
حذف کانتینر همراه با ولوم
اگر یک ولوم بدون نام ایجاد کرده باشید، میتوان آن را همزمان با حذف کانتینر پاک کرد. این کار با استفاده از فلگ -v انجام میشود.
حذف کانتینر همراه با ولوم:
docker rm -v container_name
نکته:
این روش فقط روی ولومهای بدون نام کار میکند. در این حالت، ولومهای بدون نام پس از حذف کانتینر بهصورت خودکار و بدون نمایش خاصی حذف میشوند. ولومهای نامدار در سیستم باقی میمانند.
خطاهای رایج و دیباگ در Docker
مدیریت مشکلات همگامسازی هنگام اشتراک Volume بین چند کانتینر، زمانی که چند کانتینر از یک Volume مشترک استفاده میکنند، ممکن است مشکلات همگامسازی ایجاد شود که میتواند منجر به خرابی داده یا رفتار غیرمنتظره شود. همچنین در چنین سناریوهایی، استفاده از زیرساخت پایدار مانند سرور مجازی ایران یا سرور اختصاصی میتواند مدیریت کانتینرها را سادهتر و قابلاعتمادتر کند.
۱. استفاده از Named Volumes
Named volumeها کنترل و مدیریت بهتری روی دادههای مشترک فراهم میکنند.
مثال در Docker Compose:
version: '3.8' services: app: image: myapp volumes: - myvolume:/app/node_modules volumes: myvolume:
۲. استفاده از File Lock
برای جلوگیری از دسترسی همزمان چند کانتینر به یک فایل، میتوان از مکانیزم file locking استفاده کرد (مثل 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
لایههای زیاد در ایمیجها میتوانند باعث کاهش سرعت در فرآیند build و deploy شوند. برای شناسایی و رفع این مشکل، مراحل زیر استفاده میشود:
۱. بررسی لایههای ایمیج
برای مشاهده و تحلیل لایههای یک ایمیج و پیدا کردن موارد غیرضروری از دستور زیر استفاده میشود:
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
ترکیب دستورات باعث کاهش تعداد لایهها و بهبود عملکرد build میشود.
۳. استفاده از Multi-Stage Builds
Docker Build امکان ساخت ایمیجهای کوچکتر و بهینهتر را فراهم میکند. در این روش فقط فایلهای ضروری از مراحل میانی به ایمیج نهایی منتقل میشوند.
مثال:
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 اجازه حذف مستقیم آن را نمیدهد.
۱. توقف و سپس حذف کانتینر
ابتدا کانتینر را متوقف کنید و سپس آن را حذف کنید:
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 استفاده میکنید، میتوانید همه سرویسها را بهصورت همزمان متوقف و حذف کنید:
docker compose down
۵. استفاده از Docker Desktop
در صورت استفاده از Docker Desktop، میتوانید:
- روی کانتینر راستکلیک کنید
- گزینه Stop
- سپس Remove
را انتخاب کنید.
نتیجهگیری
این راهنما مجموعهای از دستورات رایج برای حذف ایمیجها، کانتینرها و ولومها در داکر را پوشش داد. البته داکر ابزارها، ترکیبها و فلگهای بیشتری برای مدیریت و پاکسازی منابع در اختیار قرار میدهد که بسته به سناریو میتوان از آنها استفاده کرد. برای اطلاعات کاملتر، مراجعه به مستندات رسمی Docker درباره دستورهای docker system prune، docker rmi، docker rm و docker volume rm توصیه میشود. همچنین اگر نیاز به سناریوهای بیشتر برای پاکسازی یا مدیریت منابع دارید، میتوانید آنها را به مستندات یا راهنما اضافه کنید.


