「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手

「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片


文章目录

  • 前言
  • 1. 数据的恢复与迁移
    • 恢复数据卷
    • 迁移数据卷
  • 2. 管理数据卷
    • 与容器关联
    • 命令管理
  • 3. 总结

「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

前言
上一篇文章讲了 Docker 的数据卷:【Docker 那些事儿】容器数据卷的本手

本篇文章将继续承接上一篇,讲讲数据卷的恢复与迁移,以及管理
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

1. 数据的恢复与迁移 容器对于宿主机来说就是一个进程,有时难免出现故障。
【「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手】在生产环境中,人们很少会去修复一个容器,通常是将原来的容器删除,并重新运行一个新的容器继续提供服务。
这时就需要用到 Docker 数据卷的恢复与迁移技术。
恢复数据卷 恢复数据卷是将备份数据恢复到原容器中。
在上一篇文章中已经在宿主机中做好了数据备份,下面模拟数据丢失来对容器数据卷进行恢复。示例代码如下
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

以上示例为了模拟数据丢失,将容器中文件 /var/volume1/a.txt var/volume2/b.txt 删除。
下面进行数据恢复,示例代码如下
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

以上示例通过创建新容器对数据卷容器进行挂载,并将宿主机数据目录挂载到容器,再将解压后的数据存放到指定路径下。
下面进入容器查看数据是否成功恢复,示例代码如下
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

从以上示例中可以看到,数据文件 a.txt 与 b.txt 都已经成功恢复。
迁移数据卷 迁移数据卷是将备份数据恢复到新建容器中。
新建容器并解压备份文件到新的容器数据卷,示例代码如下:
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

以上示例新建了容器 new-container,并挂载了数据卷目录 volume1 与 volume2,但数据卷中并没有数据。
下面使用 Ctrl+P+Q 组合键退出当前容器终端,将备份数据迁移到容器 new-container 中,示例代码如下:
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

从以上示例中可以看到,数据已经迁移成功。
建议新容器创建时挂载的数据卷路径与先前备份的数据卷路径保持一致,否则会出现数据恢复不全的情况,示例代码如下:
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

以上示例中,路径没有保持一致,备份之后发现只恢复了 volume1 中的数据,volume2 中的数据没有恢复。
为了避免这种情况的发生,可以修改 -C 参数后面的路径,使数据正常恢复,示例代码如下:
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

以上示例通过修改路径,使数据完整的备份到容器 new-container 中。
2. 管理数据卷 与容器关联 数据卷最大的优势是 可以用来做持久化数据,它的生命周期是独立的
Docker 不会在容器被删除后自动删除数据卷,也不存在类似垃圾回收的机制来处理没有被任何容器使用的数据卷。
但难免会有无用的数据卷,用户可以通过在删除容器的命令中添加参数,在删除容器的同时删除数据卷。
Docker数据卷可以通过命令与容器关联,删除容器时,数据卷也随之删除。
  • docker rm -v
删除容器时添加-v参数会将数据卷一并删除。
  • docker run --rm
创建、运行容器时添加 --rm 参数,容器运行结束时容器与数据卷会被一并删除。

如果不对数据卷进行及时清理,/var/lib/Docker/volumes/ 目录下就会产生许多残留目录。

但删除的数据卷是无法找回的,建议再三确认之后在执行操作。
下面创建一个容器并挂载数据卷,再将容器删除查看数据,示例代码如下:
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

以上示例中,将挂载了数据卷的容器删除之后,容器挂载的数据卷还存在。
下面在删除容器的同时添加 -v 参数,删除该容器的数据卷,示例代码如下:
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

以上示例在删除容器时添加了 -v 参数,数据卷也同时被删除,清理了无用的数据卷,节省了磁盘空间。
创建容器时,在命令中添加 --rm 参数,终止容器时会自动删除容器及数据卷,示例代码如下:
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

以上示例在创建容器命令中添加了 --rm 参数,并执行了该命令。
下面通过另一个终端查看宿主机的挂载目录,示例代码如下:
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

上述示例中,容器创建成功,数据卷目录也挂载成功。
下面通过 exit 命令退出终端,并再次查看宿主的挂载目录,示例代码如下:
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

以上示例中,使用 exit 命令退出容器之后,数据卷也被删除。
命令管理 Docker 中有专门的容器数据卷命令供用户来管理容器数据卷。下面通过示例介绍容器数据卷命令的一些参数。
  • create
创建数据卷。
示例代码如下:
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

以上示例中通过在 docker volume 命令中添加 create 参数,创建出了命名为 test 的新容器数据卷。
  • ls
列出数据卷。
示例代码如下:
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

以上示例通过 docker volume 命令添加 ls 参数查看数据卷,可以看到刚刚创建的test数据卷。
另外,在宿主机的挂载目录中也可以查看数据卷信息,示例代码如下:
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

上述示例通过宿主机挂载目录查看容器数据卷,与数据卷目录下查看到的结果相同。
  • inspect
显示一个或多个数据卷的详细信息。
首先创建一个容器,并为其挂载刚刚创建的容器数据卷,示例代码如下:
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

以上示例将刚刚创建的容器数据卷 test 作为新容器 test-container 的数据卷,
也就是将 test 数据卷在宿主机上的目录 /var/lib/Docker/volumes/test/_data 挂载到容器内的 /volume 中。
接着,通过命令查看容器 test-container 的数据卷信息,示例代码如下:
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

上述示例通过查看容器挂载信息得知容器 test-container 成功挂载 test 数据卷。
另外,还可以在宿主机中使用 docker inspect 命令查看指定数据卷的信息,示例代码如下:
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

  • rm
删除一个或多个数据卷。
首先将容器停止并删除,再查看数据卷信息,示例代码如下:
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

以上示例中,容器 test-container 已经被删除,但数据卷 test 仍然存在。
下面通过在命令中添加 rm 参数对数据卷 test 进行删除并查看数据卷信息,示例代码如下:
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

以上示例中,数据卷被成功删除。
  • prune
删除所有未被使用的数据卷。
在前面的示例中可以看到,本地残留了一些未被使用的数据卷,用户可以使用一条命令将其删除。示例代码如下:
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

以上示例通过命令删除了三个未使用的数据卷,释放了 33B 的空间。
在执行命令时,Docker 会询问是否要删除没有被使用的数据卷,如果确定,在终端输入"y" 即可,否则输入"N"。
下面查看数据卷是否被成功删除,示例代码如下:
「云原生的进阶之路」|【Docker 那些事儿】容器数据卷的妙手
文章图片

从以上示例中可以看到,没有被使用的数据卷已经被成功删除,本地没有数据卷。
3. 总结
这两篇篇文章详细全面地讲解了:

使用 Docker 数据卷长久存储容器数据、以 Docker 容器作为容器数据卷、备份 Docker 数据卷中的数据、恢复 Docker 容器数据以及迁移和删除 Docker 容器数据卷等数据卷相关知识。

相信大家已经可以熟练运用容器数据卷技术。

    推荐阅读