上一节我说过运行docker后,磁盘空间不足的简略解决方法,现在我们详细讲解一下。

这个是我在创建数据卷时docker报出no space,即磁盘空间不足的问题。

docker 磁盘空间规划 docker磁盘空间不足_日志文件

 我们看一下磁盘使用情况。

linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息

docker 磁盘空间规划 docker磁盘空间不足_日志文件_02

df -h和df -i的区别 

在df -h 和df -i  显示使用率100%,基本解决方法都是删除文件。

df -h   是去删除比较大无用的文件-----------大文件占用大量的磁盘容量。

df -i    则去删除数量过多的小文件-----------过多的文件占用了大量的inode号。

那么我们如何解决这个问题呢?

1、像上次一样把容器启动的日志删除

docker 磁盘空间规划 docker磁盘空间不足_json_03

 看到容器日志也不多,删除了也不一定能释放较大空间,但做做看看吧。

docker 磁盘空间规划 docker磁盘空间不足_日志文件_04

 关闭docker,再删除。

docker 磁盘空间规划 docker磁盘空间不足_docker_05

 果然释放的空间并不是很多。

docker 磁盘空间规划 docker磁盘空间不足_json_06

Linux系统下查找大文件或目录的技巧

当硬盘空间不够时,我们就很关心哪些目录或文件比较大,看看能否干掉一些了,怎么才能知道呢?以易读的格式显示指定目录或文件的大小,-s选项指定对于目录不详细显示每个子目录或文件的大小

du -sh [dirname|filename] 当前目录的大小:  
du -sh .   当前目录下个文件或目录的大小:   
du -sh *   显示前10个占用空间最大的文件或目录: 
du -s * | sort -nr | head

2、删除镜像

容器删了空间还是紧张,那就删镜像吧

 

docker 磁盘空间规划 docker磁盘空间不足_docker_07

 

docker rm 镜像名/镜像ID进行删除,但我的有部分镜像不是本地的,是docker hub上的,还有的比较重要,所以不建议全部删除。

docker rm $(docker ps -aq) 删除所有  (不建议用,当然也不一定能删掉hub上面的)


常见docker清理方法

docker system df 类似于Linux上的df命令,用于查看Docker的磁盘使用情况:

docker system prune 可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)。

docker system prune -a 清理得更加彻底,可以将没有容器使用Docker镜像都删掉。注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的Docker镜像都删掉了…所以使用之前一定要想清楚.。我没用过,因为会清理全部。

docker 磁盘空间规划 docker磁盘空间不足_docker_08

docker 磁盘空间规划 docker磁盘空间不足_日志文件_09

 我的prune未清理掉dangling的镜像

docker 磁盘空间规划 docker磁盘空间不足_日志文件_10

怎么办?我搜索资料发现还是有办法的。

既然大多数镜像很有用,那么我们还是删除镜像,但是保留或者生成对应的dockerfile文件。

docker 磁盘空间规划 docker磁盘空间不足_docker_11

 

提供一个思路——先根据docker镜像反向生成Dockerfile,再来具体看看。
有这么一个库dockerfile-from-image能做这件事,不过这个库已经没有维护了,我fork了一下改了点东西dockerfile-from-imagepush到了cloud.docker.com,然后你可以执行一下命令:

docker pull fanjieqi/dockerfile-from-image:latestalias dfimage="docker run --rm -v /var/run/docker.sock:/var/run/docker.sock fanjieqi/dockerfile-from-image:latest"dfimage <tag>/<image>:<version>


这样能完整的展示这个镜像的Dockerfile,不过当中add和copy这些命令操作的文件及文件夹都是带了hash的,只能去猜操作的都是什么文件及文件夹,类似于这样:

FROM node:9-alpineWORKDIR /appCOPY file:7668b48cb0ef6effedbfcabe6e44cb7c70922fc63cf9e1a8fe2a259173835186 in /appRUN npm install --production --registry=https://registry.npm.taobao.orgRUN echo -e "https://mirrors.ustc.edu.cn/alpine/latest-stable/main\nhttps://mirrors.ustc.edu.cn/alpine/latest-stable/community" > /etc/apk/repositories && apk update && apk add ca-certificates bash git openssh wget && update-ca-certificates && rm -rf /var/lib/apt/lists/*COPY dir:1a399e39f0bccf78b41ba08e1876cbb222b21475a24c80341ff413b5a0b90b67 in /app


希望能帮助到你。

3、删除系统的日志

就我所知Ubuntu系统的日志文件存放在/var/log/目录里面

