Docker——容器数据卷

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: Docker——容器数据卷

文章目录:


1.容器数据卷是什么?

2.容器数据卷能干嘛?

3.容器内添加数据卷

3.1 直接使用命令添加

3.2 使用DockerFile添加

4.数据卷容器

1.容器数据卷是什么?


先来看看Docker的理念:
  *  
将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的。
  *  
容器之间希望有可能共享数据。

Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。

为了能保存数据在docker中我们使用卷。(一句话:就是想在docker和宿主机之间实现数据共享,数据持久化。类似于redis中的RDBAOF

2.容器数据卷能干嘛?


卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。(实现容器的持久化、容器之间的继承 + 数据共享)

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

3.容器内添加数据卷


在容器内添加数据卷有两种方式:直接使用命令添加;使用DockerFile添加。


3.1 直接使用命令添加

docker run -it -v/宿主机绝对路径目录:/容器内目录镜像名


此时,宿主机上的myDataVolumedocker特定容器中的dataVolumeContainer,这两个目录就实现了数据共享。

docker中的这个共享目录就可以称为容器卷目录。

可以使用docker inspect 容器ID,查看容器内部细节,可以看到这两个目录已经绑定成功,并且RWread/write,即读写权限)为true


下面,首先在宿主机的 myDataVolume 目录下touch创建一个文件host.txt,然后到dockercentos容器中的 dataVolumeContainer 目录下,ls看到host.txt已经存在了,这说明读权限是共享的。之后vim host.txt向其中写内容,然后touch创建container.txt。再回到宿主机中查看,一样可以cat读取到目录中的文件,当然vim也一样可以,这里忘记写这个命令了。


总之,此时就通过命令创建容器数据卷,进而实现了宿主机与docker容器之间的数据持久化与数据共享。


下面,我们将docker中的容器停止退出(exit是容器停止退出,ctrl + P + Q是容器不停止退出),再看看是否依然是数据共享。

首先exit,然后docker ps可以看到此时已经没有容器实例运行了。

然后到宿主机中,touch创建一个文件,然后vim这个文件向其中写内容。


上面在宿主机中已经添加并且向文件中写了内容,这里先使用docker ps -l查看最近创建运行的容器(也就是刚刚停止的那个centos),然后docker start再次进入这个centos容器实例中,可以看到在共享目录下仍然存在刚刚宿主机中添加的host.txt

结论:容器停止退出之后,宿主机仍然和docker容器保持着数据持久化、数据共享。


下面这张截图写反了,应该先执行第二步,再执行第一步。

首先这个命令与上面的docker run的区别就是,它的后面多了个 :ro,这个ro的意思就是 read only 只读,也就是说此时docker容器中那个共享数据的目录只有读权限,将不再享有写权限了。

这里执行完docker run,先在宿主机中vim host.txt,然后cat可以读取到。回到dockercentos容器实例中,cat依然可以读取到,但是想要touch创建就不行了,因为ro限制你的docker容器只有读权限,没有写权限了。


通过上面的 :ro,只读权限,也可以使用docker inspect 容器ID,查看此时容器内部的细节,RW已经为false了,也就是双方不再共享读取权限。


3.2 使用DockerFile添加

上面说完了使用命令添加容器数据卷的方法,这里再来说一下使用DockerFile添加。

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

首先在宿主机根目录下创建一个mydocker用作测试,在mydocker目录下vim一个Dockerfile,并添加下面第一个红色框中的内容。


然后执行docker build,该命令是从特定的Dockerfile中创建一个新的镜像。执行完毕,可以在最后看到该镜像的ID


docker images就可以看到我们刚刚build的那个新镜像了,此时直接run,使这个新镜像生产一个容器实例来运行。


在上面使用命令添加的时候,我们可以显式的指定出宿主机和docker容器中具体的共享目录。

而此时使用Dockerfile添加,并没有显式的指定出共享目录,那么就使用docker inspect 容器ID,查看该容器的内部细节,进而看到双方的共享目录。


得到宿主机与docker容器各自的共享目录之后,分别cd进入这两个目录,在其中touch创建文件,可以看到同样能够读取到,即实现了数据持久化、数据共享。

docker中的这个共享目录就可以称为容器卷目录。

4.数据卷容器


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

下面测试仍然以Dockerfile文件build的那个镜像为模板,生产三个容器实例运行。


首先以szh/centos为镜像模板,run生产一个dc01容器实例运行,然后进入到dataVolumeContainer2这个容器卷目录,touch一个dc01_add.txt文件。


之后ctrl + P + Q,当前dc01容器不停止退出。


 再次以szh/centos为镜像模板(本是同根生),run生产一个dc02容器实例,与dc01不同的是:此时的dc02是从dc01这个容器中挂在了数据卷。


