docker容器跑久了,其产生的日志可能会占用比较多的空间
[root@server1 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 475M 0 475M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 14M 473M 3% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/mapper/centos-root 17G 2.3G 15G 14% /
/dev/sda1 1014M 138M 877M 14% /boot
tmpfs 98M 0 98M 0% /run/user/0
overlay 17G 2.3G 15G 14% /var/lib/docker/overlay2/91ddd61b6d6aa09a8564a17ff71058e69fd13d2fdc4ee4f8f3a5a56852478174/merged
查看docker空间占用
有了docker,多数情况下,我们可以不在需要过于关心环境,但也付出一些代价,占用空间便是其中一点
[root@server1 ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 4 1 409.8MB 348.7MB (85%)
Containers 1 1 3B 0B (0%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
该命令列出了 docker 使用磁盘的 4 种类型:
Images: 所有镜像占用的空间,包括拉取的镜像、本地构建的镜像
Containers: 运行中的容器所占用的空间(没运行就不占空间),其实就是每个容器读写层的空间
Local Volumes: 本地数据卷的空间
Build Cache: 镜像构建过程中,产生的缓存数据
此时可以通过下面命令清理 Docker 占用的空间。
[root@server1 ~]# docker system prune -a
该命令会删除暂停中的容器、没有关联容器的镜像、没有 tag 的镜像、没有被使用的数据卷,简单而言,没有在 run 或被使用的东西都被清理掉,注意,如果你有一些暂时暂停的容器,这个命令也会将其清理掉。
为了深入理解上述命令的作用,先讨论一下在使用 docker 镜像创建容器时,docker会创建哪些目录:
我们使用 docker 镜像创建容器时,docker会创建一些目录,如:
/var/lib/docker/containers/<容器ID> 目录,如果容器使用了默认的日志模式,那么该容器的日志会以 JSON 形式保存在此目录下。
/var/lib/docker/overlay2 目录,该目录包含容器的读写层,如果容器使用自己的文件系统保存了数据,那么这些数据就会写到此目录下。
为了更直观,弄一台干净的 Linux 服务器(刚好去年双 11 买了 Linux 服务器),演示创建容器过程中,docker 占用空间的变化。
一开始,docker 没有占用任何空间:
迁移
停止docker
[root@server1 ~]# systemctl stop docker
创建docker的新目录,地址使用 /data/docker/lib/
[root@server1 ~]# mkdir /data/docker/lib/ -p
迁移
[root@server1 ~]# cp -r /var/lib/docker /data/docker/lib/
指定新的docker目录
[root@server1 ~]# vi /lib/systemd/system/docker.service
在ExecStart加入:
--graph=/data/docker/lib/docker
或者
[root@server1 overlay2]# vi /etc/docker/daemon.json
添加
"graph": "/home/docker-rootdir"
问题二:overlay2占用大量磁盘空间
解决方式:
首先找到overlay2目录
cd /var/lib/docker/overlay2
查看文件的大小
du -h --max-depth=1
查看占用空间的pid,以及对应的容器名称
docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.Name}}, {{.GraphDriver.Data.WorkDir}}' | grep "ad1c8c23ccf18ff112b179ce1bc694982d7854146fae0f5df408144ca"
解决方法(会删除对应的容器和对应镜像)
[root@server1 overlay2]# docker stop /optimistic_bassi && docker rm /optimistic_bassi && docker rmi /optimistic_bassi