داکر برای راحت‌تر کردن فرآیند build, test و deploy و اجرای سرویس‌ها به صورت پرتابل ساخته شده است. داکر به صورت خودکار آبجکت‌هایی که دیگه ازشون استفاده نمیشه مثل کانتینرهای بدون استفاده، ایمیج‌های بدون استفاده، دیسک‌های مجازی بدون استفاده و شبکه‌های مجازی رو پاک نمیکنه. وقتی شما با داکر کار می‌کنید ممکنه بسیار آبجکت بدون استفاده در طول زمان ایجاد کنید این آبجکت‌های بدون استفاده فضای دیسک شما رو اشغال می‌کنند پس بهتره به صورت مدیریت شده اقدام به پاکسازی کنید.

پاک کردن تمام آبجکت‌های بدون استفاده

دستور docker system prune میتونه تمام کانتینرهای stop شده و تمام ایمیج‌هایی که از روی اونها کانتینری در حال اجرا وجود نداره و تمام شبکه‌های بدون استفاده رو پاکسازی میکنه:

docker system prune

شما می‌تونید با آپشن f- یا force-- این پرامپت رو نادیده بگیرید.

WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N] y

برای پاکسازی تمام شبکه‌های بدون استفاده آپشن volumes-- رو به دستور پاس بدید: 

docker system prune --volumes
WARNING! This will remove:

  - all stopped containers
  - all networks not used by at least one container
  - all volumes not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N] n

پاک کردن کانتینرها

وقتی شما کانتینرهای داکر رو stop می‌کنید اونها به صورت خودکار از هاست شما پاک نمی‌شوند مگر اینکه موقع اجرای کانتینر اون رو با آپشن rm-- اجرا کنید.

پاک کردن یک یا چند کانتینر

برای پاک کردن یک یا چند کانتینر از دستور docker container rm container-id container-id استفاده می‌کنیم.

برای داشتن یک لیستی از تمام کانتینرهای فعال و غیرفعال آپشن a رو به دستور docker container ls اضافه می‌کنیم:

$ docker container ls -a

خروجی شبیه به خروجی زیر هستش:

$ docker container ls -a

CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                    PORTS                                            NAMES

7f3154ed6c85        oracle/database:19.3.0-ee   "/bin/sh -c 'exec $O…"   29 minutes ago      Up 29 minutes (healthy)   0.0.0.0:1521->1521/tcp, 0.0.0.0:5500->5500/tcp   oracle

از طریق خروجی این دستور container id های مورد نظر رو پیدا کنید و اون آی دی ها رو به دستور docker container rm بدهید مانند:

$ docker container rm cc3f2ff51cab cd20b396a061

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

Error response from daemon: You cannot remove a running container fc983ebf4771d42a8bd0029df061cb74dc12cb174530b2036987575b83442b47. Stop the container before attempting removal or force remove.

پاک کردن تمام کانتینرهای stop شده

قبل از زدن دستور پاک کردن کانتینر شما باید کانتینرها رو stop کنید. برای دیدن لیست تمام کانتینرهای stop شده که برای پاک شده آماده هستند از دستور زیر استفاده کنید:

$ docker container ls -a --filter status=exited --filter status=created

برای پاک کردن تمام کانتینرهای stop شده از دستور زیر استفاده کنید:

$ docker container prune

شما می‌تونید با آپشن f- یا force-- این پرامپت رو نادیده بگیرید.

WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N] y

پاک کردن کانتینر با استفاده از فیلترگذاری

دستور docker container prune به شما این امکان رو میده که با استفاده از فیلترگذاری یک کانتینر رو پاک کنید. برای اینکار از آپشن flag-- استفاده کنید.

تا زمان نوشته شدن این مطلب داکر از until و label برای فیلترگذاری پشتیبانی میکنه. اطلاعات بیشتر

همچنین شما می‌تونید از چند آپشن filter-- استفاده کنید. برای مثال برای پاک کردن تمام ایمیج‌هایی که در ۱۲ ساعت قبل ساخته شده‌اند از دستور زیر استفاده کنید:

$ docker container prune --filter "until=12h" 

خاموش، پاک کردن تمام کانتینرها

