داکر برای راحتتر کردن فرآیند 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