Docker容器数据卷与数据共享持久化

本文涉及的产品
可视分析地图(DataV-Atlas),3 个项目,100M 存储空间
简介: Docker容器数据卷与数据共享持久化

【1】Docker容器数据卷

Docker的理念:


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

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


为了能保存数据在docker中我们使用数据卷,主要为了容器的持久化与容器间继承+共享数据(主机和容器数据共享)。


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


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


数据卷特点:

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

【2】命令添加数据卷

在容器内添加数据卷主要有两种方式:直接V命令添加和DockerFile添加


① 命令添加数据卷实例

命令如下:

 docker run -it -v /宿主机绝对路径目录:/容器内目录      镜像名
 #如docker run -it -v /宿主机目录:/容器内目录 centos /bin/bash
 docker run -it -v /myDataVolume:/dataVolumeContainer centos /bin/bash


② 查看数据卷是否挂载成功

docker inspect 容器ID

如下图红箭头标识,容器内部已经标记了数据卷对应宿主目录:

③ 容器和宿主机之间数据共享

如下所示在容器内/dataVolumeContainer目录创建文件。

容器内操作如下:

[root@a35e55bafcab dataVolumeContainer]# echo "i'm a container " > test.txt
[root@a35e55bafcab dataVolumeContainer]# ls
test.txt
[root@a35e55bafcab dataVolumeContainer]# cat test.txt
i'm a container

宿主机操作如下(宿主机追加内容到test.txt):

[root@localhost ~]# cd /myDataVolume/
[root@localhost myDataVolume]# ll
total 4
-rw-r--r--. 1 root root 17 Feb 12 11:46 test.txt
[root@localhost myDataVolume]# cat test.txt
i'm a container
[root@localhost myDataVolume]# echo "host update" >> test.txt
[root@localhost myDataVolume]# cat test.txt
i'm a container
host update


无论是容器还是宿主机,都可以看到文件修改后的内容,说明二者之间数据是共享的。


④ 容器停止退出后,主机修改后数据同步

验证步骤:


  • 容器先停止退出
  • 主机修改test.txt
  • 容器重启进入
  • 查看主机修改的test.txt


主机操作:

[root@localhost myDataVolume]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost myDataVolume]# echo "host update again" >> test.txt
[root@localhost myDataVolume]# cat test.txt
i'm a container
host update
host update again


容器操作:

[root@localhost /]# docker start a35e55bafcab
a35e55bafcab
[root@localhost /]# docker exec -it a35e55bafcab  /bin/bash
[root@a35e55bafcab /]# cd /dataVolumeContainer/
[root@a35e55bafcab dataVolumeContainer]# cat test.txt
i'm a container
host update
host update again //这里标明容器看到了主机修改的内容

⑤ 设置目录权限

##ro表示read only 即容器内的数据只允许读
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

⑥ 宿主与容器数据卷文件同步实验


宿主机创建文件,查看容器内会发现有文件,容器内删除文件会导致宿主机文件也被删除。

容器创建文件,查看宿主机同步目录发现有文件,宿主机删除文件会导致容器内同步目录文件也被删除。


【3】DockerFile添加数据卷

这里以一个实例来说明。


① 根目录下新建mydocker文件夹并进入

mkdir /mydocker
cd /mydocker

② 在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷

格式如下:

VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]

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

构建File:

[root@localhost /]# cd /mydocker/
[root@localhost mydocker]# ll
total 0
[root@localhost mydocker]# vim DockerFile

文件内容如下:

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

③ build后生成镜像

命令如下:

docker build -f DockFile路径 -t 镜像名 .[这里有个.不可少,标明在当前目录下面]

实例如下(注意当前在/mydocker路径下,命令最后面有个.):

docker build  -f /mydocker/DockerFile -t jane/centos  .

使用docker images检测如下:


④ 创建新的容器并运行

docker run -it b3a32e0a2930 /bin/bash

⑤ 查看容器目录对应的主机目录

首先检测运行的容器:

docker ps

使用命令查看容器内部情况:

docker inspect 9ae9239b6cf7
 "Volumes": {
        "/dataVolumeContainer1": "/var/lib/docker/volumes/8ebcee3e258a367b2869c326bc7c032b544e061830490ce866ef6a72299a6999/_data",
        "/dataVolumeContainer2": "/var/lib/docker/volumes/396815bd66ac143ed2bff3f2ad8ac6439116d5fbbae53327c52b883eb6ec6d6a/_data"
    },
    "VolumesRW": {
        "/dataVolumeContainer1": true,
        "/dataVolumeContainer2": true
    }

使用命令在容器内创建文件,然后在宿主机对应目录查看:

Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied。解决办法:在挂载目录后多加一个--privileged=true参数即可


【4】数据卷容器

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


① 查看此时镜像与容器概况

② 先启动一个父容器dc01