شما می‌تونید لیست تمام کانتینرهای موجود در سیستم‌تان را با دستور docker container ls -aq دریافت کنید.

برای stop کردن تمام کانتینرهای در حال اجرا از دستور docker container stop به شکل زیر استفاده کنید.

$ docker container stop $(docker container ls -aq)

وقتی تمام کانتینرها stop شدند شما می‌تونید با دستور docker container rm به صورت زیر اونها رو پاک کنید:

$ docker container rm $(docker container ls -aq)

پاک کردن ایمیج‌های داکر

پاک کردن یک یا چند ایمیج

برای پاک کردن ایمیج‌ها ابتدا باید آی دی اونها رو پیدا کنید با دستور docker images ls می‌تونید لیست ایمیج‌ها رو مشاهده کنید و آی دی ایمیج‌های مورد نظر خودتون رو یادداشت کنید.

$ docker image ls

خروجی میتونه شبیه این باشه:

$ docker image ls
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
oracle/database        19.3.0-ee           626c764aa200        28 hours ago        6.65G
nginx                  latest              ab56bba91343        11 days ago         126M
sameersbn/gitlab       latest              29ccdd644eb5        11 days ago         2.45G
jenkins/jenkins        lts                 f32b4bb22e4d        3 weeks ago         571M
oraclelinux            7-slim              874477adb545        6 weeks ago         118M
sameersbn/postgresql   10-2                e0c330fde629        2 months ago        176M
sameersbn/redis        4.0.9-2             8f89b2ebe8be        8 months ago        90.3MB

بعد از اینکه مشخص کردید کدوم ایمیجها رو میخواین پاک کنید آی دی ایمیج رو به دستور docker image rm پاس بدید. برای مثال برای پاک کردن ۲ ایمیج اول به شکل زیر عمل میکنیم:

$ docker image rm 626c764aa200 ab56bba91343

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

Error response from daemon: conflict: unable to remove repository reference "centos" (must force) - container cd20b396a061 is using its referenced image 75835a67d134

پاک کردن ایمیج‌های بدون استفاده

داکر با معرفی دستور docker image prune به شما این امکان رو میده که ایمیج‌های بدون استفاده رو پاک کنید. یک ایمیج بدون استفاده ایمیجی است که هیچ تگی به آن نخورده باشد و توسط هیچ کانتینری استفاده نشده باشد. با دستور زیر می‌تونید این ایمیج‌ها رو پاک کنید:

$ docker image prune

بعد از زدن این دستور یک پیغام به شما نشان داده می‌شود که باید ان را تایید کنید با با استفاده از آپشن f- یا force-- این پرامپت را بای پس کنید.

WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y

نکته: وقتی یک ایمیج بدون استفاده را پاک می‌کنید، اگه ایمیج توسط شما تگ نخورده باشد قطعا پاک می‌شود.

پاک کردن تمام ایمیج‌های بدون استفاده

برای پاک کردن تمام ایمیج‌های بدون استفاده که به هیچ کانتینری رفرنس نخورده‌اند از دستور prune با آپشن a- استفاده کنید:

$ docker image prune -a

و پیغام هشدار معمول داکر:

WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y

پاک کردن یک ایمیج با استفاده از فیلتر

با دستور docker image prune می‌توانید ایمیج‌های خاصی رو با فیلترگذاری مشخص پاک کنید. آپشن شما برای اینکار filter-- است.

در زمان نوشتن این مقاله تنها آپشن‌های پیشتیبانی شده برای فیلتر گذاری until و label است. همچنین شما میتوانید با چند دستور filter-- اینکار را با فیلترهای متفاوت انجام دهید. اطلاعات بیشتر

برای مثال، برای پاک کردن تمام ایمیج‌هایی که بیش از ۱۲ ساعت از ساخت اونها گذشته است از دستور زیر استفاده می‌کنیم:

$ docker image prune -a --filter "until=12h"

پاک کردن دیسک‌های داکر

پاک کردن یک یا چند دیسک

برای پاک کردن یک یا چند دیسک با دستور docker volume ls آی دی های مورد نظر خود را برای پاک کردن پیدا کنید.

