参考文章:
===> Docker底层:Overlay2 文件系统原理
===> 腾讯云-浅析 Docker overlay2 文件结构
联合挂载技术
所谓联合挂载技术(Union Mount),就是将原有的文件系统中的不同目录进行合并(merge),最后向我们呈现出一个合并后文件系统。在 overlay2 文件结构中,联合挂载技术通过联合三个不同的目录来实现:lower目录、upper目录和work目录,这三个目录联合挂载后得到merged目录
- lower目录:只读层,可以有多个,处于最底层目录
- upper目录:读写层,只有一个
- work目录:工作基础目录,挂载后内容被清空,且在使用过程中其内容不可见
- merged目录:联合挂载后得到的视图,其中本身并没有实体文件,实际文件都在upper目录和lower目录中,在merged目录中对文件进行编辑,实际会修改upper目录中文件,而在upper目录与lower目录中修改文件,都会影响我们在merged目录中看到的结果
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
选项中。
所以必须一起迁移,无法只迁移overlay2文件系统?
docker默认存储路径为: /var/lib/docker
docker占用磁盘空间分析命令:
docker ps -s
(查看每个容器磁盘空间占用,加上-a查看包括未启动的容器)
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下面,根目录空间/得到了释放。
(可选)
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