暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Docker服务假死、卡顿怎么办?

淡远文摘 2021-08-26
7967

简介

  • 使用docker一时爽,一直使用一直爽,直到我把所有用到的服务全部容器化后,一天天过去了,发现docker占用了不少机器资源,而且单机上镜像、容器数量过多后,导致docker的性能也出现了问题,时不时会发现一些服务假死、或者docker命令卡死的现象,而且能明显感受到服务器的磁盘空间一点点被消耗殆净,本文将教会大家如何为你的docker服务器瘦身!

本文内容有

  • 查看docker服务详细信息和当前资源使用情况

  • 查看过时或无效的images和container

  • 查看docker服务状态和资源使用情况

  • 查看无效的网络和磁盘挂载记录

  • 手动清理磁盘、网络、镜像、容器服务

  • 一键清理无用资源信息

  • 更多docker资料

参考文章

  • 原文传送门

  • Docker官方命令手册


1、查看docker服务详细信息和当前资源使用情况

1.1 docker system info 命令

用于查看docker环境的自身和所有容器资源的概览情况,主要有:

  • Containers 容器信息

    Containers: 4
    Running: 0
    Paused: 0
    Stopped: 4

    • 1

    • 2

    • 3

    • 4

  • Images 镜像信息

    Images: 16

    • 1

  • Server Version docker服务版本号

    Server Version: 19.03.6

    • 1

  • Storage Driver 磁盘存储器类型

      Storage Driver: overlay2
    Backing Filesystem: xfs
    Supports d_type: true
    Native Overlay Diff: true

    • 1

    • 2

    • 3

    • 4

  • Logging Driver 日志输出驱动类型

    Logging Driver: json-file

    • 1

  • Cgroup Driver linux虚拟环境驱动器类型

    Cgroup Driver: cgroupfs

    • 1

  • Plugins 插件类型

    Plugins:
    Volume: local
    Network: bridge host ipvlan macvlan null overlay
    Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog

    • 1

    • 2

    • 3

    • 4

  • 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

    • 1

    • 2

    • 3

    • 4

    • 5

  • Security Options 安全策略

    Security Options:
    seccomp
    Profile: default

    • 1

    • 2

    • 3

  • Kernel Version 内核版本

    Kernel Version: 3.10.0-1062.el7.x86_64

    • 1

  • Operating System 操作系统类型和版本信息

    Operating System: CentOS Linux 7 (Core)

    • 1

  • OSType 操作系统类型

    OSType: linux

    • 1

  • Architecture CPU架构类型

    Architecture: x86_64

    • 1

  • CPU和内存信息

     Name: localhost     #服务器hostname
    CPUs: 1
    Total Memory: 1.795GiB

    • 1

    • 2

    • 3

  • 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

    • 1

    • 2

    • 3

    • 4

    • 5

    • 6

  • Registry 远程镜像仓库地址

    Registry: https://index.docker.io/v1/

    • 1

  • Registry Mirrors 代理镜像仓库地址

    Registry Mirrors:
    https://dg40rhyf.mirror.aliyuncs.com/ #我额外配置的阿里云镜像加速地址

    • 1

    • 2

  • 配置非https环境的镜像仓库地址

    Insecure Registries:
    192.168.56.22:5000 #我的本地docker私服地址,非https
    127.0.0.0/8 #本机本地默认仓库也是非https的,docker自动添加的,无需额外配置

    • 1

    • 2

    • 3

  • 其他信息

     Runtimes: runc
    Default Runtime: runc
    Init Binary: docker-init
    containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339
    runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
    init version: fec3683

    • 1

    • 2

    • 3

    • 4

    • 5

    • 6

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

    • 2

    • 3

    • 4

    • 5

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

    • 1

    • 2

  • 查看容器端口绑定和端口监听情况

    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

    • 1

    • 2

    • 3

    • 4

    • 1

    • 2

    • 3

    • 4

  • 查看所有或者指定容器运行状态

    #查看所有容器状态
    docker ps -a
    #查看非停止状态的所有容器状态
    docker ps
    #查看最近创建的容器
    docker ps -l
    #查看最近创建的前3个容器状态
    docker ps -n 3

    • 1

    • 2

    • 3

    • 4

    • 5

    • 6

    • 7

    • 8

  • 查看所有或者指定容器资源使用情况

    #查看所有容器资源使用情况
    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

    • 1

    • 2

    • 3

    • 4

    • 5

    • 6

    • 7

    • 8

    • 9

    • 10

    • 11

    • 12

    • 13

    • 14

    • 15

    • 16

  • 查看容器内服务资源使用情况

    docker top CONTAINER [ps OPTIONS]
    #相当于你在linux上输入top命令一样的效果
    #示例如下
    docker top nginx

    #也可以进入容器进行操作
    docker exec -it nginx bin/bash
    $> top

    • 1

    • 2

    • 3

    • 4

    • 5

    • 6

    • 7

    • 8

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

    • 1

    • 2

    • 1

    • 2

    • 3

    • 4

    • 5

    • 6

    • 7

    • 8

  • 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

    • 1

    • 2

    • 3

    • 4

    • 5

  • docker容器断开网络连接

    docker network disconnect [OPTIONS] NETWORK CONTAINER
    #容器断开网络连接
    docker network disconnect multi-host-network container1

    • 1

    • 2

    • 3

