侧边栏壁纸
博主头像
Eoser's page! 博主等级

@学习@生活@自己

  • 累计撰写 121 篇文章
  • 累计创建 31 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Docker镜像搬家的折腾之旅

eoser
2025-03-31 / 0 评论 / 0 点赞 / 4 阅读 / 0 字

起因

我用了一个J1800的小主机当家庭nas,根目录/dev/sda1的大小只有64G,最近多安装了几个大体积的Docker服务,要把系统盘撑爆炸了,就想着移一下位置,没想到All in boom了,还好所有服务创建时都是为了boom的时刻准备的,又折腾了一天搞定了。

系统环境

ubuntu server 22.04

Docker 直接安装的系统apt的

screen 窗口下执行

开始折腾

准备工作
  1. 创建个screen窗口防止网络原因掉后台:screen -R workspace

  2. 关闭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的具体路径才知道,折腾了一天。

修改配置
  1. 创建/修改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"
  ]
}
文件操作
  1. 原始文件移动,防止操作出错影响

mv /var/lib/docker /var/lib/docker_tmp
mv /var/lib/containerd /var/lib/containerd_tmp
mkdir /var/lib/docker
mkdir /var/lib/containerd
  1. 创建目标文件夹并且挂载到目标目录

# 创建存放的文件
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
  1. 疯狂的拷贝吧,三个方法任选其一

# 方法一:移动法,我的实际操作,就怕中间拷贝时出现意外
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

0

评论区