آنچه در این مقاله میخوانید
چگونه منابع Docker را پاک کنیم؟ تصاویر، کانتینرها و Volumeها
۲۵ مهر ۱۴۰۴
Docker راهی ساده برای اجرای اپلیکیشنها در کانتینرها فراهم میکند، اما در طول کار ممکن است تعداد زیادی Image، Container و Volume بلااستفاده روی سیستم باقی بمانند. این منابع به مرور فضای دیسک را اشغال کرده و محیط کاری را شلوغ میکنند.
برای جلوگیری از این مشکل، Docker مجموعهای از دستورات کاربردی در اختیار شما میگذارد تا تنها با چند خط فرمان بتوانید سیستم خود را پاکسازی کنید. این راهنما به صورت یک چیتشیت سریع تهیه شده تا به کمک آن بتوانید منابع اضافی را حذف کرده و محیط Docker خود را مرتب و بهینه نگه دارید.
در ادامه خواهید خواند:
- پاکسازی همه تصاویر، کانتینرها، Volumeها و شبکههای بلااستفاده یا رهاشده (Dangling)
- حذف تصاویر Docker
- حذف کانتینرها
- نحوه حذف Volumeها در Docker
- مقایسهی
docker rm
وdocker rmi
وdocker prune
- خطاهای رایج و اشکالزدایی
- جمع بندی