4.2 查看磁盘挂载信息
  • 查看磁盘挂载信息

docker volume ls
######################结果如下#######################
DRIVER VOLUME NAME
local 0af6c4ab0cb3881825b5dc59610c89fc4e729250fe7d2ca9863cd3f1cce3b954
local 0df967f4101a226205161c778ef0c74b478e43bac3a338ed3d4285faf64017b0
local 2acc4034389df18f77c47c4e4e6797cef05267790443b4df502a87088462f2d9
local 4b809dffe37b7911fad4e2e69b9fed25c49a4c8fc3ae93520e234452091e5f0e

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 创建或删除磁盘挂载信息

#创建磁盘
docker volume create hello
#挂载磁盘到容器中的/world目录
docker run -d -v hello:/world busybox ls world
#删除磁盘挂载
docker volume rm hello

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 查看容器磁盘挂载情况

    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,

    • 1

    • 2

    • 3

    • 4

    • 5

    • 6

    • 7

    • 8

    • 9

    • 10

    • 11

    • 12

    • 13

    • 14

    • 15

    • 16

    • 17

    • 18

    • 19

    • 20

    • 21

    • 22

    • 23

    • 24

    • 25

    • 26

    • 27

    • 28

    • 29

    • 30

    • 31

    • 32

    • 33

    • 1

    • 2

    • 3

5、手动清理磁盘、网络、镜像、容器服务

5.1 查找并删除镜像
  • 删除悬空的镜像

    #查找并删除
    docker rmi -f `docker images -qf "dangling=true"`
    #直接使用系统命令进行删除
    docker image prune

    • 1

    • 2

    • 3

    • 4

  • 删除满足关键字的镜像

    docker rmi -f `docker images | grep nginx | awk '{print $3}'`

    • 1

5.2 查找并删除容器
  • 删除所有停止的容器

docker rm `docker ps -f status=exited`
#或者
docker rm `docker ps -a|grep Exited | awk '{print $1}'`

  • 1

  • 2

  • 3

  • 删除关键字匹配的容器

#先停止容器
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}'`

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

5.3 查找并删除磁盘挂载
  • 删除磁盘挂载

    #通过docker inpect container |grep Network 找到挂载的磁盘ID xxxx
    docker volume rm xxxx

    • 1

    • 2

5.4 查找并删除网络连接信息
  • 查找并删除网络连接

    #容器断开网络连接
    docker network disconnect multi-host-network container1

    • 1

    • 2

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资料

  • springboot应用制作docker镜像教程

  • docker基础镜像centos7-jdk8-logstash构建

  • Docker swarm容器集群使用总结

  • docker服务假死解决方案

  • 最新最全最详细docker实战入门教程


文章转载自淡远文摘,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论