$ docker volume ls

DRIVER              VOLUME NAME
local               6e2f7acc67e9b92bef47cf7e8f5aaaf55f165b9e377400bcbc0c4d3ab8e91aa2
local               cd37f86133fd81022b7ff8d863f77cb43c60523089572c4a57fdd9854a6f4c36
local               daf808e78e6fe5d9bf0dc007df544ea979dc66ef18e920abcb435a1847175e53

وقتی آی دی دیسک مورد نظر خود را پیدا کردید با دستور زیر می‌توانید آنها را پاک کنید:

$ docker volume rm 4e12af8913af888ba67243dec78419bf18adddc3c7a4b2345754b6db64293163

اگر دیسک شما در حال استفاده باشد با پیغام خطای زیر ماجه می‌شوید:

$ docker volume rm 6e2f7acc67e9b92bef47cf7e8f5aaaf55f165b9e377400bcbc0c4d3ab8e91aa2

Error response from daemon: remove 6e2f7acc67e9b92bef47cf7e8f5aaaf55f165b9e377400bcbc0c4d3ab8e91aa2: volume is in use - [7f3154ed6c85f80d39d24446b60c35f5f0a75cc1e015b33255da974abfb6ad75]

اگر داکر بتواند با موفقیت دیسک شما را پاک کند خروجی به شکل زیر است:

$ docker volume rm cd37f86133fd81022b7ff8d863f77cb43c60523089572c4a57fdd9854a6f4c36

cd37f86133fd81022b7ff8d863f77cb43c60523089572c4a57fdd9854a6f4c36

پاک کردن تمام دیسک‌های بدون استفاده

برای پاک کردن تمام دیسک‌های بدون استفاده شما باید از دستور docker volume prune استفاده کنید:

$ docker volume prune

مثل همیشه به شما پرامپت هشدار پاک کردن نشان داده می‌شود که می‌توانید با آپشن force-- یا f-- آن را بای پس کنید:

WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B

پاک کردن شبکه‌های داکر

پاک کردن یک یا چند شبکه

برای پاک کردن یک یا چند داکر نتورک ابتدا با دستور docker network ls لیست آی دی های مورد نظر را پیدا کنید

$ docker network ls

خروجی این دستور شبیه خروجی زیر است:

NETWORK ID          NAME                DRIVER              SCOPE
155332dd30d8        bridge              bridge              local
63f9fac50db1        host                host                local
34428458d456        none                null                local

وقتی شما شبکه مورد نظر را برای پاک کردن پیدا کردید NETWORK ID مورد نظر خود را به دستور زیر پاس دهید:

$ docker network rm c520032c3d31

اگه شما خطای زیر را مشاهده کردید این به این معناست که یک کانتینر در حال استفاده از این شبکه است:

Error response from daemon: network my-bridge-network id 6f5293268bb91ad2498b38b0bca970083af87237784017be24ea208d2233c5aa has active endpoints

همچنین اگه به خطای زیر برخوردید به این دلیل است که شبکه‌های پیش‌فرض داکر قابل پاک کردن نیستند:

Error response from daemon: bridge is a pre-defined network and cannot be removed

پاک کردن تمام شبکه‌های بدون استفاده

با استفاده از دستور docker network prune تمام شبکه‌های بدون استفاده در داکر را می‌توانید پاک کنید:

$ docker network prune

پاک کردن تمام شبکه‌های بدون استفاده با استفاده از فیلتر

مثل تمام مثالهای فیلترگذاری می‌توانید اینکار را الگوی مشابه انجام دهید:

$ docker network prune --filter "until=12h"

تغییر نام کانتینر

برای تغییر اسم یک کانتینر به شکل زیر عمل کنید:

docker rename CONTAINER NEW_NAME

 

تغییر نام ایمیج

برای تغییر اسم یک کانتینر به شکل زیر عمل کنید:

docker tag server:latest myname/server:latest

https://linuxize.com/post/how-to-remove-docker-images-containers-volumes-and-networks

https://docs.docker.com/engine/reference/commandline/rename

https://stackoverflow.com/questions/25211198/docker-how-to-change-repository-name-or-rename-image