docker run -it --name dc01 jane/centos

检测如下:

在容器dc01 内部/dataVolumeContainer2/路径下创建文件dc01.txt:

[root@41ad254d8e05 /]# cd dataVolumeContainer2/
[root@41ad254d8e05 dataVolumeContainer2]# touch dc01.txt
[root@41ad254d8e05 dataVolumeContainer2]# ls
dc01.txt


③ 创建容器dc02、dc03并继承自dc01

#继承自某个容器--volumes-from 容器名/容器ID
docker run -it --name dc02 --volumes-from dc01 jane/centos

然后同样在容器dc02的/dataVolumeContainer2/路径下创建文件:

[root@a5f21105d3e7 /]# cd dataVolumeContainer2/
[root@a5f21105d3e7 dataVolumeContainer2]# ls
dc01.txt
[root@a5f21105d3e7 dataVolumeContainer2]# touch dc02.txt
[root@a5f21105d3e7 dataVolumeContainer2]# ls
dc01.txt  dc02.txt

dc03操作同上:

[root@[root@localhost myDataVolume]# docker run -it --name dc03 --volumes-from dc01 jane/centos
[root@132abc66899c /]# cd dataVolumeContainer2/
[root@132abc66899c dataVolumeContainer2]# ls
dc01.txt  dc02.txt
[root@132abc66899c dataVolumeContainer2]# touch dc03.txt
[root@132abc66899c dataVolumeContainer2]# ls
dc01.txt  dc02.txt  dc03.txt

④ 返回查看容器dc01

检测此时容器运行概况:

检测容器dc01路径dataVolumeContainer2概况(会发现多了dc02.txt dc03.txt):


⑤ 删除dc01然后分别在dc02/dc03下查看dataVolumeContainer2路径

#进入dc02
docker exec -it a5f21105d3e7  /bin/bash
#进入dc03
docker exec -it 132abc66899c  /bin/bash

可以看到尽管dc01容器已经删除了dc01.txt,但是dc02/dc03容器下还有dc01.txt


⑥ dc02新增数据然后删除dc02再进入dc03查看

dc02下操作:

[root@a5f21105d3e7 /]# cd dataVolumeContainer2
[root@a5f21105d3e7 dataVolumeContainer2]# ls
dc01.txt  dc02.txt  dc03.txt
#新增数据
[root@a5f21105d3e7 dataVolumeContainer2]# touch dc02_update.txt
[root@a5f21105d3e7 dataVolumeContainer2]# ls
dc01.txt  dc02.txt  dc02_update.txt  dc03.txt
[root@a5f21105d3e7 dataVolumeContainer2]# [root@localhost ~]#
#删除dc02容器
[root@localhost ~]# docker rm -f a5f21105d3e7
a5f21105d3e7

dc03下操作:

[root@localhost ~]# docker exec -it 132abc66899c  /bin/bash
[root@132abc66899c /]# cd dataVolumeContainer2
[root@132abc66899c dataVolumeContainer2]# ls
dc01.txt  dc02.txt  dc02_update.txt  dc03.txt

可以发现尽管dc02与dc03无继承关系,但是已经建立了共享关系,故而dc02删除后,dc03仍然可以拿到dc02创建的文件。

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

问题:


  • 如果两个独立的容器映射了同一个主机目录会怎样?
  • 如果dc01 dc02 dc03三个没有关系还会出现上面的实验情况吗?
相关实践学习
DataV Board用户界面概览
本实验带领用户熟悉DataV Board这款可视化产品的用户界面
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3 )前置知识要求   课程大纲 第一章 了解数据仓库概念 初步了解数据仓库是干什么的 第二章 按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章 数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章 采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章 用户行为数据仓库 严格按照企业的标准开发 第六章 搭建业务数仓理论基础和对表的分类同步 第七章 业务数仓的搭建  业务行为数仓效果图  
目录
相关文章
|
17天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
156 77
|
25天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
3天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
28 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
9天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
29 3
实战~如何组织一个多容器项目docker-compose
|
18天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
60 3
|
25天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
65 7
|
25天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
32 5
|
25天前
|
开发框架 安全 开发者
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。本文探讨了 Docker 在多平台应用构建与部署中的作用,包括环境一致性、依赖管理、快速构建等优势,以及部署流程和注意事项,展示了 Docker 如何简化开发与部署过程,提高效率和可移植性。
54 4
|
25天前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
58 3
|
25天前
|
存储 安全 数据中心
Docker 容器凭借轻量级和高效的特性,成为应用部署的重要工具
Docker 容器凭借轻量级和高效的特性,成为应用部署的重要工具。本文探讨了 Docker 如何通过 Namespace 和 Cgroups 实现 CPU、内存、网络和存储资源的隔离,提高系统安全性和资源利用率,以及面临的挑战和应对策略。
43 1