Docker 容器数据卷与数据卷容器

Docker 容器数据卷与数据卷容器

Author: huyikai

docker

Docker 容器数据卷与数据卷容器

1、什么是容器数据卷

docker 的理念将运行的环境打包形成容器运行,运行可以伴随容器,但是我们对数据的要求是希望持久化,容器之间可以共享数据,Docker 容器产生的数据,如果不通过 docker commit 生成新的镜像,使得数据作为容器的一部分保存下来,那么当容器被删除之后,数据也就没了,为了能够保存数据,在 docker 容器中使用卷。卷就是文件或者目录,存在于一个或者多个容器中,但是不属于联合文件系统,因此能够绕过 Union File System 提供一些用于持久化数据或共享数据的特点。

2、容器数据卷的作用与特性

容器数据卷是一个特殊的文件或者目录,它将主机文件或者目录直接映射进容器中,可供一个或多个容器使用。容器数据卷设计的目的就是为了 数据的持久化,它完全独立与容器的生命周期。因此,容器删除时,不会删除其挂载的数据卷,也不会存在类似的垃圾机制对容器存在的数据卷进行处理。

容器数据卷的特性:

3、容器数据卷的添加

方式一:通过命令添加数据卷

匿名目录挂载

匿名目录挂载只需要写容器内目录或者文件即可,而宿主机对应的目录会在/var/lib/docker/volumes路径下生成

Terminal window
# 以交互模式运行容器,并使用-v 匿名挂载容器数据卷
docker run -it -v 容器内目录/文件的绝对路径[:rw/ro] -p 主机端口:容器端口 --name=容器名称 # 镜像ID/镜像名称[:版本号]
# 以后台方式运行容器,并使用-v 匿名挂载容器数据卷 (推荐)
docker run -d -v 容器内目录/文件的绝对路径[:rw/ro] -p 主机端口:容器端口 --name=容器名称 # 镜像ID/镜像名称[:版本号]
# 注意:如果出现Docker挂载宿主机目录显示cannot open directory .:Permission denied
# 解决办法:在挂载目录后面 多加一个--privileged=true参数即可

案例:使用 centos 容器内的 根目录 (/) 下的 centosVolume 目录 匿名挂载到宿主机中

1.创建并运行 centos 容器,同时匿名挂载数据卷

Terminal window
# 这里没有使用--name=容器名称 去指定容器名称,则docker随机一个容器名称
docker run -it -v /centosVolume centos

2.查看数据卷是否挂载成功

Terminal window
docker inspect 容器ID
具名目录挂载

具名目录挂载相对于匿名目录挂载,就是在宿主机生成对应的目录时可以指定该目录的名称,同样目录也会在/var/lib/docker/volumes 路径下生成。例如:匿名目录挂载生成的对应宿主机目录为 0a4ea838c43ccc9af377af6d2e641b2c9fd4977c4a56408d76d31c8719b9dd8f 一串随机的数字,而具名目录挂载就是可以将这一串随机的数字改成指定的目录名称

Terminal window
# 以交互模式运行容器,并使用-v 具名挂载容器数据卷
docker run -it -v 目录名称:容器内目录/文件的绝对路径[:rw/ro] -p 主机端口:容器端口 --name=容器名称 # 镜像ID/镜像名称[:版本号]
# 以后台方式运行容器,并使用-v 具名挂载容器数据卷 (推荐)
docker run -d -v 目录名称:容器内目录/文件的绝对路径[:rw/ro] -p 主机端口:容器端口 --name=容器名称 # 镜像ID/镜像名称[:版本号]
# 注意:如果出现Docker挂载宿主机目录显示cannot open directory .:Permission denied
#解决办法:在挂载目录后面 多加一个--privileged=true参数即可

案例:使用 centos 容器内的 根目录 (/) 下的 centosVolume 目录 匿名挂载到宿主机中

1.创建并运行 centos 容器,同时匿名挂载数据卷

Terminal window
# 这里没有使用--name=容器名称 去指定容器名称,则docker随机一个容器名称
docker run -it -v hostVolume:/myVolume centos

2.查看数据卷是否挂载成功

Terminal window
docker inspect 容器ID
指定目录挂载

指定目录挂载就是我们可以将容器内部的数据卷指定挂载到宿主机的某一文件或者目录下

Terminal window
# 以交互模式运行容器,并使用-v 挂载容器数据卷
docker run -it -v 宿主机目录/文件的绝对路径:容器内目录/文件的绝对路径[:rw/ro] -p 主机端口:容器端口 --name=容器名称 # 镜像ID/镜像名称[:版本号]
# 以后台方式运行容器,并使用-v 挂载容器数据卷 (推荐)
docker run -d -v 宿主机目录/文件的绝对路径:容器内目录/文件的绝对路径[:rw/ro] -p 主机端口:容器端口 --name=容器名称 # 镜像ID/镜像名称[:版本号]
# 注意:如果出现Docker挂载宿主机目录显示cannot open directory .:Permission denied
# 解决办法:在挂载目录后面 多加一个--privileged=true参数即可

方式二:通过 DockerFile 添加数据卷

案例:在 Host 宿主机的 /root 目录下创建一个 DockerFile 文件 (名称随意),并通过 docker build 指令生成镜像来添加数据卷

1.在 Host 宿主机的 /root 目录下创建一个 DockerFile 文件,并添加如下内容到文件中

Terminal window
#基于centos镜像进行构建
FROM centos
#数据卷只能指定容器数据卷,不能指定宿主机数据卷,英文并不能够保证在所有的宿主机上都存在这样的特定目录。
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
#以 /bin/bash方式启动
CMD /bin/bash

2.使用如下指令,把编写的 DockerFile 文件执行生成镜像,注意:命令最后面是空格 + .

Terminal window
docker build -f 宿主机中DockerFile文件的绝对路径 -t #新镜像名称[:版本号] .

三、数据卷容器

1. 什么是数据卷容器

命名的容器已挂载数据卷,其他的容器通过挂载这个容器(父容器)实现数据共享,挂载数据卷的容器,称为数据卷容器。通过数据卷容器可以实现容器间的数据共享。

2. 添加数据卷容器

Terminal window
docker run -it/-d -p 主机端口:容器端口 --name=容器名称 --volumes-from 数据卷容器ID/数据卷容器名称 # 生成数据卷容器的镜像ID/镜像名称[:版本号]