【云原生 | 18】Docker数据卷及卷的持久化问题

简介: Docker 镜像由多个只读层叠加而成,启动容器时,Docker 会加载只读镜像层并在镜像栈顶部添加一个读写层>,如果运行中的容器修改了现有的一个已经存在的文件,那么该文件将会从读写层下面的的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,次即“写时复制”机制...............

作者简介:🏅云计算领域优质创作者🏅新星计划第三季python赛道TOP1🏅 阿里云ACE认证高级工程师🏅

✒️个人主页:小鹏linux

💊个人社区:小鹏linux(个人社区)欢迎您的加入!


目录

1. 数据卷特性

2. docker管理卷(默认挂载)

3. 自管理卷(手动挂载)实验

4. 容器中的数据卷

5.卷的持久化问题

6.Docker卷的持久化问题


1. 数据卷特性

1.1 认识数据卷特性

Docker 镜像由多个只读层叠加而成,启动容器时,Docker 会加载只读镜像层并在镜像栈顶部添加一个读写层

> 如果运行中的容器修改了现有的一个已经存在的文件,那么该文件将会从读写层下面的的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,次即“写时复制”机制

image.gif

1.2 数据卷意义

关闭并重启容器,其数据不受影响;但删除 Docker 容器,则其改变将会全部丢失

        > 存在的问题

                   >> 存在于联合文件系统中,不易于宿主机访问

                   >> 容器间数据共享不便

                   >> 删除容器其数据会丢失

        > 解决方案:“卷”

                   >> “卷”是容器上的一个或多个“目录”,此类目录可绕过联合文件系统,与宿主机上的某目录“绑定”

1.3 数据卷结构

Bind mount volume

> Docker-managed volume

image.gif

image.gif

Volume可以是物理机上的任何一个目录

存储服务方式有很多种,如NFS,MFS等,容器数据共享时需要对接到的文件系统或客户端接口都是不一样的,此时需要CSI容器存储接口将存储服务和容器内部对接。存储服务器对接物理机目录,物理机目录对接容器内目录。

2. docker管理卷(默认挂载)

制作镜像时以volumes关键字会指定一个目录。docker运行时先在镜像内找volumes关键字,然后在物理机的/var/lib/docker/volumes目录下生成一个随机名称的目录,默认将此目录与容器内volumes关键字后面指定的目录挂载起来。

3. 自管理卷(手动挂载)实验

方法1:先在物理机创建一个目录,再将多个容器的目录挂载到物理机目录

[root@localhost ~]# mkdir /data                     #创建目录
[root@localhost ~]# docker run --name test1 -v /data:/usr/local/nginx/html -d nginx:1.21.4                                  
                                                    #手动挂载
                                                    #-v 物理机目录:容器内目录
[root@localhost ~]# cd /data/                   #进入
[root@localhost data]# ls                     #查看无文件
[root@localhost data]# touch {1..100}             #创建100个文件
[root@localhost data]# ls                     #查看有1-100个文件
[root@localhost data]# docker exec -it test1 /bin/bash    #进入容器
root@5fdd3cd78396:/# cd /usr/local/nginx/html/    #进入目录
root@5fdd3cd78396:/usr/local/nginx/html# ls     #查看有1-100个文件。挂载成功

image.gif

此时单容器完成目录共享

运行第二个容器,将此容器的/usr/local/nginx/html也与物理机的/data目录挂载:

[root@localhost ~]# docker run --name test2 -v /data:/usr/local/nginx/html -d nginx:1.21.4

image.gif

此时物理机的/data目录分别与test1容器和test2容器的两个目录挂载。

这三个目录都可以看到对方创建的文件及内容了。实现了容器与容器的文件共享。

且容器删除后,物理机的挂载目录下的文件还存在。

方法2:先运行容器1让它按照默认的方式将容器的目录与物理机随机产生的目录挂载到一起,再查看到物理机上随机产生的这个目录。将其他的所有容器的目录挂载到物理机物理机上随机产生的这个与容器1默认挂载了的目录上。实现多容器数据共享

[root@localhost ~]# docker run --name test1  -d nginx:1.21.4  #运行容器1,会自动默认挂载
[root@localhost ~]# docker inspect test1                      #查看,找到如下内容就能查找到默认挂载的物理机目录了

