如果你喜欢使用docker搭建一些好玩的项目,那这一篇docker备份还原加迁移的文章你必须得肝了,因为数据对我们很重要,docker创建一个容器很简单,但是你的数据,你知道他们在哪儿吗?下面就来介绍怎么找到自己的数据位置,备份他,还原他,迁移他

一、这次以ZFile为例,顺便演示一下怎么在docker里面部署一个ZFile文件管理系统。

疑问:ZFile是什么?
答:最方便快捷的在线目录展示程序,支持将本地文件、FTP、SFTP、S3、OneDrive 等存储在网站上展示并浏览。
ZFile官网:👉点击直达

1、首先查看当前zfile容器运行状态。

docker ps -a

2、我当时部署zfile时没有用docker-compose部署,用的docker,但是docker后期迁移升级不是非常方便,因为你要把之前用docker命令安装容器的代码原份不动的运行一遍才能成功,比如下面这个就是我之前用来安装zfile的docker命令,咱们咋一看代码不好记忆,而且这句代码运行完就没有记录了,如果你没有记笔记的习惯,那你下次使用的时候就很难还原成下面这样了,所以这次借助此教程,也把我的zfile更新成docker-compose的模式运行,这里就有一个问题就是,怎么把docker代码改成docker-compose代码,巧在zfile官网已经帮大家写好了docker和docker-compose的代码了,我们可以直接去复制,我最开始部署zfile也是直接去官网复制下面的这个,但是当时没注意下面还有docker-compose。可是有些docker项目github项目或者开源项目官网没有给出docker-compose的代码怎么办,这里给大家推荐一个网站,可以将docker代码转换成docker-compose代码,如下:

docker代码转docker-compose代码网站:👉点击直达

给大家展示一下zfile官方给出的docker代码和docker-compose格式的代码模板。

docker代码
👇

docker run -d --name=zfile --restart=always \
    -p 8080:8080 \
    -v /root/zfile/db:/root/.zfile-v4/db \
    -v /root/zfile/logs:/root/.zfile-v4/logs \
    -v /root/zfile/file:/data/file \
    -v /root/application.properties:/root/application.properties \
    zhaojun1998/zfile

docker-compose代码

👇

version: '3.3'
services:
    zfile:
        container_name: zfile
        restart: always
        ports:
            - '8080:8080'
        volumes:
            - '/root/zfile/db:/root/.zfile-v4/db'
            - '/root/zfile/logs:/root/.zfile-v4/logs'
            - '/root/zfile/file:/data/file'
            - '/root/application.properties:/root/application.properties'
        image: zhaojun1998/zfile

3、如果你之前使用的是docker代码搭建的,但你又没有存档docker代码怎么办,我们可以使用如下命令协助查找解决(哎,还是有办法滴,不要急,你急也没用😋)

3.1、首先通过步骤1的命令docker ps -a 可以得到,使用的是tcp协议,内部端口8080,外部端口8081;使用的镜像名称是:zhaojun1998/zfile

3.2、然后使用下面的命令在确认卷的映射关系和映射路径

docker inspect zfile

由上图就可以得到如下的关系,有了这些信息,我们就可以得到之前的docker代码了。

-v /root/zfile/db:/root/.zfile-v4/db
-v /root/zfile/logs:/root/.zfile-v4/logs
-v /root/zfile/file:/data/file
-v /root/application.properties:/root/application.properties \

4、因为我们的zfile容器还在运行所以第一步先暂停容器

docker stop zfile

5、zfile容器暂停后,我们先备份这个容器的数据,然后删除这台服务器上的zfile容器(删除之前如果你没有100%把握你能独立恢复,请先给你的服务器打一个快照,不然数据丢失,别怪我教程没写哦😂),最后在还原我们这台服务器的zfile容器

PS:通过步骤3.2我们可以看到数据库db;日志logs;zfile的文件zfile;以及配置文件application.properties都在/root文件下,那我们可以通过在/root目录下将zfile以及application.properties压缩打包实现备份。

5.1、确认自己的目录位置,查看文件

5.2、使用tar命令进行打包压缩备份

tar -czvf zfile-backup.tar.gz application.properties zfile
ls -l

5.3、使用docker rm命令删除这台服务器的zfile容器

docker ps -a | grep 8f66   #证明容器存在并且已经停止
docker rm zfile                  #删除容器
docker ps -a | grep 8f66   #验证容器已被删除

5.4、开始尝试恢复zfile容器,并且可以正常登录,数据也没有丢失

