docker資源清理釋放磁碟空間教學

2020-08-09 22:46:39

簡介

  • 使用docker一時爽,一直使用一直爽,直到我把所有用到的服務全部容器化後,一天天過去了,發現docker佔用了不少機器資源,而且單機上映象、容器數量過多後,導致docker的效能也出現了問題,時不時會發現一些服務假死、或者docker命令卡死的現象,而且能明顯感受到伺服器的磁碟空間一點點被消耗殆淨,本文將教會大家如何爲你的docker伺服器瘦身!

本文內容有

  • 檢視docker服務詳細資訊和當前資源使用情況
  • 檢視過時或無效的images和container
  • 檢視docker服務狀態和資源使用情況
  • 檢視無效的網路和磁碟掛載記錄
  • 手動清理磁碟、網路、映象、容器服務
  • 一件清理無用資源資訊
  • 更多docker資料

參考文章


1、檢視docker服務詳細資訊和當前資源使用情況

1.1 docker system info 命令

用於檢視docker環境的自身和所有容器資源的概覽情況,主要有:

  • Containers 容器資訊

    Containers: 4
      Running: 0
      Paused: 0
      Stopped: 4
    
  • Images 映象資訊

    Images: 16
    
  • Server Version docker服務版本號

    Server Version: 19.03.6
    
  • Storage Driver 磁碟記憶體型別

      Storage Driver: overlay2
      Backing Filesystem: xfs
      Supports d_type: true
      Native Overlay Diff: true
    
  • Logging Driver 日誌輸出驅動型別

    Logging Driver: json-file
    
  • Cgroup Driver linux虛擬環境驅動器型別

    Cgroup Driver: cgroupfs
    
  • Plugins 外掛型別

    Plugins:
      Volume: local
      Network: bridge host ipvlan macvlan null overlay
      Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
    
  • Swarm 叢集狀態

    Swarm: error
      NodeID: 
      Error: error while loading TLS certificate in /var/lib/docker/swarm/certificates/swarm-node.crt: certificate (1 - 9tbves7p6qvxzxhnat0upm3hu) not valid after Thu, 30 Jul 2020 07:45:00 UTC, and it is currently Sun, 09 Aug 2020 10:07:06 BST: x509: certificate has expired or is not yet valid
      Is Manager: false
      Node Address: 192.168.56.23
    
  • Security Options 安全策略

    Security Options:
      seccomp
       Profile: default
    
  • Kernel Version 內核版本

    Kernel Version: 3.10.0-1062.el7.x86_64
    
  • Operating System 操作系統型別和版本資訊

    Operating System: CentOS Linux 7 (Core)
    
  • OSType 操作系統型別

    OSType: linux
    
  • Architecture CPU架構型別

    Architecture: x86_64
    
  • CPU和記憶體資訊

     Name: localhost     #伺服器hostname
     CPUs: 1
     Total Memory: 1.795GiB
    
  • docker本地環境資訊

     ID: MWHK:VVUI:D46J:QTR2:BES6:XQ5V:NKJA:KUG3:BRCU:CU66:OF6W:CLAE
     Docker Root Dir: /var/lib/docker    #docker預設儲存路徑
     Debug Mode: false
     Labels:
     Experimental: false
     Live Restore Enabled: false
    
  • Registry 遠端映象倉庫地址

    Registry: https://index.docker.io/v1/
    
  • Registry Mirrors 代理映象倉庫地址

    Registry Mirrors:
      https://dg40rhyf.mirror.aliyuncs.com/    #我額外設定的阿裡雲映象加速地址
    
  • 設定非https環境的映象倉庫地址

    Insecure Registries:
      192.168.56.22:5000     #我的本地docker私服地址,非https
      127.0.0.0/8            #本機本地預設倉庫也是非https的,docker自動新增的,無需額外設定
    
  • 其他資訊

     Runtimes: runc
     Default Runtime: runc
     Init Binary: docker-init
     containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339
     runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
     init version: fec3683
    
1.2 docker system df 命令

用於檢視docker各種資源的磁碟空間和使用情況

  • Images 映象空間使用情況

  • Containers 容器空間使用情況

  • Local Volumes 磁碟掛載情況

  • Build Cache 構建快取佔用空間情況

    TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
    Images              16                  1                   5.301GB             5.174GB (97%)
    Containers          4                   0                   0B                  0B
    Local Volumes       10                  0                   18.27MB             18.27MB (100%)
    Build Cache         0                   0                   0B                  0B
    
1.3 docker system events 命令

該命令用於監聽docker的事件行爲資訊,並列印到控制檯。

常用的事件如:容器建立、啓動、重新啓動等等事件

容器

Docker containers 容器的相關操作會產生如下事件:

  • attach
  • commit
  • copy
  • create
  • destroy
  • detach
  • die
  • exec_create
  • exec_detach
  • exec_start
  • export
  • health_status
  • kill
  • oom
  • pause
  • rename
  • resize
  • restart
  • start
  • stop
  • top
  • unpause
  • update

