docker空间爆满导致的进入容器失败的解决方案

由于问题发生的比较突然,业务催的比较急,所以没来得及截图案发现场,所以现场截图为后期正常的环境。

周一上班,照例进入服务器,进入docker容器

>>> docker exec -i -t xxx /bin/bash
Docker error : no space left on device

没空间了?

立马想到查看系统的空间

>>> df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs  3.9G 0 3.9G 0% /dev/shm
tmpfs  3.9G 984K 3.9G 1% /run
tmpfs  3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/vda1 50G 50G 0G 100% /
overlay  50G 5.9G 41G 13% /var/lib/docker/overlay2/4d0941b78fa413f3b77111735e06045b41351748bcea7964205bcfbf9d4ec0b6/merged
overlay  50G 5.9G 41G 13% /var/lib/docker/overlay2/54a7a7b66d9c12d7e42158d177a6b67321f7da1f223b301e838e9bc109a2bda4/merged
shm  64M 0 64M 0% /var/lib/docker/containers/712f65baea85d898f6c948e7149f84f2f5eaf3b1934540603f32ab278f9acec4/mounts/shm
shm  64M 0 64M 0% /var/lib/docker/containers/a5fa673086c8f46ba98fc4425b353ed2e12de3277a5fe2dc5b8b7affa63b4518/mounts/shm
overlay  50G 5.9G 41G 13% /var/lib/docker/overlay2/7fbbc8a29119a1eaa1f212c50b75405a1f16fd68e3ae3949cc0c963d0727a9ab/merged
shm  64M 0 64M 0% /var/lib/docker/containers/011a83deceacecbacb4ef7eb06eb5b812babf9e83914a4fb33d4925cc1ad375b/mounts/shm
tmpfs  783M 0 783M 0% /run/user/0

原来是根目录满了

进一步查找

>>> cd /
>>> du -h --max-depth=1
984K ./run
16K ./opt
13M ./root
4.0K ./media
du: cannot access ‘./proc/4382/task/4382/fd/4': No such file or directory
du: cannot access ‘./proc/4382/task/4382/fdinfo/4': No such file or directory
du: cannot access ‘./proc/4382/fd/3': No such file or directory
du: cannot access ‘./proc/4382/fdinfo/3': No such file or directory
0 ./proc
204M ./boot
12K ./redis
39M ./etc
16K ./lost+found
4.0K ./srv
0 ./sys
47G ./var
2.8G ./usr
4.0K ./mnt
36K ./tmp
0 ./dev
4.0K ./home
50G .
>>> cd var
>>> du -h --max-depth=1
116M ./cache
8.0K ./empty
4.0K ./games
4.0K ./opt
24K ./db
46G ./lib
4.0K ./gopher
4.0K ./adm
4.0K ./crash
12K ./kerberos
4.0K ./preserve
4.0K ./nis
16K ./tmp
4.0K ./yp
4.0K ./local
104K ./spool
374M ./log
47G .
>>> cd lib
>>> du -h --max-depth=1
76K ./systemd
24K ./NetworkManager
4.0K ./tuned
4.0K ./games
248K ./cloud
215M ./rpm
8.0K ./plymouth
46G ./docker
248K ./containerd
4.0K ./dbus
4.0K ./initramfs
4.0K ./os-prober
8.0K ./rsyslog
24K ./alternatives
8.0K ./authconfig
12K ./stateless
4.0K ./misc
4.0K ./ntp
8.0K ./dhclient
4.0K ./selinux
8.0K ./chrony
4.0K ./rpm-state
12M ./yum
8.0K ./postfix
28K ./polkit-1
4.0K ./machines
8.0K ./logrotate
46G .
>>> cd docker
>>> du -h --max-depth=1
84K ./network
108K ./buildkit
4.0K ./trust
4.0K ./runtimes
5.7M ./image
42G ./volumes
24K ./plugins
4.0K ./tmp
20K ./builder
180K ./containers
3.3G ./overlay2
4.0K ./swarm
46G .
>>> cd volume
>>> du -h --max-depth=1
172K ./kudu_to_jdy_kudu_to_jdy
42G ./jdy_extensions_logs
748K ./bot_etl_bot_etl
42G .

原来是jdy_extensions_logs这个volume爆满导致的,后面就是找代码bug的过程了,略

后记:

其实docker提供了很多命令来对容器镜像进行管理,其中的docker system df就是一个比较有用的命令

