目录
2 容器挂载宿主机中的任意文件(bind mounts方式)
1 数据卷概述
数据卷就是宿主机中的一个目录或一个文件,数据卷的作用如下:
- 容器数据持久化,即使容器被删除了,数据卷还在
- 客户端和容器进行数据交换
- 容器之间进行数据交换
2 容器挂载宿主机中的任意文件(bind mounts方式)
容器挂载数据卷,实际上就是确定宿主机中文件夹和容器中文件夹中的对应关系,这种关系可以是一对一,也可以是一对多,也可以是多对一。
情况1:一个容器挂载一个数据卷(重要)
- 以“创建完不进入容器命令行”的方式创建容器c1(centos:7),
- 宿主机的文件夹路径为“/root/host_data1”,
- 容器文件夹的位置为:“/root/c1_data”
docker run -di --name=c1 -v /root/host_data1:/root/c1_data centos:7
情况2:一个容器挂载多个数据卷(容器-宿主机路径两两对应即可)
docker run -di --name=c1 -v /root/host_data1:/root/c1_data1 -v /root/host_data2:/root/c1_data2 centos:7
情况3:多个容器挂载一个数据卷
比较笨的写法是:只要把“一个容器挂载一个数据卷”的代码多写几遍就可以了,如下:
docker run -di --name=c2 -v /root/host_data_common:/root/c2_data centos:7
docker run -di --name=c3 -v /root/host_data_common:/root/c3_data centos:7
既然那个数据卷已经固定了,那么每次创建容器的时候就没必要总去把那个数据卷的绝对路径写出了!
于是我们可以将容器c3作为一个数据卷容器,让c3去挂载宿主机中的数据卷,然后c1、c2可分别挂在到c3上,实现了c1、c2间接挂载数据卷的目的。如下图:
具体步骤
(1)先创建容器c3,作为数据卷容器,挂载宿主机
docker run -di --name=c3 -v /root/host_data1:/root/c3_data centos:7
(2)再创建容器c1,挂载数据卷容器c3
docker run -di --name=c1 --volumes-from c3 centos:7
(3)再创建容器c2,挂载数据卷容器c3
docker run -di --name=c2 --volumes-from c3 centos:7
注意:在创建容器c1、c2的时候并没有指定c1、c2用于挂载c3所对应的文件目录,但是由于c3在挂载的时候已经指定好了具体要挂载宿主机所对应的目录,那么容器c1、c2在同样的目录下就自动创建了对应的文件目录!
此外注意:
- 查看容器挂载数据卷的位置(Mounts键所对应值中的路径):docker inspect 容器id
- 经过测试,2、3两种方式都有会出现同样的现象:如果在创建容器时,容器中的路径不为空,那么宿主机中的数据卷会把容器中目标目录下的原始文件隐藏(即目标目录会与原始目录(数据卷)保持一致)
3 容器挂载指定目录下的数据卷(volumes方式)
注意:以下创建数据卷并绑定的方式,是Docker管理的数据卷,所以通过以下方法创建的数据卷都会放在指定的Docker目录下:/var/lib/docker/volumes,而2中的方式数据卷是可以在宿主机任意位置指定的,那种方式虽然更灵活,但是终归要指定一个路径出来,而下面的方式只需要给数据卷起个名字就可以使用了。
管理数据卷
- 创建数据卷:docker volume create 数据卷名字
- 列出所有数据卷:docker volume ls
- 查看某个数据卷:docker volume inspect 数据卷名字
- 查看容器挂载数据卷的位置(Mounts键所对应值中的路径,同上):docker inspect 容器id
用数据卷创建容器(和2中的方式很类似,只不过文件的位置不用自己指定了)
- 创建容器并绑定数据卷:docker run -id --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx:1.16
- 创建容器时如果数据卷不存在,会自动创建(所以感觉没必要单独先创建数据卷)
清理(停止容器、删除容器、删除数据卷)
- docker stop 容器名
- docker rm 容器名
- docker volume rm 数据卷名字