image.gif

image.gif

然后用-v选项可以将其他容器的目录挂载到此目录下了

方法2或者:

[root@localhost ~]# docker run --name test1  -d nginx:1.21.4  #运行容器1,会自动默认挂载
[root@localhost ~]# docker run --name test2 --volumes-from test1 -d nginx:1.21.4
[root@localhost ~]# docker run --name test3 --volumes-from test1 -d nginx:1.21.4

image.gif

用此命令启动其他容器,并将其他容器的目录自动挂载到容器1的挂载目录下

4. 容器中的数据卷

4.1 数据卷意义

 Docker-managed Volume

        >> docker run -it --name roc -v MOUNTDIR roc/lamp:v1.0

        >> docker inspect -f {{.Mounts}}  roc

   

 > Bind-mount Volume

        >> docker run -it --name roc -v HOSTDIR:VOLUMEDIR  roc/lamp:v1.0

 > Union Volume

        >> docker run -it --name roc --volumes-from ContainerName roc/lamp:v1.0

4.2 存储驱动

Docker 存储驱动 ( storage driver ) 是 Docker 的核心组件,它是 Docker 实现分层镜像的基础

        1、device mapper ( DM ):性能和稳定性存在问题,不推荐生产环境使用(centos6及以下的主流)

        2、btrfs:社区实现了 btrfs driver,稳定性和性能存在问题

        3、overlayfs:内核 3.18 overlayfs 进入主线,性能和稳定性优异,第一选择

4.3 UFS文件系统-Overlayfs

image.gif

mount -t overlay overlay -olowerdir=./low,upperdir=./upper,workdir=./work ./merged  
echo "overlay" > /etc/modules-load.d/overlay.conf
cat /proc/modules|grep overlay
reboot  
vim /etc/systemd/system/docker.service 
  --storage-driver=overlay \

image.gif

5.卷的持久化问题

容器是一个强大的概念,但是有时候并不是所有想访问的事物都能立马被封装成容器。用户可能有一个存储在大的集群上的相关Oracle数据库,想要连接它做一些测试。又或者,用户可能有一台遗留的大型服务器,而它上面现有配置好的二进制程序很难重现。

刚开始使用Docker时,用户想要访问的大部分事物可能会是容器外部的数据和程序。我们将和读者一起从直接在宿主机上挂载文件转到更为复杂的容器模 式:数据容器和开发工具容器。我们还将展示一些实用的技巧,例如,只需要一个SSH连接便能跨网络进行远程挂载,以及通过BitTorrent协议与其他用户分享数据。

卷是Docker的一个核心部分,有关外部数据引用的问题也是Docker生态系统中另一个快速变化的领域。

6.Docker卷的持久化问题

容器的大部分力量源自它们能够尽可能多地封装环境的文件系统的状态,这一点的确很有用处。


然而有时候用户并不想把文件放到容器里,而是想要在容器之间共享或者单独管理一些大文件。一个经典的例子便是想要容器访问一个大型的中央式数据 库,但是又希望其他的(也许更传统些的)客户端也能和新容器一样访问它。

解决方案便是卷!一种Docker用来管理容器生命周期外的文件的机制。

我们可以使用Docker的卷标志,在容器里访问宿主机上的A文件。如下图则是使用卷标志和和宿主机上的文件系统交互过程

image.gif

如下命令展示宿主机上的/var/db/tables目录被挂载到了/var/data1:

$ docker run -v /var/db/tables:/var/data1 -it debian bash

image.gif

-v标志(--volume的简写)表示为容器指定一个外部的卷。随后的参数以冒号分隔两个目录的形式给出了卷的格式,告知Docker将外部 的/var/db/tables目录映射到容器里的/var/data1目录。如果外部目录和容器目录不存在均会被创建。

要注意的是,卷在Dockerfile里被设定为不是持久化的。如果添加了一个卷,然后在一个Dockefile里对该目录做了一些更改,这些变动将不会被持久化到生成的目标镜像.