映象

Docker images 映象的相關操作會產生如下事件:

  • delete
  • import
  • load
  • pull
  • push
  • save
  • tag
  • untag

外掛

Docker plugins 外掛的相關操作會產生如下事件:

  • install
  • enable
  • disable
  • remove

磁碟掛載

Docker volumes 磁碟掛載的相關操作會產生如下事件:

  • create
  • mount
  • unmount
  • destroy

網路

Docker networks 網路管理的相關操作會產生如下事件:

  • create
  • connect
  • disconnect
  • destroy

DAEMONS

Docker daemons 的相關操作會產生如下事件::

  • reload

2、檢視過時或未用到的image和container

2.1 查詢映象
  • 查詢未使用的映象

    docker images -f "dangling=true"

  • 使用關鍵字查詢映象

    docker images | grep nginx

2.2 查詢容器
  • 查詢所有停止的容器

    docker ps -a|grep Exiteddocker ps -f status=exited

  • 按關鍵字查詢容器(預設爲正在執行的)

    docker ps |grep nginx

    或者

    docker ps -f "name=nginx"

  • 按關鍵字查詢容器(所有的)

    docker ps -a |grep nginx

3、檢視docker服務執行狀態和資源使用情況

  • 實時檢視容器日誌觀察服務執行狀態

    #檢視最後100行日誌,並且一直輸出最新的日誌
    docker logs nginx --tail 100 -f
    
  • 檢視容器埠系結和埠監聽情況

    docker port jenkins
    #########結果如下#########
    50000/tcp -> 0.0.0.0:50000
    8080/tcp -> 0.0.0.0:8082
    
    #檢視埠監聽
    netstat -nlp |grep 8082
    #########結果如下#########
    tcp6       0      0 :::8082                 :::*                    LISTEN      2295/docker-proxy
    
  • 檢視所有或者指定容器執行狀態

    #檢視所有容器狀態
    docker ps -a
    #檢視非停止狀態的所有容器狀態
    docker ps
    #檢視最近建立的容器
    docker ps -l
    #檢視最近建立的前3個容器狀態
    docker ps -n 3
    
  • 檢視所有或者指定容器資源使用情況

    #檢視所有容器資源使用情況
    docker stats 
    #檢視某個容器資源佔用情況
    docker stats |grep nginx
    ######################結果如下#######################
    CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
    8cb87b0e93a7        sonarqube           1.97%               1.439GiB / 8.184GiB   17.58%              768B / 0B           393MB / 2.89MB      139
    84591fc109c8        gogs                0.03%               36.95MiB / 8.184GiB   0.44%               225kB / 132kB       83MB / 42kB         13
    58daee0f04c1        rabbitmq            2.63%               90.13MiB / 8.184GiB   1.08%               19.9kB / 0B         97.9MB / 350kB      86
    3562e34b6b2f        mongo-express       0.00%               268KiB / 8.184GiB     0.00%               1.04kB / 746B       0B / 0B             2
    7354756e6adc        mysql-adminer       0.00%               5.254MiB / 8.184GiB   0.06%               19.9kB / 0B         44.8MB / 0B         1
    b32ade9a7956        mysql               0.10%               96.14MiB / 8.184GiB   1.15%               132kB / 190kB       118MB / 4.72MB      31
    6ac0623072c6        elk                 3.84%               2.36GiB / 8.184GiB    28.84%              20.3kB / 454B       565MB / 119kB       109
    889ecfb781eb        portainer           0.02%               11.44MiB / 8.184GiB   0.14%               3.69MB / 321kB      46.2MB / 49.8MB     6
    f529906fbb00        nexus               1.31%               1.197GiB / 8.184GiB   14.62%              838B / 0B           488MB / 48.2MB      92
    cdb3f43a3ca7        jenkins             0.90%               360.8MiB / 8.184GiB   4.30%               4.62MB / 1.25MB     542MB / 5.06MB      42
    
  • 檢視容器內服務資源使用情況

    docker top CONTAINER [ps OPTIONS]
    #相當於你在linux上輸入top命令一樣的效果
    #範例如下
    docker top nginx
    
    #也可以進入容器進行操作
    docker exec -it nginx /bin/bash
    $> top
    

4、 檢視無效的網路和磁碟掛載記錄

