Docker从入门到应用(五):Docker容器数据卷

是什么

顾名思义,容器数据卷即Docker用于存放数据的卷;Docker将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求是能够持久化存储的,同时希望不同容器之前能够共享数据

Docker容器产生的数据,如果不通过docker commit成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除之后,数据自然也就没有了,为了能够保存数据,在容器中我们使用卷

容器数据卷的特点

卷就是目录或者文件,存在于一个或者多个容器中,由Docker挂在到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。卷的设计目的就是为了持久化,完全独立于容器的生命周期,因此,Docker不会在容器删除时删除其挂载的数据卷

特点

  • 数据卷可在容器之间共享或重用数据
  • 卷中的更改可以直接生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止

容器添加数据卷

容器数据卷可以通过命令添加,也可以通过DockerFile添加,关于DockerFile相关介绍将在下一章讲解

命令添加

命令docker run -it -v /宿主机目录:/容器内目录 镜像ID或名称:tag

创建一个默认的centos容器,docker run -it centos创建并启动centos容器,容器运行后查看目录,为默认文件结构

image-20220724142216111

通过命令添加 -v参数配置容器数据卷,docker run -it --name reel_centos -v ~/reelHostTest:/reelDokcerTest centos

image-20220724142743889

分别在主机目录和Docker容器内目录下新创建的两个文件夹,说明容器在启动时会自动创建数据卷文件夹,此时可以通过 docker inspect 容器ID 查看容器内部细节查看数据卷是否挂载成功

image-20220731145040459

数据卷挂在成功,RW为true, 即具有读写权限

在容器内reelDockerTest目录下新建a.log文件,测试数据共享,查看主机对应目录下是否存在该文件,容器内创建文件

image-20220724145028415

创建后宿主机中存在相同文件

image-20220724145113001

修改主机中文件内容,查看容器中是否修改

image-20220724145414169

容器中文件内容已同步修改,说明主机与容器中存在数据共享

image-20220724145536249

容器停止退出后,主机修改数据查看数据是否同步

先停止容器退出,主机修改文件

image-20220724145953660

重新启动容器,数据卷中文件内容已同步修改

image-20220724150127112

文件只读权限

通过 -v 参数添加的数据卷默认容器具有读写命令,可以添加RO限定只读

image-20220731145701540

如图,ReadOnly权限下,容器无法在该文件夹目录下新增文件,docker inspect 查看容器内部信息,此时的 "RW":false

image-20220731145931428

在主机该目录下添加文件readOnly.txt文件,切换至容器中查看

image-20220731150451576

容器中存在该文件,可以正常读取但无法被修改,修改文件提示 E45: ‘readonly’ option is set (add ! to override)

image-20220731150737302

通过DockerFile 添加数据卷

DockerFile是什么

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。DockerFile定义了进程需要的一切东西,DockerFile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和系统内核进程打交道,这时需要考虑如何设计namespace的权限控制)等,简单来说通过DockerFile可以构建出我们锁需要的镜像。DokcerFile的详细介绍将在下一章讲解

主机中添加DockerFile文件并构建镜像

创建DockerFile文件,文件中添加以下测试内容,其中 VOLUME 指令用于给镜像添加一个或多个数据卷

# volume test
FROM centos
VOLUME ["/dockerFile1","/dockerFile2"]
CMD echo "finished,--------success1"
CMD /bin/bash

  • **说明:**出于可移植和分享的考虑,-v 主机目录:容器目录这种方法不能直接在Dockerfile中实现由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。

docker build 命令构建镜像 docker build -f DockerFile文件地址 -t 镜像名称:tag . **注意结尾的 .**号不可省略(猜测应该是Docker引擎中镜像存储的目录)

image-20220731204419707

新建并启动容器,查看容器目录,dockerFile1与dockerFile2均创建,数据卷绑定成功

image-20220731204614629

通过命令添加容器数据卷时,需要指定主机中数据卷文件目录与容器中数据卷文件目录,容器中的文件最终还是存储在主机磁盘中的,那么,通过DockerFile创建的数据卷对应的主机中的文件目录在什么位置呢?Docker inspect 命令查看容器内部细节,确认数据卷在主机中的位置

image-20220801005952426

切换至对应目录下,查看dockerFile1 与dockerFile2 是否创建image-20220801005141716

切换至docker目录时提示没有权限,可以在运行容器时加入 --privileged=true即可,或授予用户访问权限

1. sudo chmod -R 777 /var/lib/docker/

2. docker run -it --privileged=true  --name privilegedtest -d ac9c738661da

image-20220801011834065

进入文件夹后创建文件,检验容器中同步情况

image-20220801010140776

文件数据同步成功image-20220801010231649

数据卷容器

是什么

命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。

容器间传递共享(–volumes-from)

已我们刚刚构建的镜像为例,先启动父容器df1, 在dockerFile1目录下创建文件aa.txt

image-20220807134832682

启动df2、df3容器继承自df1 容器 主要命令 --volumes-from,在df2与df3容器分别添加aa2.txt与aa3.txt文件

image-20220807135130852

进入df1容器,aa2.txt 与 aa3.txt文件均已同步。删除df1容器,进入df2容器,df1创建的文件aa.txt存在且可以修改

image-20220807135817611

再删除df2容器,访问df3,文件可以正常访问

image-20220807140002467

基于df3再创建df4容器后删除df3,文件能够正常访问

image-20220807140305350

**结论:容器数据卷用于容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止 **

猜你喜欢

转载自blog.csdn.net/Hong_pro/article/details/126210736