简介
- 使用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 Exited
或docker 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