4.1 檢視網路和管理容器的網路連線資訊
  • 檢視所有網路資訊

    docker network ls 
    ######################結果如下#######################
    NETWORK ID          NAME                DRIVER              SCOPE
    559bb5e88ed5        bridge              bridge              local
    3826bf3eb4cf        deploy_default      bridge              local
    8d6614a5e69c        docker_gwbridge     bridge              local
    6f5f70c61512        host                host                local
    86586e8a770c        none                null                local
    

    具體的自定義網路建立和使用可以參考Docker swarm容器叢集使用總結

    #檢視指定網路狀態
    docker network ls |grep custom_network_name
    
  • docker容器連線到網路

    docker network connect [OPTIONS] NETWORK CONTAINER
    #container1連線到跨主機的網路multi-host-network
    docker network connect multi-host-network container1
    #連線時指定ip
    docker network connect --ip 10.10.36.122 multi-host-network container2
    
  • docker容器斷開網路連線

    docker network disconnect [OPTIONS] NETWORK CONTAINER
    #容器斷開網路連線
    docker network disconnect multi-host-network container1
    
4.2 檢視磁碟掛載資訊
  • 檢視磁碟掛載資訊
docker volume ls
######################結果如下#######################
DRIVER              VOLUME NAME
local               0af6c4ab0cb3881825b5dc59610c89fc4e729250fe7d2ca9863cd3f1cce3b954
local               0df967f4101a226205161c778ef0c74b478e43bac3a338ed3d4285faf64017b0
local               2acc4034389df18f77c47c4e4e6797cef05267790443b4df502a87088462f2d9
local               4b809dffe37b7911fad4e2e69b9fed25c49a4c8fc3ae93520e234452091e5f0e
  • 建立或刪除磁碟掛載資訊
#建立磁碟
docker volume create hello
#掛載磁碟到容器中的/world目錄
docker run -d -v hello:/world busybox ls /world
#刪除磁碟掛載
docker volume rm hello
  • 檢視容器磁碟掛載情況

    docker inspect --format="{{.Mounts}}" mysql
     ######################結果如下#######################
     [{bind  /data/workspace/service/mysql/conf.d /etc/mysql/conf.d  rw true rprivate} {bind  /data/workspace/service/mysql/my.cnf /etc/mysql/my.cnf  rw true rprivate} {bind  /data/workspace/service/mysql/data /var/lib/mysql  rw true rprivate}]
    

    或者

    docker inspect mysql | grep Mounts -A 30 # -A 參數接的數位爲需要顯示資訊的行數
     ######################結果如下#######################
     "Mounts": [
                {
                    "Type": "bind",
                    "Source": "/data/workspace/service/mysql/my.cnf",
                    "Destination": "/etc/mysql/my.cnf",
                    "Mode": "rw",
                    "RW": true,
                    "Propagation": "rprivate"
                },
                {
                    "Type": "bind",
                    "Source": "/data/workspace/service/mysql/data",
                    "Destination": "/var/lib/mysql",
                    "Mode": "rw",
                    "RW": true,
                    "Propagation": "rprivate"
                },
                {
                    "Type": "bind",
                    "Source": "/data/workspace/service/mysql/conf.d",
                    "Destination": "/etc/mysql/conf.d",
                    "Mode": "rw",
                    "RW": true,
                    "Propagation": "rprivate"
                }
            ],
            "Config": {
                "Hostname": "b32ade9a7956",
                "Domainname": "",
                "User": "",
                "AttachStdin": false,
    

5、手動清理磁碟、網路、映象、容器服務

5.1 查詢並刪除映象
  • 刪除懸空的映象

    #查詢並刪除
    docker rmi -f `docker images -qf "dangling=true"`
    #直接使用系統命令進行刪除
    docker image prune
    
  • 刪除滿足關鍵字的映象

    docker rmi -f `docker images | grep nginx | awk '{print $3}'`
    
5.2 查詢並刪除容器
  • 刪除所有停止的容器
docker rm `docker ps -f status=exited`
#或者
docker rm `docker ps -a|grep Exited | awk '{print $1}'`
  • 刪除關鍵字匹配的容器
#先停止容器
docker stop `docker ps -aqf "name=nginx"`
#再刪除
docker rm `docker ps -aqf "name=nginx"`

#或者
docker stop `docker ps -a |grep nginx | awk '{print $1}'`
docker rm `docker ps -a |grep nginx | awk '{print $1}'`
5.3 查詢並刪除磁碟掛載
  • 刪除磁碟掛載

    #通過docker inpect container |grep Network 找到掛載的磁碟ID xxxx
    docker volume rm xxxx
    
5.4 查詢並刪除網路連線資訊
  • 查詢並刪除網路連線

    #容器斷開網路連線
     docker network disconnect multi-host-network container1
    

6、一鍵清理無用資源資訊

清理無用的映象,狀態爲dangling(懸空的,也就是沒有人使用,而且沒有TAG,一般在多次構建映象後,之前的映象會成爲這種狀態)的映象

docker image prune

清理所有未使用的映象

docker image prune -a

清理無用的容器

docker container prune

清理不用的數據卷
docker volume prune

清理無用的網路鏈接

docker network prune

一鍵清理停掉的container、懸掛的image(沒有tag)、沒有使用的network、數據卷
docker system prune

7、更多docker資料