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

درنظر داشته باشید که با این روش‌ها و فرمان‌هایی که در ادامه می‌آیند، مدیریت کانتینر Docker سریع‌تر و ساده تر خواهد شد.

پیش‌نیازها

  • یک سیستم لینوکس که در آن Docker اجرا باشد.
  • دسترسی به خط فرمان یا ترمینال (Ctrl+Alt+T در اوبونتو و Alt+F2 در Alt+F2)
  • حساب کاربری با دسترسی sudo

نکته: در صورتی که هنگام تلاش برای حذف، سیستم با پیغام “access denied” به شما واکنش داد، پیشوند sudo را به ابتدای فرمان اضافه کنید.

نحوه حذف کانتینرهای Docker

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

توقف کانتینرها

۱) در ابتدا لیستی از تمام کانتینرهای Docker تهیه کنید.


docker container ls -a

در خروجی، لیستی از تمام کانتیرهای در حال اجرا، شناسه، نام، ایمیج‌ها، وضعیت‌ها و سایر پارامترهای آنها را ملاحظه خواهید کرد.

لیست تمام کانتینرهای Docker

لیست تمام کانتینرهای Docker

همچنین می‌توانید لیستی از تمام کانتینرها بر اساس شناسه عددی آنها تهیه کنید.


docker container ls –aq

لیست تمام کانتینرهای Docker بر اساس شناسه آنها

لیست تمام کانتینرهای Docker بر اساس شناسه آنها

۲) برای توقف یک کانتینر خاص، از قالب فرمان زیر استفاده کنید.


docker container stop [container_id]

درنظر داشته باشید که حتماً به جای [container_id]، شناسه کانتینر خودتان در لیست را بنویسید.

همچنین می‌توانید چند شناسه کانتینر را در همین فرمان وارد کنید.

برای توقف تمام کانتینرها، فرمان زیر را تایپ کنید.


docker container stop $(docker container ls –aq)

چنین فرمانی باعث می‌شود که Docker از لیست تمام شناسه‌های کانتینرها برای فرمان توقف استفاده کند.

نکته: اگر به صورت کاربر sudo وارد سیستم شده باشید، حتماً دقت کنید که برای توقف تمام کانتینرها، پیشوند sudo را قبل از هر دو فرمان docker وارد کنید.

حذف یک کانتینر متوقف‌شده

برای حذف یک کانتینر متوقف‌شده، از این فرمان استفاده نمایید.


docker container rm [container_id]

به این ترتیب، این فرمان باعث حذف کانتینر با شناسه‌ای است که در آن وارد کرده‌اید.

حذف تمام کانتینرهای Docker که از قبل متوقف شده‌اند

به منظور حذف تمام کانتینرهای متوقف‌شده داریم:


docker container rm $(docker container ls –aq)

حذف تمام کانتینرهای Docker

برای پاک‌کردن کامل Docker و شروع دوباره استفاده از آن، فرمان زیر را تایپ کنید.


docker container stop $(docker container ls –aq) && docker system prune –af ––volumes

در نتیجه، تمام کانتینرهایی که درون پرانتز لیست شده‌اند، متوقف خواهند شد.

درون پرانتز، شما برای Docker تعیین می‌کنید که لیستی از تمام کانتینرها بر اساس شناسه عددی آنها تهیه کند. سپس این اطلاعات به فرمان توقف کانتینر انتقال داده می‌شود و به این ترتیب، تمام کانتینرهای Docker متوقف می‌شوند.

استفاده از عبارت && به Docker می‌گوید که تمام کانتینرها متوقف‌شده و حجم‌ها را حذف کند.

گزینه –af نشان می‌دهد که این فرمان باید برای تمام کانتینرهاو بدون نیاز به تآیید انجام شود.

حذف کانتینر همراه با فیلتر

در همین حال، می‌توانید تمام آبجکت‌های مرتبط با یک برچسب خاص را حذف کنید. برای این منظور داریم:


docker container prune ––filter=”label!=maintainer=arianet”

این فرمان به Docker می‌گوید که تمام کانتینرهایی که در آن عبارت “arianet” وجود ندارد را حذف کند.  عبارت != یک مفهوم منطقی به معنای «عدم برابر بودن یک پارامتر» است.

مجموعه‌ای از فرمان‌های label را در زیر مشاهده می‌کنید.


label=<key>

label=<key>=<value>

label!=<key>

label!=<key>=<value>

استفاده از این عبارت‌ها همراه با برچسب‌ها در Docker، کنترل کامل بر آیتم ها در اختیارتان قرار می‌دهد.

نحوه حذف ایمیج‌های Docker

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

۱) برای حذف یک ایمیج Docker، از لیست تمام ایمیج‌های موجود در سیستم شروع می‌کنیم.


docker image ls

خروجی نشان‌دهنده تمام ایمیج‌های لوکال و در دسترس خواهد بود.

لیست ایمیج‌های Docker

لیست ایمیج‌های Docker

