Docker官方起步指南学习笔记③——数据持久化之Volume

Docker官方起步指南学习笔记③——数据持久化之Volume

九月 13, 2019
当前设备屏幕尺寸过小,推荐使用PC模式浏览。

本学习笔记 Base on ——

Manage data in >Docker<


数据持久化

一个常见的应用将由两部分组成:控制数据。Docker中的数据持久化将由Daemon实现和进行控制,数据卷的生命周期与容器/镜像无关。
为此,Docker引入数据卷的概念。与直接在容器中(例如数据库)写入数据数据不同,数据卷(VOLUME)和数据挂载(BIND MOUNT)的引入将有效地解决以下问题:

  • 数据的共享问题/
  • 将数据与容器、宿主机解除耦合,让开发者像使用U盘一样移动数据。
  • 提升数据的读写性能(>参考资料<)。

VOLUME 和 BIND MOUNT 的区别

  • 数据卷 (VOLUME)将文件存放在宿主机的指定位置,是Docker系统中最佳的数据保存方式。
  • 挂载 (BIND MOUNT)可以将文件存放在宿主机的任意位置上,非Docker进程可以任意修改这些数据(而VOLUME方式则不可以)。
  • PS:临时挂载(TMPFS MOUNT)的数据挂载方式,其只把数据写入Memory中而不访问宿主机的文件系统,通过>Swarm<等方式进行数据与容器的挂载。

types-of-mounts


VOLUME 的使用

参考指南>地址<

数据卷容器

为了方便数据的迁移、备份,常常制作用于存放数据的数据卷容器。其一般只是用数据库映像,且永不使用docker run运行该映像。

数据卷容器 就像一个容器,但数据卷容器只存放数据而不部署、运行任何业务应用,允许其它映像的实例容器进行挂载和使用。

创建、查看和管理一个数据卷

创建一个数据卷并列出其信息:

1
2
3
docker volume create my-vol
docker volume ls
docker volume inspect my-vol

移除该数据卷:

1
docker volume rm my-vol

挂载第一个与容器生命周期无关的数据卷

Alpine 系统是一个基于BusyBox的Linux系统,其大小只有5mb左右,其开发者现已加入docker公司,有望称为Docker的默认基准映像。

  1. 首先,我们在Shell的根目录下创建一个文件夹vol。并在其中创建任意一个test.txt文件,其中包含若干字符。(对于windows用户,该根地址应为C:\Users\用户名\,此时应将C盘设为Shared Drive[在Setting-Shared Drives中设置])
  2. 拉取alpine映像。但我们此处将依靠docker run指令,在拉取映像的同时执行容器。即下面这段指令:
1
docker run -dit --name=testImage -v ~/vol:/container_vol alpine

该指令包含:

  • -d 后台静默模式启动
  • -i 交互模式
  • -t 分配独立的TTY,避免多终端干扰
  • -v 为容器挂载数据卷
  • –name 容器实例的名字

Tips:当指令的可选项不带任何参数时,可以缩略,如-dit
注意:-v 后的地址必须全部为绝对地址

其中,-v指令将容器内的container_vol文件夹向宿主机的vol文件夹作映射,此后该文件夹就成为与容器生命周期无关的数据卷。

-v host_dir:/container_dir

  1. 进入容器,并查看相关数据:
1
docker exec -it testImage sh
1
2
3
cd /container_vol 
ls
cat test.txt

终端将输出宿主机中test.txt中的字符。

  1. 尝试用exit退出容器,并关闭、重启容器:
1
2
3
4
exit
docker stop testImage
docker rm testImage
docker run -dit --name=testImage -v ~/vol:/container_vol alpine
  1. 可以发现test.txt文件依旧可以读取,而不会随着容器关闭而消失。(此时可以尝试在非数据卷目录下进行mkdir任意文件,容器重启后该文件将消失)。

Tips:指令docker volume rm $(docker volume ls -q)可以快速移除所有注册过的数据卷。