- 使用docker一時爽,一直使用一直爽,直到我把所有用到的服務全部容器化後,一天天過去了,發現docker佔用了不少機器資源,而且單機上映象、容器數量過多後,導致docker的效能也出現了問題,時不時會發現一些服務假死、或者docker命令卡死的現象,而且能明顯感受到伺服器的磁碟空間一點點被消耗殆淨,本文將教會大家如何爲你的docker伺服器瘦身!
本文內容有
- 檢視docker服務詳細資訊和當前資源使用情況
- 檢視過時或無效的images和container
- 檢視docker服務狀態和資源使用情況
- 檢視無效的網路和磁碟掛載記錄
- 手動清理磁碟、網路、映象、容器服務
- 一件清理無用資源資訊
- 更多docker資料
用於檢視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
用於檢視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
該命令用於監聽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
查詢未使用的映象
docker images -f "dangling=true"
使用關鍵字查詢映象
docker images | grep nginx
查詢所有停止的容器
docker ps -a|grep Exited
或docker ps -f status=exited
按關鍵字查詢容器(預設爲正在執行的)
docker ps |grep nginx
或者
docker ps -f "name=nginx"
按關鍵字查詢容器(所有的)
docker ps -a |grep nginx
實時檢視容器日誌觀察服務執行狀態
#檢視最後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
檢視所有網路資訊
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
- 檢視磁碟掛載資訊
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,
刪除懸空的映象
#查詢並刪除 docker rmi -f `docker images -qf "dangling=true"` #直接使用系統命令進行刪除 docker image prune
刪除滿足關鍵字的映象
docker rmi -f `docker images | grep nginx | awk '{print $3}'`
- 刪除所有停止的容器
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}'`
刪除磁碟掛載
#通過docker inpect container |grep Network 找到掛載的磁碟ID xxxx docker volume rm xxxx
查詢並刪除網路連線
#容器斷開網路連線 docker network disconnect multi-host-network container1
清理無用的映象,狀態爲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