# 显示docker文件系统使用情况
>>> docker system df
TYPE  TOTAL ACTIVE SIZE RECLAIMABLE
Images  7  3  2.146GB 693.2MB (32%)
Containers 3  3  127.5kB 0B (0%)
Local Volumes 3  3  1.511MB 0B (0%)
Build Cache 0  0  0B 0B
# 显示空间使用情况
>>> docker system df -v
Images space usage:
REPOSITORY TAG IMAGE ID CREATED SIZE SHARED SIZE UNIQUE SIZE CONTAINERS
jdy_extension 1.7 e3be3be9664a 15 hours ago 627.6MB 73.86MB 553.7MB 1
<none>  <none> 4b5825747ae9 19 hours ago 74.02MB 73.86MB 158.8kB 0
redis  6.2.1 f877e80bb9ef 2 weeks ago 105.3MB 0B  105.3MB 0
kudu_to_jdy 2.9 888b72288bca 2 weeks ago 538.1MB 73.86MB 464.3MB 1
jdy_to_db 1.9 c345c4e15c1a 7 months ago 587.7MB 73.86MB 513.9MB 0
bot_etl  2.3 020d41691ec7 7 months ago 508.6MB 73.86MB 434.8MB 1
ubuntu  20.04 adafef2e596e 8 months ago 73.86MB 73.86MB 0B  0
Containers space usage:
CONTAINER ID IMAGE  COMMAND   LOCAL VOLUMES SIZE CREATED STATUS NAMES
011a83deceac jdy_extension:1.7 "supervisord -n -c /…" 1  17.8kB 15 hours ago Up 15 hours jdy_extension_1.7
712f65baea85 kudu_to_jdy:2.9 "supervisord -n -c /…" 1  36.9kB 2 weeks ago Up 45 hours kudu_to_jdy_2.9
a5fa673086c8 bot_etl:2.3  "supervisord -n -c /…" 1  72.8kB 7 months ago Up 45 hours bot_etl_2.3
Local Volumes space usage:
VOLUME NAME  LINKS SIZE
jdy_extensions_logs 1  658.5kB
kudu_to_jdy_kudu_to_jdy 1  128kB
bot_etl_bot_etl  1  724kB
Build cache usage: 0B
CACHE ID CACHE TYPE SIZE CREATED LAST USED USAGE SHARED
# 删除所有没有在用的volume
>>> docker volume rm $(docker volume ls -q)

补充:记一次docker磁盘占用100%情况

在执行git pull origin master的时候,抛出如下错误:

error: RPC failed; HTTP 500 curl 22 The requested URL returned error: 500

fatal: the remote end hung up unexpectedly

百度之后好多说是nginx文件大小限制,但是查看配置文件,大小限制已经设置到了500M,应该不是该原因造成的:

server
{
  listen 80;
  server_name localhost;
  client_max_body_size 500M;
  location / {
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://localhost:180;
  }
}

然后使用df -h查看磁盘情况,发现data2磁盘已经100%(docker存储在这里):

使用docker system prune -a释放了很多空间,问题解决。

注意:使用上述命令会删除一下内容

WARNING! This will remove:
    - all stopped containers
    - all networks not used by at least one container
    - all images without at least one container associated to them
    - all build cache