目录
相关文章
|
1天前
|
Kubernetes Cloud Native 持续交付
云原生之旅:Docker容器化与Kubernetes集群管理
【9月更文挑战第33天】在数字化转型的浪潮中,云原生技术如同一艘航船,带领企业乘风破浪。本篇文章将作为你的航海指南,从Docker容器化的基础讲起,直至Kubernetes集群的高级管理,我们将一起探索云原生的奥秘。你将学习到如何封装应用、实现环境隔离,以及如何在Kubernetes集群中部署、监控和扩展你的服务。让我们启航,驶向灵活、可伸缩的云原生未来。
|
4天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker与Kubernetes入门
【9月更文挑战第30天】在云计算的浪潮中,云原生技术正以前所未有的速度重塑着软件开发和运维领域。本文将通过深入浅出的方式,带你了解云原生的核心组件——Docker容器和Kubernetes集群,并探索它们如何助力现代应用的构建、部署和管理。从Docker的基本命令到Kubernetes的资源调度,我们将一起开启云原生技术的奇妙之旅。
|
14天前
|
运维 Cloud Native Docker
云原生技术入门:Docker容器化实战
【9月更文挑战第20天】本文将引导你走进云原生技术的世界,通过Docker容器化技术的实战演练,深入理解其背后的原理和应用。我们将一起探索如何在云平台上利用Docker简化部署、扩展和管理应用程序的过程,并揭示这一技术如何改变现代软件的开发和运维模式。
|
1月前
|
存储 数据管理 应用服务中间件
Docker的数据管理实战篇
关于Docker数据管理实战的教程,涵盖了Docker数据卷的使用、特点、场景以及数据卷容器的概念和应用。
51 13
Docker的数据管理实战篇
|
9天前
|
Cloud Native 持续交付 Docker
云原生技术入门与实践:Docker容器化部署示例
【9月更文挑战第25天】在数字化转型的浪潮下,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,为初学者揭示云原生技术的核心概念及其应用价值。我们将以Docker容器为例,逐步引导读者了解如何将应用程序容器化,并在云端高效运行。这不仅是对技术趋势的跟随,更是对资源利用和开发效率提升的探索。
29 4
|
18天前
|
Kubernetes Cloud Native 开发者
云原生入门:从Docker到Kubernetes的旅程
【9月更文挑战第16天】 本文将带你进入云原生的世界,从理解Docker容器的基础开始,逐步深入到Kubernetes集群管理。我们将通过简单的代码示例和实际操作,探索这两个关键技术如何协同工作,以实现更高效、灵活的应用程序部署和管理。无论你是云原生新手还是希望深化理解,这篇文章都将为你提供清晰的指导和实用的知识。
51 11
|
15天前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
阿里云数据库重磅升级!元数据服务OneMeta + OneOps统一管理多模态数据
|
1月前
|
Cloud Native 持续交付 Docker
云原生技术实践:Docker容器化部署教程
【9月更文挑战第4天】本文将引导你了解如何利用Docker这一云原生技术的核心工具,实现应用的容器化部署。文章不仅提供了详细的步骤和代码示例,还深入探讨了云原生技术背后的哲学,帮助你理解为何容器化在现代软件开发中变得如此重要,并指导你如何在实际操作中运用这些知识。
|
2月前
|
Kubernetes Cloud Native 开发者
探索云原生技术:从Docker到Kubernetes的旅程
【8月更文挑战第31天】云原生技术正在改变软件开发、部署和运维的方式。本文将带你了解云原生的核心概念,并通过实际代码示例,展示如何使用Docker容器化应用,并进一步通过Kubernetes进行集群管理。我们将一起构建一个简单的微服务架构,体验云原生带来的高效与便捷。
|
2月前
|
Kubernetes Cloud Native 云计算
云原生入门:从Docker到Kubernetes的旅程
【8月更文挑战第31天】 在数字化转型的浪潮中,云原生技术成为推动现代软件开发的关键力量。本文将引导读者理解云原生的基本概念,通过Docker和Kubernetes的实际应用示例,展示如何在云平台上部署和管理容器化应用。我们将一起探索服务编排、持续集成和微服务架构的实践之路,旨在为初学者揭开云原生技术的神秘面纱,并激发对这一前沿领域的深入探索。
下一篇
无影云桌面