Docker学习笔记:数据卷

本文是自己的学习笔记

1、数据卷基本概念

数据卷就是docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷。简单来说,容器卷就相当于Redis中持久化方式的RDB和AOF。

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

特点:

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

使用数据卷时会建立容器目录到宿主机目录的映射。之后容器只需要在这个目录保存文件,那对应的宿主机目录也会保存这个文件,即使容器关闭宿主机依然可以在对应的目录中访问修改这些文件。

2、数据卷示例

这里给一个直接使用数据卷的示例,我们在启动一个centos时创建一个数据卷。

docker run -it -v /root/dockerfile1:/root/docker1 centosv表示创建数据卷的映射,/root/dockerfile1是机器上的地址;/root/docker1是容器中的地址。

这个指令会启动容器并创建数据卷,容器中root/docker1的地址映射到宿主机的root/dockerfile1。我们在root/docker1写入修改文件时,同样的修改会体现在宿主机的/root/dockerfile1,反之亦然。

即使容器关闭后其在/root/docker1下存储的文件也不会消失,这就实现了容器数据的持久化。

比如我在容器中/root/docker1创建一个文件hello.txt,那主机的/root/dockerfile1也会出现这个文件。

我在主机中删除hello.txt,那容器中的这个文件也会被删除。

3、数据卷的权限控制

创建数据卷时默认权限是双向的,即宿主机和容器都有写权限。

我们可以根据需要管理权限,只需要在映射后面加:和权限。

比如下面的指令中,容器只有只读权限。

docker run -it -v /root/dockerfile1:/root/docker1:ro centos

ro就表示read only

这里的权限控制是指对容器的权限控制,宿主机毫无疑问对所有文件有所有的权限。

权限控制只有两个选项,一个是ro,一个是默认的rw

4、数据卷的创建方式

  1. 在启动容器时通过指令创建:docker run -it -v /root/dockerfile1:/root/docker1 centos
  2. 通过脚本创建:我们先创建一个脚本文件名叫docker1,其中的内容如下
bash 复制代码
FROM centos
VOLUME ["/root/dataVolumeContainer1","/root/dataVolumeContainer2"]
CMD echo "finished,-----success1"
CMD /bin/bash

脚本中在容器中设置了两个数据卷目录,宿主机的目录没有设置但是启动容器后可以查看。

指定脚本启动容器。

bash 复制代码
docker build -f docker1 -t centos .

启动成功后查看容器的配置,获取宿主机的目录映射

bash 复制代码
docker inspect cec

然后可以就可以看到宿主机的映射目录。

这个方式可以配置多个目录,同时他是动态的设置宿主机的目录,避免了换机器上时因目录权限不够等原因创建容器灰白的情况。

5、数据卷容器

当我们有多个容器的时候,有些场景这些容器之间需要通过数据卷共享数据。

当然,我们可以通过为这几个容器指定相同的宿主机目录实现需求。但并不是一个好方法,如果改变宿主机地址工作量可不小。

这时候最好的方式是使用数据卷容器。简单来说就是启动一个容器挂载数据卷,其他容器只需要挂载这个容器就可以实现数据共享。

挂载数据卷的容器就是数据卷容器。

这里展示一个示例。示例中会建立三个容器,但只有第一个容器指定数据卷,其他两个容器会挂载第一个容器。

首先启动容器,命名为dc01并挂载数据卷。

bash 复制代码
docker run -it -v /root/dockerfile1:/root/docker1  --name dc01 centos

之后启动两个容器并挂载第一个容器。

bash 复制代码
docker run -it --name dc02 --volumes-from dc01 centos
docker run -it --name dc03 --volumes-from dc01 centos

现在这三个容器就可以在/root/docker1目录下共享数据了。

相关推荐
悠哉悠哉愿意2 小时前
【电赛学习笔记】MaixCAM 的OCR图片文字识别
笔记·python·嵌入式硬件·学习·视觉检测·ocr
_Kayo_4 小时前
VUE2 学习笔记5 动态绑定class、条件渲染、列表过滤与排序
笔记·学习
waveee1234 小时前
学习嵌入式的第三十四天-数据结构-(2025.7.29)数据库
数据结构·数据库·学习
帽儿山的枪手5 小时前
docker-image 工具展示更详细镜像层内容
docker
草履虫建模5 小时前
RuoYi-Vue 项目 Docker 容器化部署 + DockerHub 上传全流程
java·前端·javascript·vue.js·spring boot·docker·dockerhub
charlie1145141916 小时前
设计自己的小传输协议 导论与概念
c++·笔记·qt·网络协议·设计·通信协议
xiaoxiaoxiaolll6 小时前
Adv. Sci. 前沿:非零高斯曲率3D结构可逆转换!液晶弹性体多级形变新策略
学习
小醉你真好7 小时前
6、CentOS 9 安装 Docker
linux·docker·centos
xiaoli23277 小时前
课题学习笔记3——SBERT
笔记·学习·nlp·bert
xdpcxq10298 小时前
Docker用Web应用实例深入容器
前端·docker·容器