起因
我用了一个J1800的小主机当家庭nas,根目录/dev/sda1的大小只有64G,最近多安装了几个大体积的Docker服务,要把系统盘撑爆炸了,就想着移一下位置,没想到All in boom了,还好所有服务创建时都是为了boom的时刻准备的,又折腾了一天搞定了。
系统环境
ubuntu server 22.04
Docker 直接安装的系统apt的
screen 窗口下执行
开始折腾
准备工作
创建个screen窗口防止网络原因掉后台:
screen -R workspace
关闭docker服务:
systemctl stop docker.sock && systemctl stop docker.service && systemctl stop containerd
解释一下为什么要停止
containerd
的原因,因为docker依赖containerd
,运行容器服务时要把/var/lib/containerd下的镜像相关的文件作为lowerdir overlay到/var/lib/docker/overlay2之类的目录,作为容器运行环境的基础(这也是为什么创建了容器的镜像不能删除的原因),之前我也是不知道镜像存储在该路径下导致boom了,后来运行docker容器时通过mount看到了overlay的具体路径才知道,折腾了一天。
修改配置
创建/修改docker配置文件
nano /etc/docker/daemon.json
{
"data-root": "/data/var/lib/docker", # 修改这里为你空间大的位置,我是把数据盘挂到了/data这个位置
# 通过我后面的操作后其实也可以不修改,我这里修改是因为该磁盘是移动磁盘,没挂载docker就没法运行,可以起到防呆作用,不让docker污染系统盘
"features": {
"buildkit": true,
"containerd-snapshotter": true
},
"registry-mirrors": [
"https://dockerproxy.net"
]
}
文件操作
原始文件移动,防止操作出错影响
mv /var/lib/docker /var/lib/docker_tmp
mv /var/lib/containerd /var/lib/containerd_tmp
mkdir /var/lib/docker
mkdir /var/lib/containerd
创建目标文件夹并且挂载到目标目录
# 创建存放的文件
mkdir /data/var/lib/docker
mkdir /data/var/lib/containerd
# 把创建的文件夹挂载到lib下
echo '/data/var/lib/docker /var/lib/docker none defaults,bind 0 1' >> /etc/fstab
echo '/data/var/lib/containerd /var/lib/containerd none defaults,bind 0 1' >> /etc/fstab
# 执行挂载
mount -a
疯狂的拷贝吧,三个方法任选其一
# 方法一:移动法,我的实际操作,就怕中间拷贝时出现意外
mv /var/lib/docker_tmp/* /var/lib/docker
mv /var/lib/containerd_tmp/* /var/lib/containerd
# 方法二:拷贝法,不知道是否会出现权限问题
cp -r /var/lib/docker_tmp/* /var/lib/docker
cp -r /var/lib/containerd_tmp/* /var/lib/containerd
# 方法三:快速拷贝,rsync比cp快,也是不知道是否会出现权限问题
rsync -av /var/lib/docker_tmp/ /var/lib/docker
rsync -av /var/lib/containerd_tmp/ /var/lib/containerd
检验成果
天门,给我开!
systemctl start docker.sock && systemctl start docker.service && systemctl start containerd
开启服务或重启后df -h下挂载为/dev/sda1的目录,查看大小
找不做其他下载操作的情况下,docker pull 拉取一个几百兆的镜像后,再df -h 一下
如果挂载为/dev/sda1的目录占有大小没变或者变化极小,那就是成功了!
可以删除垃圾了
rm -rf /var/lib/docker_tmp
rm -rf /var/lib/containerd_tmp
评论区