数据卷备份和迁移
备份和迁移数据卷是维护 Docker 容器数据的重要操作。说实话,数据卷的备份和迁移比绑定挂载麻烦。第一次看到长长的备份命令时,我惊讶了,不过理解之后也还好。
一、备份数据卷
-
确定要备份的数据卷:
# 使用 docker volume ls 命令列出所有数据卷。假设备份 my_volume
ubuntu@www.zxzsk.com:~$ docker volume ls
DRIVER VOLUME NAME
local 8fc4a7d5d333e2addff8d6c859064b93daf9715d4352d9b03837ea6389d93f26
local my_volume
local my_volume2
local my_volume3
local my_volume4
# 要备份 my_volume 卷。查看哪些容器使用了 my_volume 卷。
ubuntu@www.zxzsk.com:~$ docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Mounts}}"
CONTAINER ID NAMES MOUNTS
9f7ad149cfef my-nginx4 my_volume
11be6349947f my-nginx my_volume
e230b1fd483f priceless_allen
0ea1a7d43fb9 cool_satoshi
5f9cfbdba6a0 musing_dijkstra -
创建备份: 可以使用
docker run
命令结合tar
命令来备份一个数据卷。以下是一个示例命令:docker run --rm --volumes-from <app_container> -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /app/data
理解命令首先你要知道上面是一个很长的 docker run 命令,回顾 docker run 命令的格式:
docker run [选项] 容器 [命令]
。然后我告诉你这个 docker run 做了什么:
--rm
在容器停止后,自动销毁容器。--volumes-from <app_container>
共享另一个容器(app_container)的存储卷$(pwd):/backup
将宿主机当前目录挂载到容器/backup
目录ubuntu
使用镜像ubuntu:latest
。 使用哪个镜像无所谓,只要镜像内有 tar 命令即可。tar cvf /backup/<backup_name>.tar /app/data
是容器启动时要执行的命令。作用:使用 tar 命令将容器的数据卷(假设/app/data
目录)备份到/backup
目录下,也就是宿主机$(pwd)
目录 。
示例# 备份 my-nginx 容器在 my_volume 卷数据
ubuntu@www.zxzsk.com:~$ docker run --rm --volumes-from my-nginx -v $(pwd):/backup ubuntu tar cvf /backup/my-nginx-data.tar /usr/share/nginx/html/
tar: Removing leading `/' from member names
/usr/share/nginx/html/
/usr/share/nginx/html/index.html
/usr/share/nginx/html/50x.html
# 数据已备份到宿主机当前目录
ubuntu@www.zxzsk.com:~$ ls
my-nginx-data.tar
二、迁移数据卷
-
传输备份文件: 将生成的
.tar
文件传输到目标机器。 -
在目标机器上恢复数据卷: 在目标机器上创建一个新的容器并挂 载新的数据卷,然后使用以下命令恢复数据:
docker run --rm --volumes-from app_container -v $(pwd):/backup busybox tar xvf /backup/backup.tar -C /app/data
理解命令这里同样是通过运行一个临时容器,将宿主机目录和另一个容器(
<app-container>
)的存储卷挂载到临时容器,然后通过 tar 命令将备份文件还原到存储卷目录。tar -C
:指定解包到某个目录。
注意事项
- 在进行备份和迁移操作时,请确保容器已经停止,以避免数据不一致。
- 在迁移数据卷之前,请确保目标机器上 Docker 的版本兼容。
- 安全地传输备份文件,可以使用
scp
、sftp
或其他安全的数据传输方式。 - 定期进行数据卷的备份,以防止数据丢失。 这些步骤适用于大多数情况,但具体的命令和参数可能需要根据您的实际环境和需求进行调整。