本学习笔记 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<等方式进行数据与容器的挂载。
VOLUME 的使用
参考指南>地址<
数据卷容器
为了方便数据的迁移、备份,常常制作用于存放数据的数据卷容器。其一般只是用数据库映像,且永不使用
docker run
运行该映像。
数据卷容器 就像一个容器,但数据卷容器只存放数据而不部署、运行任何业务应用,允许其它映像的实例容器进行挂载和使用。
创建、查看和管理一个数据卷
创建一个数据卷并列出其信息:
docker volume create my-vol
docker volume ls
docker volume inspect my-vol
移除该数据卷
docker volume rm my-vol
挂载第一个与容器生命周期无关的数据卷
Alpine 系统是一个基于BusyBox的Linux系统,其大小只有5mb左右,其开发者现已加入docker公司,有望称为Docker的默认基准映像。
- 首先,我们在Shell的根目录下创建一个文件夹
vol
。并在其中创建任意一个test.txt
文件,其中包含若干字符。(对于windows用户,该根地址应为C:\Users\用户名\
,此时应将C盘设为Shared Drive[在Setting-Shared Drives中设置]) - 拉取alpine映像。但我们此处将依靠
docker run
指令,在拉取映像的同时执行容器。即下面这段指令:
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
- 进入容器,并查看相关数据:
docker exec -it testImage sh
cd /container_vol
ls
cat test.txt
终端将输出宿主机中test.txt
中的字符。
- 尝试用
exit
退出容器,并关闭、重启容器:
exit
docker stop testImage
docker rm testImage
docker run -dit --name=testImage -v ~/vol:/container_vol alpine
- 可以发现test.txt文件依旧可以读取,而不会随着容器关闭而消失。(此时可以尝试在非数据卷目录下进行
mkdir
任意文件,容器重启后该文件将消失)。
Tips:指令
docker volume rm $(docker volume ls -q)
可以快速移除所有注册过的数据卷。