Are you sure you want to continue? [y/N] y

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • Docker磁盘空间使用分析与清理的方法

    本文介绍了Docker磁盘空间使用分析与清理的方法,分享给大家,具体如下: 用了一段时间Docker后,会发现它占用了不少硬盘空间.还好Docker 1.13引入了解决方法,它提供了简单的命令System来查看/清理Docker使用的磁盘空间. 前情提要 #MyVersion [root@dockercon ~]# docker version Client: Version: 17.12.0-ce API version: 1.35 Go version: go1.9.2 Git commit

  • 解决docker磁盘空间不足问题

    docker所在服务器,运行了一段时间后,发现服务器磁盘目录快不够用了.通过du -h --max-depth=1 / 逐级目录排查,发现/var/lib/docker目录文件过大.通过以下方法,解决该问题. 转移数据修改docker默认存储位置 有多种方式修改docker默认存储位置. 最好是在docker安装完后,第一时间修改docker默认存储位置为其他大目录或者磁盘中.规避迁移数据过程中造成的风险. - 停止docker服务 systemctl stop docker - 创建新的doc

  • Docker占满磁盘空间的问题解决办法

    通过命令可以观察到/var/lib/Docker目录很大,我的主机只有20G,这个目录占了18G:原因是devicemapper的空间设的太大,通过docker info打印的Data Space Total参数可以看到,默认是107.4G. 思路如下: 备份当前容器.镜像: 删除/var/lib/docker目录: 使用dd命令重设大小: 恢复容器.镜像: 工具: 需要额外空间保存备份文件,可以挂载一个u盘或者云盘. docker save 可以导出镜像 tar文件: docker expor

  • 如何清理 Docker 占用的磁盘空间的方法

    Docker 很占用空间,每当我们运行容器.拉取镜像.部署应用.构建自己的镜像时,我们的磁盘空间会被大量占用. 如果你也被这个问题所困扰,咱们就一起看一下 Docker 是如何使用磁盘空间的,以及如何回收. docker 占用的空间可以通过下面的命令查看: $ docker system df TYPE 列出了docker 使用磁盘的 4 种类型: Images:所有镜像占用的空间,包括拉取下来的镜像,和本地构建的. Containers:运行的容器占用的空间,表示每个容器的读写层的空间. Lo

  • docker空间爆满导致的进入容器失败的解决方案

    由于问题发生的比较突然,业务催的比较急,所以没来得及截图案发现场,所以现场截图为后期正常的环境. 周一上班,照例进入服务器,进入docker容器 >>> docker exec -i -t xxx /bin/bash Docker error : no space left on device 没空间了? 立马想到查看系统的空间 >>> df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 3.9G 0 3.

  • docker连接spring boot和mysql容器方法介绍

    在之前使用docker部署运行了Spring Boot的小例子,但是没有使用数据库.在这一篇中,介绍docker如何启动mysql容器,以及如何将Spring Boot容器与mysql容器连接起来运行. docker基本命令 首先熟悉一下在操作过程中常用的docker基本命令: docker images:列出所有docker镜像 docker ps:列出所有运行中的容器,-a参数可以列出所有容器,包括停止的 docker stop container_id:停止容器 docker start

  • 浅谈Docker安全机制内核安全与容器之间的网络安全 原创

    内核安全 内核为容器提供两种技术 cgorups和namespaces,分别对容器进行资源限制和资源隔离,使容器感觉像是在用一台独立主机环境. ·cgroups资源限制 容器本质上是进程,cgroups的存在就是为了限制宿主机上不同容器的资源的使用量,避免单个容器耗尽宿主机资源而导致其他容器异常. ·namespaces资源隔离 为了使容器处在独立的环境中,docker使用namespaces技术来隔离容器,使容器与容器之间,容器与宿主机之间相互隔离. docker目前仅对uts.IPC.pid

  • 基于ORA-19815闪回空间爆满问题的处理方法

    闪回区爆满问题也是经常会遇到的问题,最关键的是闪回设置大小以及归档被默认存放在了闪回目录,恰巧今天又遇到了这个问题,就记录下处理步骤,仅供遇到这类问题的人参考. 一.错误现象描述 1)应用端错误信息 Error: 2016-11-26 11:45:25 ORA-00257: Archiver error. Connect AS SYSDBA only until resolved. Error: 2016-11-26 11:45:25 ORA-00257: Archiver error. Con

  • Spring处理@Async导致的循环依赖失败问题的方案详解

    目录 简介 问题复现 原因分析 解决方案 方案1:懒加载 方案2:不让@Async的类有循环依赖 方案3:allowRawInjectionDespiteWrapping设置为true 为什么@Transactional不会导致失败 简介 说明 本文介绍SpringBoot中的@Async导致循环依赖失败的原因及其解决方案. 概述 我们知道,Spring解决了循环依赖问题,但Spring的异步(@Async)会使得循环依赖失败.本文将用实例来介绍其原因和解决方案. 问题复现 启动类 启动类添加@

  • Docker如何安全地停止和删除容器

    目录 前言 1. 停止和删除容器 停止容器 删除容器 删除容器方法一 删除容器方法二 删除容器方法三 删除容器方法四 2. 容器资源限制 限制容器内存资源 限制容器CPU资源 限制容器 Block IO 3. 总结 前言 上一篇文章讲了容器的运行启动:[Docker 那些事儿]如何安全地进入到容器内部 本篇文章将继续承接上一篇,讲讲如何 停止.删除容器 和 对容器进行资源限制 1. 停止和删除容器 停止容器 在工作中,有时会需要将容器暂停,例如,要为容器文件系统做一个快照时.使用 docker

  • 详解Docker创建支持ssh服务的容器和镜像

    1. 这里使用的centos作为容器,所以首先下载centos的images # sudo docker pull centos 2. 下载后运行一个centos的容器,这里使用centos6作为我测试的容器 # sudo docker run --name=centos-ssh -i -t centos:centos6 /bin/bash  3. 安装openssh-server服务软件包 # yum install openssh-server 4. 编辑sshd的配置文件/etc/ssh/

  • Docker为网络bridge模式指定容器ip的方法

    前言 众所周知bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace.设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上.下面来看看Docker为网络bridge模式指定容器ip的方法. 实现方法 如果只是简单创建一个bridge模式的网络是无法给容器指定ip的 [root@vultrvpn conf.d]# docker network create --driver bridge wordpress_net ad1ff3d972

  • 解决JSON数据因为null导致数据加载失败的方法

    一.首先分析问题: 使用NSJSONSerialization或者AFN框架的AFHTTPSessionManager(底层也是NSJSONSerialization)将NSData数据转化成OC对象,有时会出现URL正确,加载数据任然会报错: reason: '-[NSNull length]: unrecognized selector sent to instance 分析原因发现,转化出来的OC对象中含有null.所以,NSNull没有length方法,所以会报找不到方法错误. 二.解决

  • Docker容器中文乱码(修改docker容器编码格式)的解决方案

    前台上传文件到服务器后,服务器返回给前台的文件列表中出现中文乱码,所有的中文文件名全部变成?,英文文件名则正常显示. 问题经过定位,发现后台代码的multipartfile类在执行transterto的方法时就发生了此异常,然而配置文件集中的multipartResolver以及encodingFilter均已经设置成了UTF-8,排除代码异常.kubectl exec进入到docker容器中进行查看时发现,文件在容器中也是中文文件名显示异常.查看docker容器编码格式:执行locale命令:

随机推荐