修改docker的/var/lib/docker/overlay2储存路径

yuanheci 2025年01月07日 21次浏览

参考文章:
===> Docker底层:Overlay2 文件系统原理

===> 腾讯云-浅析 Docker overlay2 文件结构

image-1736247403843

联合挂载技术
  所谓联合挂载技术(Union Mount),就是将原有的文件系统中的不同目录进行合并(merge),最后向我们呈现出一个合并后文件系统。在 overlay2 文件结构中,联合挂载技术通过联合三个不同的目录来实现:lower目录、upper目录和work目录,这三个目录联合挂载后得到merged目录

  • lower目录:只读层,可以有多个,处于最底层目录
  • upper目录:读写层,只有一个
  • work目录:工作基础目录,挂载后内容被清空,且在使用过程中其内容不可见
  • merged目录:联合挂载后得到的视图,其中本身并没有实体文件,实际文件都在upper目录和lower目录中,在merged目录中对文件进行编辑,实际会修改upper目录中文件,而在upper目录与lower目录中修改文件,都会影响我们在merged目录中看到的结果

image-1736249055743

Docker 卷(Volume)是什么?
  Volume 是 Docker 提供的一种用于持久化数据的机制。它是由 Docker 管理的,可以存储在容器外部,并且在容器销毁或重启后仍然存在。Volume 可以用于多个容器之间共享数据,非常适合存储数据库数据、日志文件等需要持久化的文件。

Volume具体操作方式:
===> 阿里云-Docker Volume

可以使用docker volume create命令创建 docker 卷。此命令将在配置的overlay2存储 data-root/volumes 路径下(默认是 /var/lib/docker/volumes 目录)中创建一个卷。


由于我的云服务器上系统盘只有50G,容器太多磁盘空间不足了,于是准备迁移到新的磁盘上。

注意不只overlay2文件系统,其余images,containers等信息也都在data-root选项中。
image-1736242647652
所以必须一起迁移,无法只迁移overlay2文件系统?

docker默认存储路径为: /var/lib/docker

docker占用磁盘空间分析命令:

  • docker ps -s (查看每个容器磁盘空间占用,加上-a查看包括未启动的容器)
    image-1736242971996
  • docker system df (查看所有容器磁盘空间占用总量)

1.创建新的存储目录

sudo mkdir -p /data/var/lib/docker

2.修改目录权限

确保 Docker 可以访问新目录
sudo chmod 755 /data/var/lib/docker

3.配置 Docker 使用新的存储位置

1.停止 Docker 服务
在更改配置之前,首先停止 Docker 服务
sudo systemctl stop docker

4.编辑 Docker 配置文件

sudo vim /etc/docker/daemon.json
添加或更新 data-root 配置项以指定新的存储路径

{
  "data-root": "/data/var/lib/docker"
}

5.迁移现有 Docker 数据

将现有的 Docker 数据从系统盘移动到新目录
rsync 命令比 cp 更好
sudo rsync -aP /var/lib/docker/ /mnt/storage/docker/

rsync 命令是一个功能更强大的文件同步工具,不仅可以复制文件和目录,还具有增量同步、断点续传、权限和属性保留等功能。

确保在迁移数据期间 Docker 服务是停止的,以避免数据不一致。

6.启动 Docker 服务

sudo systemctl start docker

验证更改
确保 Docker 服务正在使用新的存储位置。可以通过以下命令检查 Docker 存储位置

docker info | grep "Docker Root Dir"

7.清理旧的 Docker 数据

如果一切正常,你可以删除旧的 Docker 数据目录(注意在删除之前确保 Docker 数据已成功迁移)

sudo rm -rf /var/lib/docker

8.最终

成功移到了/dev/vdb挂载的/data下面,根目录空间/得到了释放。

image-1736242813690


(可选)

8.清理 Docker中的垃圾数据,可以使用以下命令
清理未使用的 Docker 镜像、容器、网络和数据卷:
docker system prune

如果希望同时删除未使用的镜像、容器、网络和数据卷,可以加上 -a 选项:
docker system prune -a

清理未使用的 Docker 镜像:
docker image prune

如果希望删除所有未使用的镜像(包括带标签的镜像),可以加上 -a 选项:
docker image prune -a

清理未使用的 Docker 容器:
docker container prune

清理未使用的 Docker 网络:
docker network prune

清理未使用的 Docker 数据卷:
docker volume prune