۲) شناسه ایمیج خود را یادداشت کنید. این شناسه برای حذف ایمیج مورد استفاده قرار خواهد گرفت.

۳) سپس ایمیج یا ایمیج‌های ناخواسته را حذف کنید.


docker image rm [image_id1] [image_id2]

عبارت‌های [image_id1] و [image_id2] را با شناسه ایمیجی که از فرمان قبلی یادداشت کرده بودید، جایگزین کنید. امکان وارد کردن یک یا چند شناسه در اینجا وجود خواهد داشت.

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

حذف ایمیج‌های Docker با فیلتر

در زمان نگارش این مطلب، تنها فیلترهای پشتیبانی‌شده until و label هستند. البته اینها ابزراهای قدرتمند مدیریت منابع Docker به شمار می‌‌روند.

با استفاده از فیلتر until می‌توانید تمام منابع تا یک زمان خاص را حذف کنید. برای این منظور، فرمان زیر را وارد نمایید.


docker image prune –a ––filter “until=24h”

در نتیجه، تمام ایمیج‌های ۲۴ ساعت اخیر حذف می‌شوند. این فرمان می‌تواند برای کانتینرها، ایمیج‌ها و فیلترها مورد استفاده قرار گیرد. حتماً دقت کنید که کدام آیتم را برای حذف انتخاب می‌کنید. در فرمان until امکان استفاده از بازه‌های زمانی یونیکس، با فرمت date و یا مدت زمان ( به صورت 30m، 4h و 2h25m) نسبت به ساعت سیستم وجود دارد.

با استفاده از فرمان label می‌توانید آیتم‌ها را بر اساس برچسب حذف کنید. برای این منظور فرمان زیر را وارد کنید.


docker image prune ––filter=”label=old”

در نتیجه تمام ایمیج‌های docker که برچسب “old” دارند، حذف می‌شوند.

این فیلرینگ می‌تواند برای تعریف یک مقدار خاص از برچسب نیز استفاده شود. به عنوان مثال اگر یک کانتینر با کلید “maintainer” تعریف شده و مقدار “maintainer” برابر “bill” یا “jeremy” باشد، می‌توانید فرمان زیر را تایپ کنید.


docker container prune ––filter=”label=maintainer=bill”

در نتیجه، Docker تمام کانتینرها با برچسب “maintainer” برابر “bill” حذف خواهد کرد.

نحوه حذف حجم‌های Docker

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

۱) با استفاده از فرمان زیر لیستی از حجم‌های Docker در دسترس ایجاد کنید.


docker volume ls

لیست حجم های Docker

لیست حجم های Docker

در اینجا نام حجمی را که می‌خواهید حذف کنید، یادداشت نمایید.

۲) حالا فرمان زیر را وارد کنید.


docker volume rm VolumeName

حتماً به جای VolumeName، نام حجمی را که در فرمان قبلی یادداشت کرده بودید، وارد کنید.

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

نحوه حذف شبکه‌های Docker

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

فرمان prune تمام شبکه‌های بلا استفاده را حذف می‌کند.

حذف شبکه یکتا

۱) نمایش لیستی از تمام شبکه‌های Docker موجود با کمک فرمان زیر:


docker network ls

۲) شناسه شبکه را یادداشت کنید. این شنساه برای حذف یک شبکه خاص مورد استفاده قرار خواهد گرفت. سپس فرمان زیر را وارد کنید.


docker network rm [networkID]

عبارت [networkID] را با شناسه‌ای که از فرمان قبلی گرفته‌اید، جایگزین کنید.

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

حذف تمام آبجت‌های غیرضروری Docker

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

در یک پنجره ترمینال، فرمان زیر را وارد کنید.


docker system prune

سایر گزینه‌هایی که می توان در این فرمان استفاده کرد.

  • –a برای اضافه‌کردن کانتینرهای متوقف‌شده و ایمیج‌های بدون استفاده
  • –f عبور از پیغام تأیید
  • ––volumes حذف تمام حجم‌های بدون استفاده

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


docker container prune

docker image prune

docker volume prune

docker network prune

استفاده از فرمان docker system prune -a باعث حذف هر دو نوع ایمیج در حال استفاده و بدون استفاده می‌شود. البته این شامل ایمیج‌هایی که در حال استفاده در یک کانتینر هستند، نخواهد شد.

لیست تمام منابع Docker

فرمان‌های زیر را برای نمایش منابع وارد کنید.


docker container ls

docker image ls

docker volume ls

docker network ls

docker info

این فرمان‌ها برای موقعیت‌یابی و شناسایی منابعی که می‌خواهید آنها را نگهداری و یا حذف کنید، به کار می‌آیند. در همین حال، امکان استفاده از گزینه‌های زیر نیز وجود خواهد داشت.

  • –a نمایش کل یک منبع (شامل آنهایی که متوقف کرده‌اید)
  • –q یا –quiet صرفاً نمایش شناسه عددی

جمع‌بندی

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