可以理解为redis中的主从复制,或者是Java中的继承。


dc02容器实例运行之后,也进入到dataVolumeContainer2这个容器卷目录中,touch一个dc02_add.txt文件。

之后ctrl + P + Q,当前dc02容器不停止退出。


下面是dc03,和上面的dc02完全一样,我就不再多说了。


由于我们上面的步骤已经以同一个镜像模板生产了3个容器实例来运行,并且都ctrl + P + Q,这三个容器还未停止运行。

此时我们docker attach再次进入dc01这个容器的数据卷目录下,ls可以看到刚刚在dc02dc03的数据卷目录中创建的那个文件,此时在dc01中也可以读取到。

也即实现了dc01dc02dc03三个容器之间的数据持久化、数据共享,这就是数据卷容器。


下面,我docker rm -fdc01这个容器删除,docker ps可以看到正在运行的容器中已经没有dc01了。

然后我们docker attach进入dc02的数据卷目录中,touch一个dc02_update.txt,然后再进入docker attach进入dc03的数据卷目录中,可以看到刚刚在dc02中创建的那个dc02_update.txt文件,在dc03的数据卷目录中,也读取到了


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

也就是上面删除了dc01,但是还有dc02在使用数据卷目录,所以仍然可以和dc03实现数据持久化、数据共享。

相关实践学习
Github实时数据分析与可视化
基于Github Archive公开数据集,将项目、行为等20+种事件类型数据实时采集至Hologres进行分析,并搭建可视化大屏。
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3 )前置知识要求   课程大纲 第一章 了解数据仓库概念 初步了解数据仓库是干什么的 第二章 按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章 数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章 采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章 用户行为数据仓库 严格按照企业的标准开发 第六章 搭建业务数仓理论基础和对表的分类同步 第七章 业务数仓的搭建  业务行为数仓效果图  
相关文章
|
4天前
|
JSON JavaScript 开发者
Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
【8月更文挑战第7天】Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
|
1天前
|
Docker 容器
|
1天前
|
网络协议 Linux 网络安全
遇到Docker容器网络隔断?揭秘六种超级实用解决方案,轻松让Docker容器畅游互联网!
【8月更文挑战第18天】Docker容器内网络不通是开发者常遇问题,可能因网络配置错、Docker服务异常或防火墙阻碍等原因引起。本文提供六种解决策略:确认Docker服务运行状态、重启Docker服务、检查与自定义Docker网络设置、验证宿主机网络连接、临时禁用宿主机IPv6及检查防火墙规则。通过这些步骤,多数网络问题可得以解决,确保容器正常联网。
9 1
|
3天前
|
安全 Ubuntu Docker
深度挖掘Docker 容器
【8月更文挑战第16天】Docker容器间的连接是容器化技术的关键,支持容器与宿主机的数据交换。主要方法包括:1) 利用Docker网络驱动创建自定义网络,使容器相连通信;2) 采用Docker Compose通过配置文件简化多容器应用的部署与互联;3) 虽不推荐,早期使用--link参数实现容器互联;4) 通过环境变量配置连接信息;5) 共享卷支持文件共享和间接通信。推荐使用Docker网络和Docker Compose以实现高效灵活的容器间通信。
17 3
|
4天前
|
Ubuntu Linux Docker
使用Docker进行容器化:从零开始的技术博文
【8月更文挑战第16天】从零开始掌握Docker容器化技术:本文详细介绍Docker基本概念、安装配置流程及核心组件。涵盖Docker镜像与容器管理、镜像加速配置,以及如何利用Dockerfile自动化构建镜像,助您快速入门并高效运用Docker进行软件开发与部署。
|
17小时前
|
存储 Docker 容器
在Docker中,容器退出后,通过docker ps命令查看不到,数据会丢失么?
在Docker中,容器退出后,通过docker ps命令查看不到,数据会丢失么?
|
4天前
|
Docker 容器
Docker - 网络模式与容器网络互连
Docker的网络模式包括桥接模式、主机模式和覆盖网络模式,以及如何通过Docker的网络操作命令实现容器网络互连。
12 0
|
4天前
|
关系型数据库 MySQL Docker
Docker - 数据卷挂载与目录挂载的区别
Docker中数据卷挂载与目录挂载的区别,包括它们的定义、使用场景和命令差异。
14 0
|
4天前
|
Linux Docker 容器
在CentOS操作系统上使用yum安装/使用/卸载Docker容器引擎
在CentOS操作系统上安装、配置、使用和卸载Docker容器引擎的详细步骤,包括配置Docker镜像加速的方法。
28 0
|
9天前
|
Docker 容器
Docker cp 将宿主机上的文件复制到容器中
Docker cp 将宿主机上的文件复制到容器中
10 0