تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

چگونه منابع Docker را پاک کنیم؟ تصاویر، کانتینرها و Volumeها


۲۵ مهر ۱۴۰۴

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

برای جلوگیری از این مشکل، Docker مجموعه‌ای از دستورات کاربردی در اختیار شما می‌گذارد تا تنها با چند خط فرمان بتوانید سیستم خود را پاک‌سازی کنید. این راهنما به صورت یک چیت‌شیت سریع تهیه شده تا به کمک آن بتوانید منابع اضافی را حذف کرده و محیط Docker خود را مرتب و بهینه نگه دارید.

در ادامه خواهید خواند:

  • پاک‌سازی همه تصاویر، کانتینرها، Volumeها و شبکه‌های بلااستفاده یا رهاشده (Dangling)
  • حذف تصاویر Docker
  • حذف کانتینرها
  • نحوه حذف Volumeها در Docker
  • مقایسه‌ی docker rm و docker rmi و docker prune
  • خطاهای رایج و اشکال‌زدایی
  • جمع بندی
منابع Docker

پاک‌سازی همه تصاویر، کانتینرها، 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ها؛ می‌توانید محیطی سبک‌تر، سریع‌تر و قابل کنترل‌تر داشته باشید. توجه یه این نکات ساده، در پروژه‌های بزرگ هم از بروز مشکلات ناشی از شلوغی و انباشت منابع جلوگیری خواهد کرد.

به اشتراک بگذارید

برچسب‌ها: