一、容器数据卷是什么
- Docker 容器产生的数据,如果不通过 docker commit 生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了
- 为了能保存数据,在 docker 中我们使用卷
二、容器数据卷能干嘛
- 卷就是目录或文件,存在于一个或多个容器中,由 docker 挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System 提供的一些用于持续存储或共享数据的特性,卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此 Docker 不会在容器删除时删除其挂载的数据卷
- 特点:
(1) 数据卷可在容器之间共享或重用数据
(2) 卷中的更改可以直接生效
(3) 数据卷中的更改不会包含在镜像的更新中
(4) 数据卷的生命周期一直持续到没有容器使用它为止
三、数据卷
1、直接命令添加
-
命令
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
eg:
docker run -it -v /myHostData:/myContainerData centos:6.8
-
查看数据卷是否挂载成功
docker inspect 容器ID
查看容器内部细节,会显示如下内容:
-
容器和宿主机之间数据共享:在主机这边目录下创建一个 hello.txt 文件,写上 host first update,然后在容器这边可以看得到该文件,且内容也是 host first update
-
当容器停止退出后,主机修改数据之后,容器重新启动,内容会同步更新
-
命令(带权限)
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
eg:
docker run -it -v /myHostData:/myContainerData:ro centos:6.8
再次查看内部细节显示如下,此处的 false 表示只读,不可写,此时只能由宿主机来进行写操作,容器只有读的权限
2、DockerFile 添加
- 根目录下新建 mydocker 文件夹并进入
mkdir mydocker cd mydocker
- 可在 DockerFile 中使用 VOLUME 指令来给镜像添加一个或多个数据卷
由于可移植性和分享的考虑,用VOLUME["/myContainerData1","/myContainerData2","/myContainerData3"]
-v 主机目录:容器目录
这种方法不能直接在 DockerFile 助攻实现。因为宿主机目录是依赖于特定宿主机的,并不能够保证所有的宿主机都存在这样的特定目录 - File 构建
vim dockerfile # 添加如下内容 #volume test FROM centos:6.8 VOLUME ["/myContainerData1","/myContainerData2","/myContainerData3"] CMD echo "finished,-------success1" CMD /bin/bash
- build 后生成镜像,获得一个新镜像(注意最后的空格和点)
docker build -f /mydocker/dockerfile -t vip/centos:6.8 . # 查看镜像,会发现有一个新镜像 vip/centos:6.8 docker images
- run 容器
docker run -it vip/centos:6.8 # ls 查看,会发现已经有 myContainerData、myContainerData2、myContainerData3 三个文件夹(或容器卷) ls
- 通过上述步骤,容器内的卷目录地址已经知道,对应的主机目录地址在哪?
# 获得 vip/centos:6.8 的容器 ID docker ps # 查出宿主机默认的地址 docker inspect 容器 ID
3、可能出现的问题
- Docker 挂载主机目录 Docker 访问出现
cannot open directory .: Permission denied
- 解决办法:在挂载目录后多加一个
--privileged=true
参数即可,eg:docker run -it -v /myHostData:/myContainerData --privileged=true 镜像名
四、数据卷容器
- 是什么
命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器 - 容器间传递共享(–volumes-from)
# 创建一个容器 dc01 并运行 docker run -it --name dc01 vip/centos:6.8 # 进入该共享文件夹 cd myContainerData2 # 新建文件 touch dc01_add.txt # 容器 dc02 继承自 dc01 docker run -it --name dc02 --volumes-from dc01 vip/centos:6.8 # 查看该共享文件夹,存在文件 dc01_add.txt ls myContainerData2
- 容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止