5.4.1、先用docker命令还原(我的外部端口我改成8081了,请注意一下

此时我们可以看到容器的ID已经改变了,之前是8f66现在是dc20

docker run -d --name=zfile --restart=always \
    -p 8081:8080 \
    -v /root/zfile/db:/root/.zfile-v4/db \
    -v /root/zfile/logs:/root/.zfile-v4/logs \
    -v /root/zfile/file:/data/file \
    -v /root/application.properties:/root/application.properties \
    zhaojun1998/zfile

验证:尝试访问一下

验证:尝试登陆后台,都没有问题,完成!

5.4.2、我们再次删掉刚刚恢复的zfile这个容器,然后使用docker-compose安装一下。

首先在/root/data/docker_data/目录下创建一个zfile文件,然后将刚刚备份的zfile-backup.tar.gz移动到这个目录下,然后解压。

docker stop zfile
docker rm zfile
mkdir -p /root/data/docker_data/zfile
cd /root/data/docker_data/zfile/
mv /root/zfile-backup.tar.gz /root/data/docker_data/zfile/
ls
tar -zxvf zfile-backup.tar.gz

5.4.3、然后在这个目录下创建一个docker-compose.yaml文件

将官网的docker-compose.yml代码贴进去保存

vi docker-compose.yaml

官网代码:
👇👇👇

version: '3.3'
services:
    zfile:
        container_name: zfile
        restart: always
        ports:
            - '8080:8080'
        volumes:
            - '/root/zfile/db:/root/.zfile-v4/db'
            - '/root/zfile/logs:/root/.zfile-v4/logs'
            - '/root/zfile/file:/data/file'
            - '/root/application.properties:/root/application.properties'
        image: zhaojun1998/zfile

注意了!注意了!注意了!为什么我上面要创建zfile文件夹和迁移备份文件到zfile文件夹呢,并且还在zfile文件夹下创建docker-compose.yaml,是为了后续迁移备份还原做的准备,请继续玩下看。

修改官网代码如下(根据自己实际路径修改):
👇👇👇

version: '3.3'
services:
    zfile:
        container_name: zfile
        restart: always
        ports:
            - '8080:8080'
        volumes:
            - '/root/data/docker_data/zfile/zfile/db:/root/.zfile-v4/db'
            - '/root/data/docker_data/zfile/zfile/logs:/root/.zfile-v4/logs'
            - '/root/data/docker_data/zfile/zfile/file:/data/file'
            - '/root/data/docker_data/zfile/application.properties:/root/application.properties'
        image: zhaojun1998/zfile

5.4.4、然后运行/root/data/docker_date/zfile下的docker-compose.yaml文件

PS : docker compose up -ddocker-compose up -d ,两个命令执行的功能是一样的,都是使用 Docker Compose 启动容器,并且在后台运行。只是第一个命令使用了 docker 命令直接启动 compose,而第二个命令使用了 docker-compose 工具来启动 compose。

在 Docker 1.13 版本之前,docker-compose 命令是需要单独安装的。因此,使用 docker 命令启动 compose 更为常见。但是在 1.13 版本以后,docker-compose 命令被集成到了 docker 命令中,因此也可以直接使用 docker-compose 命令来启动 compose。

docker compose up -d

发现报错了,8080端口被占用,检查一下8080端口使用情况

lsof -i:8080

修改docker-compose.yaml的外部端口为:8081再次运行,就可以了。

vi docker-compose.yaml

docker compose up -d

然后运行docker ps -a查看以容器运行状态,发现容器ID再次改变,然后在验证打开web和管理后台都是成功的。

docker ps -a

6、迁移到其他服务器验证是否可以正常打开,检查数据是否都在。

6.1、使用SCP命令将本服务器刚刚备份压缩的zfile-backuo.tar.gz传输到另外一台服务器上。

首先先去另外一台Ubuntu的tmp文件夹下查看当前目录的文件,如下图:

cd /tmp
ls

6.2、到本服务器上,cd进入到存放zfile-backuo.tar.gz文件的目录

cd /root/data/docker_data/zfile
ls

6.3、使用如下命令将zfile-backuo.tar.gz文件拷贝到Ubuntu系统中

scp -P 22 -r zfile-backup.tar.gz young@10.x.x.9:/tmp

传输完成后去Ubuntu系统下在ls查看是否传输成功,可以看到已经好了。

ls

6.4、接下里全部都在Ubuntu系统内操作了,首先先去解压这个文件到Ubuntu相同的路径下,比如:

/root/data/docker_data/zfile

6.4.1、先创建这个目录和文件夹
mkdir -p /root/data/docker_data/zfile
cd /root/data/docker_data/zfile
cp /tmp/zfile-backup.tar.gz /root/data/docker_data/zfile
ls
tar -zxvf zfile-backup.tar.gz

ls
cd zfile/
ls
mv db/ file/ logs/ /root/data/docker_data/zfile/  #把zfile文件都移动到/root/data/docker_data/zfile目录,为了下面写docker-compose.yaml好看一点
ls
cd ..
ls

6.4.2、因为这个zfile-backuo.tar.gz这个文件是之前没用docker-compose时备份的,没有吧docker-compose.yaml一起备份进去,所以还得来一步把docker-compose.yaml也拷贝过来,以后只需要备份Ubuntu系统下的/root/data/docker_data文件就好了。
scp -P 22 -r docker-compose.yaml young@10.x.x.9:/tmp

6.4.3、将Ubuntu系统的tmp目录下把docker-compose.yaml迁移到/root/data/docker_data/zfile文件下,并删除多余的文件/zfile,(备份文件zfile-backuo.tar.gz留着)
mv /tmp/docker-compose.yaml /root/data/docker_data/zfile/
ls
rm -rf zfile
ls

6.4.4、然后修改docker-compose.yaml文件,修改db,logs,file的映射路径
vi docker-compose.yaml


👇


👇

6.4.5、见证奇迹的一刻!

首先查看当前运行的容器,只有portainer,tomcat,halo

docker ps -a

然后在/root/data/docker_data/zfile目录运行docker-compose up -d

docker-compose up -d

可以看到Ubuntu系统在拉去zfile的镜像

看到:⠿ Container zfile Started表示成功了

然后运行docker ps -a检查一下运行状态,容器已经成功运行了

docker-compose up -d

然后我们来打开web和管理控制台验证一下,也成功了,而且之前配置的格式,数据都在!

7、拓展

问:如果我们有很多容器怎么一次性全部备份,还原,迁移?

答:合理存放你的数据,前期在搭建docker项目时就要把所有docker数据都存放在一个目录下管理,比如/root/data/docker_data/,然后配置一个自动备份脚本,定时备份,以防数据丢失,后面为大家介绍,怎么弄自动备份脚本。

到这里就结束喽,现在我们对docker容器的备份,还原,迁移还原都有所了解了,我想对你应该有重要意义吧!✌✌✌✌✌✌✌✌✌