Docker学习笔记:数据卷

本文是自己的学习笔记

1、数据卷基本概念

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

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

特点:

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

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

2、数据卷示例

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

docker run -it -v /root/dockerfile1:/root/docker1 centos。v表示创建数据卷的映射,/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目录下共享数据了。

相关推荐
Go Work1 小时前
docker 占满根分区时先分清谁在吃盘
经验分享·笔记
3095566662 小时前
股票接口返回 404 与空数组的排查笔记:证书状态与级别参数
java·笔记·python·ios·iphone·股票数据api·股票数据接口
蒸蒸yyyyzwd2 小时前
从邓明学习的后端笔记
笔记·学习
岑梓铭2 小时前
《考研408数据结构》第八章(排序)复习笔记
数据结构·笔记
机器学习之心2 小时前
基于变量相关图与残差学习的 GCN 多变量回归方法——混凝土 28 天抗压强度预测
学习·回归·gcn
Rabitebla15 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
Gary移动存储固件15 小时前
eMMC5.1协议中文学习讲解(6.6.17~6.6.22.4.6)
学习·ufs·emmc·nand·存储固件
一个天蝎座 白勺 程序猿16 小时前
别让收藏夹替你学习:我搭AI知识体系的完整方法,脚本直接拿去用
人工智能·学习·ai·ai学习
java_logo17 小时前
Docker 部署 DeepSeek Harness(moelin):轻松搭建带登录的本地 AI Agent 平台
运维·docker·容器·ai agent·deepseek·harness·轩辕镜像
楚山之石17 小时前
【Nat Biomed Eng】Connectome 2.0 超高梯度扫描仪:500 mT/m 与 600 T/m/s 把活体人脑微观结构分辨推进到亚微米级
图像处理·学习·数据分析·mri