Docker 佔用資源膨脹那麼快,你知道怎麼清理?

2022-01-10 51reboot運維開發


如果經常使用 docker,你會發現 docker 佔用的資源膨脹很快,其中最明顯也最容易被察覺的應該是對磁碟空間的佔用。本文將介紹如何快速的清理 docker 佔用的系統資源,具體點說就是刪除那些無用的 鏡像、容器、網絡和數據卷。


在進行資源清理之前我們有必要搞清楚 docker 都佔用了哪些系統的資源。這需要綜合使用不同的命令來完成。
docker container ls:默認只列出正在運行的容器,-a 選項會列出包括停止的所有容器。
docker image ls:列出鏡像信息,-a 選項會列出 intermediate 鏡像(就是其它鏡像依賴的層)。
docker volume ls:列出數據卷。
docker network ls:列出 network。
docker info:顯示系統級別的信息,比如容器和鏡像的數量等。

通過這些命令查看 docker 使用的資源情況後,相信你已經決定要清理 docker 佔用的一些資源了!讓我們先從那些未被使用的資源開始。


Docker 提供了方便的 docker system prune 命令來刪除那些已停止的容器、dangling 鏡像、未被容器引用的 network 和構建過程中的 cache:

安全起見,這個命令默認不會刪除那些未被任何容器引用的數據卷,如果需要同時刪除這些數據卷,你需要顯式的指定 --volumns 參數。比如你可能想要執行下面的命令:

$ docker system prune --all --force --volumns

這次不僅會刪除數據卷,而且連確認的過程都沒有了!注意,使用 --all 參數後會刪除所有未被引用的鏡像而不僅僅是 dangling 鏡像。

這裡有必要解釋一下何為 dangling images,其實可以簡單的理解為未被任何鏡像引用的鏡像。比如在你重新構建了鏡像後,那些之前構建的且不再被引用的鏡像層就變成了 dangling images:

在本地的鏡像更新之後,就會出現類似圖中紅框內的 <none> 鏡像。這表示舊的鏡像已經不再被引用了,此時它們就變成了 dangling images。如果使用 -a 參數,你還會發現另外一種類型的 <none> 鏡像,它們的 repository 和 tag 列都表現為 <none>:

這些鏡像被稱為 intermediate 鏡像(就是其它鏡像依賴的層)。

我們還可在不同在子命令下執行 prune,這樣刪除的就是某類資源:
docker container prune # 刪除所有退出狀態的容器
docker volume prune # 刪除未被使用的數據卷
docker image prune # 刪除 dangling 或所有未被使用的鏡像


這裡的 "安裝時的狀態" 指資源佔用情況而不是 docker 的相關配置。這也是一種比較常見的用例,比如筆者就需要在一個乾淨的 docker 環境中自動化的還原出某天的一個生產環境(使用生產環境的備份數據)用於 bug 調查。讓我們一起來看看都需要做些什麼?


回想我們前面介紹的 docker system prune --all --force --volumns 命令,如果在執行這個命令前系統中所有的容器都已停止,那麼這個命令就會移除所有的資源!好,現在讓我們想辦法停掉系統中的所有容器。


docker container stop 命令可以停止一個或多個容器,我們只需要把系統中所有在運行的容器羅列出來就可以了。由於 docker 並不介意我們再次停止一個已經停止了的容器,乾脆簡單粗暴點,直接列出所有的容器(包括已經停止的)!

$ docker container ls -a -q

-a 顯示所有的容器,-q 只顯示數字形式的容器 ID。

然後把這裡命令執行的結果作為 docker container stop 命令的參數:

$ docker container stop $(docker container ls -a -q)

完整的恢復 docker 環境的命令如下:

$ docker container stop $(docker container ls -a -q) && docker system prune 

和前面的 prune 命令類似,也可以完全刪除某一類資源:
刪除容器:docker container rm $(docker container ls -a -q)
刪除鏡像:docker image rm $(docker image ls -a -q)
刪除數據卷:docker volume rm $(docker volume ls -q)
刪除 network:docker network rm $(docker network ls -q)


上面的命令可以完成任務但是卻很繁瑣,我們可以通過 shell 的別名功能來簡化這些命令的執行。

