آموزش حذف ایمیج‌ها، کانتینرها و ولوم‌های داکر

آموزش حذف ایمیج‌ها، کانتینرها و ولوم‌های داکر

آنچه در مقاله می‌خوانید

داکر به شما اجازه می‌دهد اپلیکیشن‌ها و سرویس‌ها را در قالب کانتینر اجرا کنید. با این حال، در طول استفاده، ممکن است تعداد زیادی ایمیج‌های استفاده‌نشده، کانتینرهای متوقف‌شده و ولوم‌های اضافی ایجاد شود که فضای دیسک را اشغال می‌کنند.

داکر ابزارهای داخلی برای پاکسازی این موارد در اختیار قرار می‌دهد. این راهنما، دستورات مهم برای حذف منابع بلااستفاده و مدیریت بهتر فضای سیستم را معرفی می‌کند.

نکات مهم

  • داکر شامل دستورهایی مانند 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 توصیه می‌شود. همچنین اگر نیاز به سناریوهای بیشتر برای پاکسازی یا مدیریت منابع دارید، می‌توانید آن‌ها را به مستندات یا راهنما اضافه کنید.

امتیاز شما به این مطلب
دیدن نظرات
small

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

هشت − 1 =

عضویت در خبرنامه مبین هاست
مطالب کدام دسته‌بندی‌ها برای شما جذاب‌تر است؟

آنچه در مقاله می‌خوانید

مقالات مرتبط
خدمات مبین هاست