文章目录
- 数据卷概念
- 数据卷实现机制
- 数据卷特性
- 数据卷操作
- 数据卷挂载通用命令
- 匿名挂载
- 具名挂载
- 数据卷继承
- 容器数据卷只读
- 容器数据卷读写-默认
- 总结
数据卷概念
为了很好的实现
数据保存
和数据共享
,Docker提出了Volume
这个概念,简单的说就是绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。又被称作数据卷
。
数据卷实现机制
创建容器时,将宿主机的目录与容器内的目录进行映射
,可以通过修改宿主机
的某个目录从而去影响容器
,而且这个操作是双向绑定
,容器内的操作也会影响到宿主机,实现备份功能。但是容器被删除的时候,宿主机的内容并不会被删除,因为底层是通过拷贝实现的。如果多个容器挂载的是同一个目录,其中一个容器被删除,其他容器内的数据不会受到影响,同理,底层也是拷贝实现的
数据卷特性
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即使容器被删除
容器和宿主机之间的数据卷属于
引用关系
,数据卷是从外界挂载到容器内部的,所以可以脱离容器的生命周期
而独立存在,正式由于数据卷的生命周期并不等同于容器的生命周期,在容器退出或者删除
以后,数据卷依然不会受到影响
,数据卷的生命周期一直持续到没有容器使用它为止
数据卷操作
数据卷挂载通用命令
创建容器时添加-v
参数,格式为宿主机:容器目录
,例如
sudo docker run -di -v /docker/mysql/data:/usr/local/data --name mysql01 -e MYSQL_ROOT_PASSWORD=root -d mysql
sudo docker run -di -v /docker/mysql/data:/usr/local/data --name mysql02 -e MYSQL_ROOT_PASSWORD=root -d mysql
宿主机在/docker/mysql/data下新增test.txt文件
登陆进入mysql01容器内在/usr/local/data下发现test.txt文件
登陆进入mysql02容器内在/usr/local/data下发现test.txt文件
当我退出,停止,删除容器mysql02时,宿主机上test.txt文件依旧存在
重新启动容器mysql02,在容器mysql02上删除test.txt,宿主机和容器mysql01的test.txt文件也都不存在了
匿名挂载
匿名挂在只需要写容器目录即可,宿主机对应的目录会在/var/lib/docker/volumes
中生成
格式为-v 容器目录
,例如
docker run -di -v /usr/local/data --name mysql01 -e MYSQL_ROOT_PASSWORD=root -d mysql
启动容器后,通过docker inspect mysql01
知道当前容器数据卷的挂载情况
若你使用的是mac系统,它找不到卷目录,可以执行
docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
然后直接可以转入到var/lib/docker/volumes
目录下操作文件即可
具名挂载
具名挂载就是给数据卷起了个名字,容器外对应的目录会在var/lib/docer/volumes
中生成
格式为-v 卷名称:容器目录
,例如:
docker run -di --privileged=true -v docker_mysql_data:/usr/local/data --name mysql03 -e MYSQL_ROOT_PASSWORD=root -d mysql
执行docker volume ls
查看volume数据卷信息,其中docker_mysql_data就是卷名称,其它卷名称都是默认生成的ID号
通过docker volume inspect 数据卷名称
可以查看该数据卷对应宿主机的目录地址
docker volume inspect docker_mysql_data
数据卷继承
若多个容器使用的是相同的数据卷挂载地址,那后续的容器启动时可以选择继承容器的数据卷挂载。使用--volumes-from 数据卷容器
数据卷容器可以是容器的名称,
优势:如果需要创建大量的相同目录映射关系,可以简化命令便于操作和记忆
例如:
先启动mysql01容器,使用-v
指定数据卷的挂载
docker run -di -v /Users/apple/docker/mysql/data:/usr/local/data --name mysql02 -e MYSQL_ROOT_PASSWORD=root -d mysql
执行docker inspect mysql01
查看数据卷挂载
容器mysql02和mysql03使用都是同一个数据卷挂载,可以在启动容器时使用--volumes-from 数据卷容器
指定使用mysql01的数据卷容器,例如
docker run -di --volumes-from mysql01 --name mysql02 -e MYSQL_ROOT_PASSWORD=root -d mysql
指定docker inspect mysql02
查看数据卷挂载
容器数据卷只读
只能通过修改宿主机内容实现对容器的数据管理,执行docker run -it -v /宿主机目录:/容器目录:ro 镜像名
。例如 :
docker run -di -v /Users/apple/docker/mysql/data:/usr/local/data:ro --name mysql01 -e MYSQL_ROOT_PASSWORD=root -d mysql
容器数据卷读写-默认
宿主机和容器双向操作数据,执行docker run -it -v /宿主机目录:/容器目录:rw 镜像名
或者docker run -it -v /宿主机目录:/容器目录 镜像名
例如 :
docker run -di -v /Users/apple/docker/mysql/data:/usr/local/data:rw --name mysql02 -e MYSQL_ROOT_PASSWORD=root -d mysql
总结
数据卷是Docker容器提出来概念,目的是用来持久化容器的数据,存在于宿主机上,独立于容器的生命周期,不会在容器删除后删除数据。Docker提供的数据卷挂载方式很多,可以通过具名挂载,匿名挂载或者数据卷继承方式等,同样可以指定容器目录的可读可写权限,若只可读即只能通过宿主机进行数据管理