自己总结出来的方案

进入docker的挂载目录

cd /root/data/

打包压缩docker挂载数据

tar -cvzf docker_data.tar docker_data/

# 如果有部署dst服务器,但不想备份dst目录,则可以使用
tar -cvzf docker_data.tar --exclude='docker_data/dst' docker_data/

# 压缩时跳过目录细则参考:https://blog.kuuhaku.fun/archives/tarya-suo-shi-tiao-guo-zhi-ding-mu-lu
  • -c :创建打包文件,会递归目录中的每个文件,如果想改变此行为,可以指定 --no-recursion

  • -v :在打包时打印详细debug信息

  • -f :指定打包后的文件名

  • -z :打包文件时使用 gzip 进行压缩

  • -x :提取打包文件

du命令分析文件夹

觉得打包的文件体积不对,可以查一下大小

# 分析当前目录下所有文件和文件夹的大小,按大小排序
du -h --max-depth=1 | sort -hr

# 分析指定目录
du -h --max-depth=1 /path/to/directory | sort -hr

参数说明:

  • -h:人类可读的格式(KB、MB、GB)

  • --max-depth=1:只显示指定目录的直系内容

  • sort -hr:按人类可读的数字逆序排序(从大到小)

解压

cd /root/data
tar -xvzf test.tar

或者解压到指定目录

tar -xvzf test.tar -C /root/data/

Docker挂载目录打包

查看文件路径

docker inspect  容器名

查看Mounts,就可以看到映射到本地的目录。

"Mounts": [
            {
                "Type": "bind",
                "Source": "/root/data/docker_data/halo",
                "Destination": "/root/.halo2",
                "Mode": "rw",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

Source:挂载路径

Destination:容器内部路径

实际要备份的就是挂载路径下的内容,将其打包压缩存起来就好

省力命令

或者直接用下面这个命令:

docker run --rm --volumes-from CONTAINER -v $(pwd):/backup busybox tar cvfz /backup/backup.tar CONTAINERPATH

更改CONTAINER(容器名)和CONTAINERPATH(容器内部路径),例如:

docker run --rm --volumes-from halo -v $(pwd):/backup busybox tar cvfz /backup/backup.tar /root/.halo2

SCP传输文件到另一台服务器

scp /root/backup/backup.tar root@6.6.6.6:/root/data/docker-data/halo

然后输入目标主机密码,就能使用ssh传输文件

然后用docker compose正常安装容器

替换掉数据

这里我用的Xftp下载下来

其他常用命令

查日志最后10行

docker logs --tail 10 <容器ID或名称>

解压

tar -zxvf /root/data/docker-data/halo/backup.tar

重命名

mv data bw-data   #把data重命名成bw-data

罗列目录下文件

ls -al

查看正在运行的docker容器

docker ps

查看到当前路径

pwd

停止docker容器

docker stop halo

删除docker容器

docker rm -f halo

因为挂载属于持久性挂载,容器被删掉,但是挂载文件不会被删除

所以有时候需要手动删除挂载文件

删除文件夹

rm -rf 文件夹名/

创建文件夹

mkdir 文件夹名

参考

https://www.bilibili.com/video/BV11R4y1x7GJ

https://blog.laoda.de/archives/backup-docker