【云原生 | 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里对该目录做了一些更改,这些变动将不会被持久化到生成的目标镜像.


目录
相关文章
|
6天前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
在9月20日2024云栖大会上,阿里云智能集团副总裁,数据库产品事业部负责人,ACM、CCF、IEEE会士(Fellow)李飞飞发表《从数据到智能:Data+AI驱动的云原生数据库》主题演讲。他表示,数据是生成式AI的核心资产,大模型时代的数据管理系统需具备多模处理和实时分析能力。阿里云瑶池将数据+AI全面融合,构建一站式多模数据管理平台,以数据驱动决策与创新,为用户提供像“搭积木”一样易用、好用、高可用的使用体验。
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
|
2天前
|
Java 应用服务中间件 Linux
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
本文主要讲解了Docker的安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库以及Docker容器虚拟化与传统虚拟机比较。
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
|
8天前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
43 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
11天前
|
Kubernetes Cloud Native 开发者
云原生技术入门:Kubernetes和Docker的协作之旅
【10月更文挑战第22天】在数字化转型的浪潮中,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,引领读者步入云原生的世界,着重介绍Kubernetes和Docker如何携手打造弹性、可扩展的云环境。我们将从基础概念入手,逐步深入到它们在实际场景中的应用,以及如何简化部署和管理过程。文章不仅为初学者提供入门指南,还为有一定基础的开发者提供实践参考,共同探索云原生技术的无限可能。
21 3
|
12天前
|
Docker 容器
docker中查看已创建的数据卷
【10月更文挑战第16天】
28 3
|
12天前
|
存储 缓存 Docker
docker中挂载数据卷到容器
【10月更文挑战第16天】
19 2
|
12天前
|
Docker 容器
docker中创建命名数据卷
【10月更文挑战第16天】
12 2
|
13天前
|
存储 JSON 数据格式
docker中查看数据卷
【10月更文挑战第15天】
13 2
|
13天前
|
存储 Docker 容器
docker中使用命名数据卷
【10月更文挑战第15天】
11 2
|
13天前
|
存储 Docker 容器
docker中创建命名数据卷
【10月更文挑战第15天】
24 2