پاکسازی همه تصاویر، کانتینرها، Volumeها و شبکههای بلااستفاده یا رهاشده (Dangling)
Docker یک دستور واحد در اختیار شما قرار میدهد که میتواند تمام منابع شامل تصاویر، کانتینرها، Volumes و شبکهها را که رهاشدهاند (بدون تگ یا بدون ارتباط با یک کانتینر) پاکسازی کند:
docker system prune
برای حذف کانتینرهای متوقفشده و همچنین تمام تصاویر بلااستفاده (نه فقط موارد رهاشده)، میتوانید از فلگ -a
همراه دستور استفاده کنید:
docker system prune -a
حذف تصاویر Docker
از دستور docker images
همراه با فلگ -a
برای پیدا کردن شناسه (ID) تصاویری که میخواهید حذف کنید استفاده کنید. این دستور همه تصاویر، شامل لایههای میانی (intermediate layers) را نشان میدهد. زمانی که تصاویر موردنظر خود را پیدا کردید، میتوانید شناسه یا تگ آنها را به دستور docker rmi
بدهید:
نمایش لیست:
docker images -a
حذف:
docker rmi Image Image
توضیح: فلگ -a
یا --all
در دستور docker images
همه تصاویر Docker، شامل لایههای میانی که هیچ تگی ندارند، نمایش میدهد. بهطور پیشفرض، docker images
تنها تصاویری که حداقل یک تگ دارند را نشان میدهد. با این حال ممکن است برخی تصاویر بدون تگ هم وحود داشته باشند که فضای دیسک را اشغال میکنند. فلگ -a کمک میکند تا این تصاویر را شناسایی و برای آزادسازی فضای دیسک پاک کنید. هنگام استفاده از دستور docker rmi
، میتوان از فلگ -f
یا --force
برای حذف تصاویر بدون تگ نیز استفاده کرد.
با هاست Docker لیارا، اپلیکیشنهات رو در محیطی ایزوله و امن اجرا کن.
✅ نصب آسان✅ مدیریت راحت منابع✅ مقیاسپذیری سریع
خرید و راهاندازی هاست Docker
حذف تصاویر Dangling Docker
تصاویر Docker از چندین لایه تشکیل شدهاند. تصاویر 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 نیستند و ممکن است روی همه سیستمها در دسترس نباشند:
نمایش لیست:
docker images -a | grep "pattern"
حذف:
docker images -a | grep "pattern" | awk '{print $1":"$2}' | xargs docker rmi
حذف همه تصاویر
تمام تصاویر Docker روی سیستم میتوانند با اضافه کردن فلگ -a
به دستور docker images
نمایش داده شوند. وقتی مطمئن شدید میخواهید همه آنها را حذف کنید، میتوانید از فلگ -q
برای ارسال شناسه تصاویر به دستور docker rmi
استفاده کنید:
نمایش لیست:
docker images -a
حذف:
docker rmi $(docker images -a -q)
اجرای کانتینرهای ابری با رویکرد Docker Offload
Docker Offload
حذف کانتینرها
از دستور docker ps
همراه با فلگ -a
برای پیدا کردن نام یا شناسه (ID) کانتینرهایی که میخواهید حذف کنید استفاده کنید:
نمایش لیست:
docker ps -a
حذف:
docker rm ID_or_Name ID_or_Name
حذف کانتینر بلافاصله پس از خروج
اگر هنگام ایجاد کانتینر میدانید که بعد از اتمام کار نیازی به نگهداری آن ندارید، میتوانید از دستور docker run --rm
استفاده کنید تا کانتینر بهصورت خودکار پس از خروج خدف شود:
اجرا و حذف:
docker run --rm image_name
حذف تمام کانتینرهای exited
میتوانید لیست کانتینرها را با دستور docker ps -a
مشاهده کنید و آن را بر اساس وضعیت (status) فیلتر کنید: created
restarting
, running
, paused
یا exited
. برای بررسی لیست کانتینرهایی که در حالت exited
هستند، از فلگ -f
استفاده کنید. پس از اطمینان از لیست، با استفاده از فلگ -q
شناسهها را به دستور docker rm
بدهید:
نمایش لیست:
docker ps -a -f status=exited
حذف:
docker rm $(docker ps -a -f status=exited -q)
حذف کانتینرها با بیش از یک فیلتر
فیلترهای Docker را میتوان با تکرار فلگ -f
و افزودن مقدارهای بیشتر ترکیب کرد. این کار لیستی از کانتینرها برمیگرداند که یکی از شرایط را دارند. بهعنوان مثال، اگر بخواهید همه کانتینرهایی که در وضعیت 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
بدهید و توجه داشته باشید که این ابزارها (مانند grep
و awk
) بخشی از Docker نیستند و ممکن است روی همه سیستمها در دسترس نباشند:
نمایش لیست:
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)
آموزش نصب وردپرس با Docker Compose
نصب وردپرس با Docker
نحوه حذف Volumeها در Docker
برای پیداکردن نام Volumeهایی که میخواهند حذف کنید از دستور docker volume ls
استفاده کنید. سپس میتوانید با دستور docker volume rm
یک یا چند Volume را حذف کنید.
نمایش لیست:
docker volume ls
حذف:
docker volume rm volume_name volume_name
حذف Volumes رهاشده (Dangling)
ار آنجایی که هدف Volume این است که مستقل از کانتینرها وجود داشته باشد، وقتی یک کانتینر حذف میشود، Volume مربوط به آن بهصورت خودکار حذف نمیشود. زمانی که یک Volume وجود داشته باشد و دیگر به هیچ کانتینری متصل نباشد، به آن dangling volume گفته میشود. برای یافتن آنها میتوانید از دستور docker volume ls
همراه با یک فیلتر استفاده کنید تا فقط Volumes رهاشده نمایش داده شوند. پس از اطمینان، میتوانید همه آنها را با دستور docker volume prune
حذف کنید:
نمایش لیست:
docker volume ls -f dangling=true
حذف:
docker volume prune
حذف یک کانتینر و Volume آن
اگر یک Volume بدون نام ایجاد کنید، میتوانید آن را همزمان با کانتینر و با استفاده از فلگ -v
حذف کنید. توجه داشته باشید این قابلیت فقط برای Volumes بدون نام کار میکند. زمانی که کانتینر با موفقیت حذف شود، شناسه (ID) آن نمایش داده میشود. توجه کنید که اشارهای به حذف Volume نمیشود: اگر بدون نام باشد، به صورت خودکار و بیصدا از سیستم حذف میشود و اگر نامگذاری شده باشد، بیصدا در سیستم باقی میماند.
حذف:
docker rm -v container_name
مقایسهی docker rm
و docker rmi
و docker prune
دستور | توضیحات | هدفها | فلگها |
---|---|---|---|
docker rm | حذف یک یا چند کانتینر | کانتینرها | -f برای حذف اجباری، -v برای حذف Volumes |
docker rmi | حذف یک یا چند تصویر | تصاویر | -f برای حذف اجباری |
docker prune | حذف منابع بلااستفاده یا رهاشده (dangling) | تصاویر، کانتینرها، Volumes، شبکهها | -a برای حذف همه منابع بلااستفاده، -f برای حذف اجباری |
نکته:
- فلگ
-f
برای حذف اجباری منابع بدون نیاز به تایید کاربر استفاده میشود. - فلگ
-a
برای حذف همه منابع بلااستفاده، شامل موارد رهاشده (dangling)، به کار میرود
خطاهای رایج و اشکالزدایی
در کار با Docker، علاوه بر مدیریت منابع، ممکن است با خطاها یا مشکلاتی روبهرو شوید که نیاز به بررسی و اشکالزدایی دارند. این مشکلات میتوانند از همگامسازی دادهها بین کانتینرها گرفته تا افت کارایی یا خطاهای مربوط به حذف کانتینر فعال متفاوت باشند. در ادامه به برخی از رایجترین این خطاها و راهکارهای مقابله با آنها میپردازیم.
مدیریت مشکلات همگامسازی (Synchronization) زمانی که چندین کانتینر یک Volume را به اشتراک میگذارند
وقتی چند کانتینر یک Volume مشترک دارند، مشکلاتی مثل عدم هماهنگی در نخها (thread synchronization) میتواند منجر به خرابی داده یا رفتارهای غیرمنتظره شود. برای مدیریت این مشکل میتوانید از راهکارهای زیر استفاده کنید:
- استفاده از Volumes نامگذاریشده (Named Volumes): این نوع Volumes کنترل و مدیریت بهتری روی دادههای اشتراکی فراهم میکنند.
نمونهای از استفاده در فایل Docker Compose:
version: '3.8'
services:
app:
image: myapp
volumes:
- myvolume:/app/node_modules
volumes:
myvolume:
- پیادهسازی قفل فایل (File Locks): با استفاده از ابزارهایی مانند
flock
یاlockfile
در کد اپلیکیشن، دسترسی همزمان چند کانتینر به یک فایل محدود میشود و تنها یک کانتینر در لحظه میتواند فایل را تغییر دهد. - استفاده از Docker Compose: با Docker Compose میتوانید اپلیکیشنهای چندکانتینری را مدیریت کنید تا همگامسازی و اشتراکگذاری Volumes به درستی انجام شود.
نمونهای از فایل 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:
اشکالزدایی مشکلات کارایی ناشی از لایههای زیاد در تصاویر (Image Layers)
تعداد زیاد لایهها در یک تصویر میتواند منجر به افت کارایی شود، مخصوصا در زمان build و استقرار. برای رفع این مشکل مراحل زیر را دنبال کنید:
- تحلیل لایههای تصویر: با دستور زیر میتوانید لایههای تصویر را بررسی کنید و لایههای اضافی را شناسایی کنید:
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 Builds: این روش امکان ساخت تصاویر کوچکتر و کارآمدتر را میدهد، چون فقط فایلها و باینریهای ضروری از مراحل میانی کپی میشوند.
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) کانتینر در حال اجرا را با راست کلیک متوقف و سپس حذف کنید.
چگونه Consul را با استفاده از Docker پیکربندی کنیم!
پیکربندی Consul با استفاده از Docker
جمع بندی
در نهایت، مدیریت صحیح منابع در Docker نه تنها باعث آزادسازی فضای دیسک میشود، بلکه نظم بیشتری به محیط توسعه و استقرار شما میدهد. با استفاده از دستوراتی مانند حذف تصاویر غیرضروری، پاکسازی کانتینرهای متوقف شده و مدیریت Volumeها؛ میتوانید محیطی سبکتر، سریعتر و قابل کنترلتر داشته باشید. توجه یه این نکات ساده، در پروژههای بزرگ هم از بروز مشکلات ناشی از شلوغی و انباشت منابع جلوگیری خواهد کرد.