alias docker-clean-unused='docker system prune alias docker-clean-all='docker stop $(docker container ls -a -q) && docker system prune 

把上面的命令寫入到用戶的 ~/.bashrc 文件中就可以了!

執行一次清理任務:


經常清理系統資源不僅能夠讓系統運行的更流暢,也利於我們把精力集中在相關的重點資源上面。所以建議大家能夠使用相關的資源清理命令,讓 docker 保持清爽和高效。

參考:

Clean out your Docker images, containers and volumes with single commands(https://hackernoon.com/clean-out-your-docker-images-containers-and-volumes-with-single-commands-b8e38253c271)

Python 零基礎入門班

Python 運維自動化進階班

Golang 班

來了解一下,開啟學習

相關焦點

  • docker 佔用空間太大
    大家在使用docker過程中,有沒有遇到過/var/lib/docker/overlay2這個文件夾佔用空間特別大,使用得越久,這個文件越大,有的人可能達到100G
  • Docker清理的常用方法
    如果你使用 docker 進行大規模開發,但是沒有清理策略,那麼你的磁碟馬上就會被填滿,當你真的必須因為產品火爆而要立即交付一些東西時,你就無法交付
  • Docker 入門教程
    8.快速部署Docker為進程創建一個容器, 不需要啟動一個作業系統, 時間縮短為秒級別.可以在數據中心創建銷毀資源而無須擔心重新啟動帶來的開銷. 通常數據中心的資源利用率只有30% , 通過使用Docker並進行有效的資源分配可以提高資源的利用率.
  • Docker 1.13最實用命令行:終於可以愉快地打掃房間了
    你可能已經體驗了很長時間亂糟糟的開發環境——無用的容器,掛起的Docker鏡像,棄置的volume,被遺忘的網絡……所有這些過時的事物佔據了寶貴的資源,最終導致環境無法使用。在之前的文章中曾經提到用各種各樣的命令保持環境的整潔,例如:docker rm -f $(docker ps -aq)強制地刪除所有正在運行的、暫停的以及終止的容器。
  • docker的第一階段總結
    庫地址: https://github.com/wolfcw/libfaketime/簡單編譯之後,把libfaketime.so.1文件複製到docker實例,然後運行以下命令:38   export LD_PRELOAD=/libfaketime.so.1 FAKETIME="+100"即可達到和真實時間偏差快100秒的效果。
  • Docker學習筆記-基礎命令三
    rm批量刪除docker rmi $(docker images -f "xxxx=xxx" -q)清理未使用的鏡像 dockersystem prune [OPTIONS]OPTIONS說明名字,簡寫默認描述--all, -a刪除所有未使用的鏡像,而不僅僅是懸空鏡像--filter提供過濾值--force,-f強制清理--volumes清理卷(沒有容器使用的卷也會被清理)磁碟佔用分析 docker system df [OPTIONS
  • Docker 容器化部署技術
    Docker容器技術優勢1、啟動快、解決虛擬機資源消耗問題啟動容器相當於啟動本機一個進程,啟動速度快。一臺電腦運行一個Linux虛擬機可能會卡頓,卻可以使用Docker虛擬幾十甚至上百臺虛擬Linux伺服器,容器僅佔用用到的資源,多個容器可共享資源。
  • Docker(二):Dockerfile 使用介紹
    Dockerfile 概念Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之後也不會被改變。鏡像的定製實際上就是定製每一層所添加的配置、文件。
  • 阿里華為Dockerfile命令規範及最佳實踐
    docker image lsdocker run javaedge/centos-shellRUN <命令行命令># <命令行命令> 等同於,在終端操作的 shell 命令。yum update && yum install -y vim \ python-dev # 反斜線換行RUN apt-get update && apt-get install -y perl \ pwgen --no-install-recommends && rm -rf \ /var/lib/apt/lists/* # 注意清理
  • Docker-compose實戰
    各位小夥伴們,我們前面的篇文章分享了、docker的基礎知識點、如何編寫一個Dockerfile、docker網絡是怎麼回事、如何編寫docker-compose.yml文件。已經為本文做好了充分的鋪墊。那麼這邊文章就和小夥本們分享如何將你自己的微服務項目進行服務的編排。
  • Docker在英雄聯盟遊戲中的實踐探索(四)
    需要考慮的是,如果你更換了OS,那麼需要更改很多命令和配置,來確保Nginx正常工作。在你的項目根目錄中,創建一個新目錄jenkins-nginx,來保存另一個Dockerfile。為了加速,我們關閉了accept_mutex,因為我們不在乎較低的連接請求數造成的資源浪費。
  • 【泡泡Docker樂園】手把手帶你走進Docker世界
    泡泡Docker樂園,帶你進入Docker的狂歡派對簡介:泡泡機器人的新欄目【泡泡Docker樂園】旨在為大家提供包裝好配置系統和運行環境的Docker Image項目,主要覆蓋機器人SLAM和深度學習領域。本期我們主要為大家帶來一份熱騰騰的Docker實戰教程,主要介紹Docker的主要功能和使用場合,以及分享常見的命令。
  • 怎麼才能正確清理電腦的緩存垃圾?
    但是有一點你知道,那就是就算不知道它是什麼東西也不會影響你使用你的電腦。所以,你覺得你有必要清 理這個無關緊要的東西嗎?還有很多被列出來密密麻麻的清 理項,就不一一介紹了(也介紹不來),只需要知道:一般來說,你清不清 理這些並不會對你的電腦的流暢度有什麼影響,只是對你心理上或許會有或多或少的影響。
  • 如何優雅的關閉 Docker 容器!
    精心設計的應用程式應當為 SIGTERM 信號設置處理器程序,以便其能夠預先清除臨時文件和釋放其它資源,從而全身而退。因此,總是應該先嘗試使用 SIGTERM 信號來終止進程,而把 SIGKILL 作為最後手段,去對付那些不響應 SIGTERM 信號的失控進程。
  • 雲計算核心技術Docker教程:Docker Swarm 使用
    以下示例,均以 Docker Machine 和 virtualbox 進行介紹,確保你的主機已安裝 virtualbox。docker@swarm-manager:~$ docker service create --replicas 1 --name helloworld alpine ping docker.com查看 helloworld 服務運行在哪個節點上,可以看到目前是在 swarm-worker1 節點:
  • 在Docker上搭建PostGreSQL流複製
    但我個人覺得一些論據還是比較充分的,比如說老外說的數據丟失、網絡問題,難道他不知道docker可以支持volume映射、host網絡嗎?我們要以開放的心態來對待新的技術和架構,況且docker已經不算新了。我們可以先在開發測試環境實施基於容器技術的資料庫架構,坑踩過了,覺得穩定了,覺得確實在你的企業環境內比傳統架構更容易擴展、易部署、易做到devops,再逐步推廣到生產環境非關鍵系統,再到關鍵系統,這樣一個漸進的演進過程。
  • 優化Docker 鏡像小技巧
    在開發Docker鏡像時,你應該利用儘可能多的臨時模式。Docker鏡像應保持精簡,這有助於提高可移植性,縮短構建時間,降低複雜性並減小文件大小。例如,在大多數情況下,不要在容器上安裝文本編輯器,不要安裝任何非必需的應用程式或服務。.dockerignore文件,是用來聲明不會被鏡像包括的文件和目錄。這有助於避免將不必要的大文件或敏感文件打包進去,並避免將它們添加到公共鏡像。
  • Docker 創建你自己的橋接網絡
    下面的例子顯示了如何創建一個橋接網絡:$ docker network create -d bridge my_bridge參數 -d 用於告訴 Docker 在新的網絡中使用橋接(bridge)驅動。
  • 檸檬清理又添新功能,磁碟佔用分析一目了然
    騰訊檸檬清理想必大家都聽過了,一款免費又好用的系統清理軟體,能夠幫你的電腦減減肥
  • Docker 容器的網絡
    如果你通過 Docker 提供的用戶指南,你應該已經完成了構建你的第一個 Docker 容器,並且運行了示例應用。你已經構建了你自己的鏡像(images)。本部分的內容將會指導你如何對你的容器進行網絡配置。