=> /var/log/messages:常规日志消息
=> /var/log/boot:系统启动日志
=> /var/log/debug:调试日志消息
=> /var/log/auth.log:用户登录和身份验证日志
=> /var/log/daemon.log:运行squid,ntpd等其他日志消息到这个文件
=> /var/log/dmesg:Linux内核环缓存日志
=> /var/log/dpkg.log:所有二进制包日志都包括程序包安装和其他信息
=> /var/log/faillog:用户登录日志文件失败
=> /var/log/kern.log:内核日志文件
=> /var/log/lpr.log:打印机日志文件
=> /var/log/mail.*:所有邮件服务器消息日志文件
=> /var/log/mysql.*:MySQL服务器日志文件
=> /var/log/user.log:所有用户级日志
=> /var/log/xorg.0.log:X.org日志文件
=> /var/log/apache2/*:Apache Web服务器日志文件目录
=> /var/log/lighttpd/*:Lighttpd Web服务器日志文件目录
=> /var/log/fsck/*:fsck命令日志
=> /var/log/apport.log:应用程序崩溃报告/日志文件
=> /var/log/syslog:系统日志
=> /var/log/ufw:ufw防火墙日志
=> /var/log/gufw:gufw防火墙日志


可以看看/boot下面是否抄有用不到的内核,/tmp下面的文件也可以看着办,/var/log下面的日志可以删(压缩了的基本上是没问题了,没压缩的日志文件删了问题也袭不大,如果你根本不看日志,那就禁用吧)下面的文件定期清理。其实Linux比Windows灵活多了,你可以再准备一个分区,挂载为/usr(或/boot、/var、/home等,但一定要先将原/usr下的文件复制一份进去,并准备好一个可用的Linux急救系统)。
Linux下的软件很多,即使分了50G,最后也会感觉不够用。建议不要贪多,暂时用不到的软件不要装,不用担心想到用的时候下载不到(不能随时联网的情况就有点悲哀了)

这里我的建议是删除老的日志,比如今年2020,你可以把2019之前所产生的所有日志删除了,自己编辑好命令,千万不要瞎写。

4、删除缓存

(1)、非常有用的清理命令:
sudo apt-get autoclean 清理旧版本的软件缓存
sudo apt-get clean 清理所有软件缓存
sudo apt-get autoremove 删除系统不再使用的孤立软件
这三个命令主要清理升级缓存以及无用包的。

(2)、清理opera firefox的缓存文件

ls ~/.opera/cache4
 ls ~/.mozilla/firefox/*.default/Cache

(3)、清理Linux下孤立的包

终端命令下我们可以用:

sudo apt-get install deborphan -y

(4)、卸载:tracker
这个东西一般我只要安装ubuntu就会第一删掉tracker 他不仅会产生大量的cache文件而且还会影响开机速度。所以在里面删掉就行。
附录:
包管理的临时文件目录:
包在
/var/cache/apt/archives
没有下载完的在
/var/cache/apt/archives/partial

5、删除软件

ubuntu软件的删除一e69da5e887aa62616964757a686964616f31333337616561般用“ubuntu软件中心”或“新立得”就能搞定,但有时用命令似乎更快更好~~
sudo apt-get remove --purge 软件名
sudo apt-get autoremove 删除系统不再使用的孤立软件
sudo apt-get autoclean 清理旧版本的软件缓存
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P 清除残余的配置文件

6、删除多余内核

(1),首先要使用这个命令查看当前Ubuntu系统使用的内核
uname -a
(2),再查看所有内核
dpkg --get-selections|grep linux
(3),最后小心翼翼地删除

sudo apt-get remove linux-image-2.6.32-22-generic


ps:linux-image-xxxxxx-generic 就是要删除的内核版本还有linux-headers-xxxxxx         linux-headers-xxxxxx-generic 总之中间有“xxxxxx”那段的旧内核都能删,注意一般选内核号较小的删。不懂就干脆别删了

7、全局查询大文件,删除

cache和log都去查了,没发现什么大文件,最终只好全局查找大文件了。 

find / -xdev -size +100M -exec ls -l {} \;

find . -type f -size +100M

docker 磁盘空间规划 docker磁盘空间不足_日志文件_12

终于,忙碌了好久,那要是下次还有这种情况又要手动清理这么久,能让系统自己解决吗?

(1)解决根分区容量满,又不想更改数据存储路径的我来说,我不想更改任何docker的参数和数据,所以我在自己的虚机机环境上尝试把这些数据迁移到容量较大的磁盘上去,再用链接的方式把数据链接到原来的位置,保证环境尽可能不变动

 1:关闭docker容器和docker进程: # /etc/init.d/docker stop
  2:迁移数据:(假设我要迁移到/mnt/docker):# mv /var/lib/docker /mnt/
  3:制作目录链接 :  # ln -s /mnt/docker /var/lib/docker
   4:启动docker和容器:# /etc/init.d/docker start

(2)迁移数据目录文件

1.查看docker镜像存放目录空间大小

du -hs /var/lib/docker/

2.停止docker服务。

systemctl stop docker

3.查看磁盘容量大的空间,且在上面创建新的docker目录。

df -h
mkdir -p /data/docker/lib

4.迁移/var/lib/docker目录下的文件到新创建的目录/data/docker/lib

rsync -avz /var/lib/docker /data/docker/lib/

5.编辑 /etc/docker/daemon.json 添加如下参数

{
  "graph": "/data/docker/lib/docker"
}

6.重新加载docker,并重启docker服务。

systemctl daemon-reload && systemctl restart docker

7.检查docker是否变更为新目录/data/docker/lib/docker

[root@localhost ~]# docker info
...
Docker Root Dir: /data/docker/lib/docker

Debug Mode (client): false

Debug Mode (server): false

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

8.删掉docker旧目录

rm -rf /var/lib/docker

但是我们还是会产生容器日志啊,没有让系统进行自我清理

设置Docker容器日志文件大小限制

1.新建/etc/docker/daemon.json,若有就不用新建了。添加log-dirver和log-opts参数,样例如下:

# vim /etc/docker/daemon.json

{
  "log-driver":"json-file",
  "log-opts": {"max-size":"500m", "max-file":"3"}
}


max-size=500m,意味着一个容器日志大小上限是500M, 
max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json。

2.然后重启docker的守护线程

命令如下:

systemctl daemon-reload
systemctl restart docker

【需要注意的是:设置的日志大小规则,只对新建的容器有效】