Docker备份、恢复、迁移数据卷 · Docker:从入门到实践
利用数据卷容器来备份、恢复、迁移数据卷
可以利用数据卷对其中的数据进行进行备份、恢复和迁移。
备份
首先使用 --volumes-from
标记来创建一个加载 dbdata 容器卷的容器,并从主机挂载当前目录到容器的 /backup 目录。命令如下:
$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
容器启动后,使用了 tar
命令来将 dbdata 卷备份为容器中 /backup/backup.tar 文件,也就是主机当前目录下的名为 backup.tar
的文件。
恢复
如果要恢复数据到一个容器,首先创建一个带有空数据卷的容器 dbdata2。
$ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
然后创建另一个容器,挂载 dbdata2 容器卷中的数据卷,并使用 untar
解压备份文件到挂载的容器卷中。
$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf
/backup/backup.tar
为了查看/验证恢复的数据,可以再启动一个容器挂载同样的容器卷来查看
$ sudo docker run --volumes-from dbdata2 busybox /bin/ls /dbdata
Image
镜像的迁移,适用于离线环境。
一般离线环境,都会自建Docker Registry。 无论 官方的,还是最近流行的 Harbor,都是不错的选择。 但是,这个世界上就是有些环境,或者说一些环境在某些时期,没有外网,也没有内部的Registry。 这个时候要部署Docker的服务,怎么办?
只能通过镜像的迁移。 实际上, Harbor的offline installer,就是采用这种形式。
Save
# use stdout docker save alpine > /tmp/alpine.tar # or write to a file directly docker save alpine -o /tmp/alpine.tar
推荐使用
-o
的形式,因为利用stdout的做法虽然直观,但在某些场景下无效,比如利用ssh
远程执行命令。Load
# use stdout docker load < /tmp/wekan.tar # or read from a file directly docker load -i /tmp/wekan.tar
Container
容器的迁移,适用于已经上线,且状态复杂、从零开始启动不能正常工作的服务。 容器迁移的包,包含了镜像。
Export
先准备一个正在运行的服务,并且弄脏环境。
$ docker run --rm -d --name test alpine tail -f /dev/null 9232f0c1dafe0f29918f281ca37bb41914677e818cb6f252abf3dab3be04fbb2 $ docker exec test touch proof $ docker exec test ls -hl proof -rw-r--r-- 1 root root 0 Nov 20 14:33 proof
执行导出操作:
docker export test -o test.tar
Import
首先,关闭刚才运行的服务。
$ docker kill test test
执行导入操作:
$ docker import test.tar test-img sha256:e03727eeba7e16dd3acfcc7536f1244762508f9b6b9856e49cc837c1b7ffa444
要注意的是,
import
后得到的是一个镜像,相当于是执行了docker commit
后的内容。 当然,docker commit
不是一个推荐的操作,所以容器的导入、导出,就显得不是那么的顺眼。最后,检查之前创建的文件。
$ docker run --rm -d --name test test-img tail -f /dev/null ee29cb63bb2d3ed8ac890789ba80c4fe4078b9d5343a8952b6217d64b4dcbe23 $ docker exec test ls -hl proof -rw-r--r-- 1 root root 0 Nov 20 14:33 proof
可以看到,前面创建的文件是存在的,并且时间戳完全一致。