iis服务器助手广告广告
返回顶部
首页 > 资讯 > 服务器 >Docker 存储管理的几种方式
  • 209
分享到

Docker 存储管理的几种方式

2024-04-02 19:04:59 209人浏览 八月长安
摘要

目录前言一、存储二、卷列表三、绑定挂载四、数据卷容器五、数据备份六、数据恢复总结前言 在本文内容中,我们将讨论 Docker 中管理数据的几种方式,涉及将数据从 Docker 主机挂

前言

在本文内容中,我们将讨论 Docker 中管理数据的几种方式,涉及将数据从 Docker 主机挂载到容器中的不同方法。

一、存储

通过之前的学习,我们学习了有关于容器和镜像的一些知识。对于数据来说,我们可以将其保存在容器中,但是会存在一些缺点:

  • 当容器不再运行时,我们无法使用数据,并且容器被删除时,数据并不会被保存。
  • 数据保存在容器中的可写层中,我们无法轻松的将数据移动到其他地方。

针对上述的缺点而言,有些数据信息,例如我们的数据库文件,我们不应该将其保存在镜像或者容器的可写层中。Docker 提供三种不同的方式将数据从 Docker 主机挂载到容器中,分别为卷(volumes),绑定挂载(bind mounts),临时文件系统(tmpfs)。很多时候,volumes 总是正确的选择。

  • volumes 卷存储在 Docker 管理的主机文件系统的一部分中(/var/lib/docker/volumes/)中,完全由 Docker 管理。
  • bind mounts 绑定挂载,可以将主机上的文件或目录挂载到容器中。
  • tmpfs 仅存储在主机系统的内存中,而不会写入主机的文件系统。

无论使用上述的哪一种方式,数据在容器内看上去都是一样的。它被认为容器文件系统中的目录或单个文件。

二、卷列表

对于三种不同的存储数据的方式来说,卷是唯一完全由 Docker 管理的。它更容易备份或迁移,并且我们可以使用 Docker CLI 命令来管理卷。

列出本地可用的卷列表可以使用如下命令:

docker volume ls

 运行之后,你可能会看到一些环境中预置镜像对应的卷,或者显示为空。

创建卷

创建卷我们可以直接使用如下命令:

docker volume create

上述命令会创建一个数据卷,并且会随机生成一个名称。创建之后我们可以查看卷列表:

docker volume ls

请添加图片描述

这种由系统随机生成名称的创建卷的方式被称为 匿名卷,直接使用该卷需要指定卷名,即自动生成的 ID,所以创建卷时一般手动指定其 name,例如我们创建一个名为 volume1 的卷。

docker volume create volume1

请添加图片描述

挂载卷

创建卷之后,我们可以用卷来启动一个容器,这里首先需要学习 docker container run 命令的两个参数:

  • -v--volume

由三个由冒号(:)分隔的字段组成,[HOST-DIR:]CONTAINER-DIR[:OPTioNS]

  • HOST-DIR 代表主机上的目录或数据卷的名字。省略该部分时,会自动创建一个匿名卷。如果是指定主机上的目录,需要使用绝对路径。
  • CONTAINER-DIR 代表将要挂载到容器中的目录或文件,即表现为容器中的某个目录或文件。
  • OPTIONS 代表配置,例如设置为只读权限(ro),此卷仅能被该容器使用(Z),或者可以被多个容器使用(z)。多个配置项由逗号分隔。

例如,我们使用 -v volume1:/volume1:ro,z。代表的是意思是将卷 volume1 挂载到容器中的 /volume1 目录。ro,z 代表该卷被设置为只读(ro),并且可以多个容器使用该卷(z)。

  • --mount 由多个键值对组成,键值对之间由逗号分隔。

例如:type=volume,source=volume1,destination=/volume1,ro=true

  • type,指定类型,可以指定为 bindvolumetmpfs
  • source,当类型为 volume 时,指定卷名称,匿名卷时省略该字段。
  • 当类型为 bind,指定路径。可以使用缩写 src
  • destination,挂载到容器中的路径。可以使用缩写 dsttarget
  • ro 为配置项,多个配置项直接由逗号分隔一般使用 true 或 false

针对上述创建的卷 volume1,用其来运行一个容器就可以使用如下命令:

docker container run \
    -it \
    --name niuma001 \
    -v volume1:/volume1 \
    --rm ubuntu /bin/bash

请添加图片描述

或者我们也可以使用 --mount,其语法格式如下:

docker container run \
    -it --name niuma002 \
    --mount type=volume,src=volume1,target=/volume1 \
    --rm ubuntu /bin/bash

请添加图片描述

从命令中,可以很明显的得出,--mount 的可读性更好。所以,推荐大家使用 --mount

docker container run 中我们使用了参数 --rm,它的作用在容器退出时删除容器。这里我们创建的镜像只是希望它短期运行,其用户数据并无保留的必要,因而可以在容器启动时设置 --rm 选项,这样在容器退出时就能够自动清理容器内部的文件系统。

值得注意的是,后台运行的容器无法使用 -d--rm 选项。

上述操作,我们分别运行了两个容器,并分别挂载了一个卷,还可多次使用该参数挂载多个卷或目录。并且对于这两个容器来说,由于我们使用的是同一个卷,所以他们将共享该数据卷,但是对于多个容器共享数据卷时,需要注意并发性。大家可以分别连接到两个容器中,操作数据,验证其是同步的,这里就不再详细演示了。

三、绑定挂载

 对于数据卷来说,其优点在于方便管理。而对于绑定挂载 bind-mounts 来说,通过将主机上的目录绑定到容器中,容器就可以操作和修改主机上该目录的内容。这既是其优点也是其缺点。

 例如,我们将 /home/xiaoniuma 目录挂载到容器中的 `/home/xiaoniuma 目录下,使用的命令如下:

docker container run \
    -it \
    -v /home/xiaoniuma:/home/xiaoniuma \
    --name xiaoniuma003 \
    --rm ubuntu /bin/bash

请添加图片描述

而如果使用的是 --mount,相应的语句如下:

docker container run \
    -it \
    --mount type=bind,src=/home/xiaoniuma,target=/home/xiaoniuma \
    --name xiaoniuma004 \
    --rm ubuntu /bin/bash

请添加图片描述

如果绑定挂载时指定的容器目录是非空的,则该目录中的内容将会被覆盖。并且如果主机上的目录不存在,会自动创建该目录。

上述两个操作针对的是目录,而对于挂载文件来说,可能会出现一些特殊情况,涉及到绑定挂载和使用卷的区别。下面我们重现这一操作:

1.首先在当前目录,即 /home/xiaoniuma 目录下,创建一个 test.txt 文件。并向其中写入文本内容 “test1”:

echo "test1" > test.txt

请添加图片描述

2.接着创建一个容器 xiaoniuma005,将 test.txt 文件挂载到容器中的 /test.txt 文件,并查看容器中 /test.txt 文件的内容:

docker container run \
    -it \
    -v /home/xiaoniuma/test.txt:/test.txt \
    --name xiaoniuma005 ubuntu /bin/bash

请添加图片描述

请添加图片描述

3.这时新打开一个终端,通过 echo 命令向 /home/xiaoniuma/test.txt 文件追加内容 “test2”,并在容器中查看 /test.txt 文件的内容:

echo "test2" >> test.txt

请添加图片描述

4.这时无论是在容器中还是主机上都能查看到该文件的内容。接下来在主机上查看 test.txt 的 inode 号。

请添加图片描述

使用 VIM 编辑该文件,添加 “test3”,并查看该文件的内容:

请添加图片描述

请添加图片描述

 

请添加图片描述

 

请添加图片描述

如上图所示,在主机上使用 VIM 编辑后,通过 VIM 做出的修改不能在容器中查看到。这是因为 VIM 编辑保存文件的时候,会将文件内容写入到一个新的文件中,保存好后,删除掉原来的文件,并将新文件重命名,从而完成保存的操作。但是我们标识文件是通过 inode,因此 Docker 绑定的主机文件,依旧是 VIM 编辑之前的 inode,即旧文件。所以容器中看到的,依然是旧的内容。
对于数据卷来说,由 Docker 完全管理,而绑定挂载,则需要我们自己去维护。我们需要自己手动去处理这些问题,这些问题并不仅仅是上面演示的内容,还可能有用户权限,SElinux 等问题。

最后简单说一下临时文件系统 tmpfs。它只存储在主机的内存中。当容器停止时,相应的数据就会被移除。

docker run \
    -it \
    --mount type=tmpfs,target=/test \
    --name xiaoniuma008 \
    --rm ubuntu bash

四、数据卷容器

如果容器之间需要共享一些持续更新的数据,最简单的方式就是使用用户数据卷容器。其他容器通过挂载这个容器实现数据共享,这个挂载数据卷的容器就叫做数据卷容器。数据卷容器就是一种普通容器,它专门提供数据卷供其它容器挂载使用。

首先,我们创建一个数据卷和数据卷容器,执行的命令如下:

# 创建一个名为 vdata 的数据卷
docker volume create vdata
# 创建一个挂载了 vdata 的容器,这个容器就是数据卷容器
docker container run \
    -it \
    -v vdata:/vdata \
    --name XiaoniumaVolume ubuntu /bin/bash
# 在 /vdata 目录下创建一个文本文件
echo "I am XiaoniumaVolume" > /vdata/f.txt

请添加图片描述

接下来我们分别打开新的终端输入以下命令,创建两个容器,在执行 docker container run 时,我们添加参数 --volumes-from 继承数据卷容器 XiaoniumaVolume 挂载的数据卷。进入容器后分别创建文件

# 创建容器 test1
docker container run \
    -it \
    --volumes-from XiaoniumaVolume \
    --name test1 ubuntu /bin/bash

# 查看 vdata 目录是否存在
ls -dl /vdata/

# 创建一个文件,并写入内容
echo "I am test1" > /vdata/test1.txt

请添加图片描述

同样的,我们执行上述操作,创建容器 test2。

# 创建容器 test2
docker container run \
    -it \
    --volumes-from XiaoniumaVolume \
    --name test2 ubuntu /bin/bash

# 查看 vdata 目录是否存在
ls -dl /vdata/

# 创建一个文件,并写入内容
echo "I am test2" > /vdata/test2.txt

请添加图片描述

我们进入到 XiaoniumaVolume 容器所在的终端,在挂载的数据中查看文件的内容:

# 查看数据卷中的内容
ls -al /vdata/

请添加图片描述

从上图的结果中我们可以看到,数据卷在三个容器之间是共享的。

五、数据备份

 数据存在于数据卷中,如果我们想要备份它,可以采用创建备份容器的方式。

docker container run \
   --volumes-from XiaoniumaVolume \
   -v /home/xiaoniuma/backup:/backup \
   ubuntu tar cvf /backup/backup.tar /vdata/
  • --volumes-from XiaoniumaVolume 使得备份容器继承容器 XiaoniumaVolumeVolume 的数据卷。
  • -v /home/xiaoniuma/backup:/backup/home/xiaoniuma/backup 目录采用绑定挂载的方式,挂载到容器的 /backup 目录上。
  • tar cvf /backup/backup.tar /vdata 容器中执行了这么一条压缩归档命令,将 /vdata 中的全部数据打包到了 /backup/backup.tar,而刚刚的数据绑定,使得整个压缩包存在于主机中,从而达到了数据备份的效果。

请添加图片描述

如上图所示,数据卷中的所有数据都被打包到了 /home/xiaoniuma/backup 目录中。

六、数据恢复

与数据备份相同的方式,我们可以使用如下命令创建恢复容器,来还原数据卷中的数据。

docker container run \
   --volumes-from XiaoniumaVolume \
   -v /home/xiaoniuma/backup:/backup \
   ubuntu tar xvf /backup/backup.tar -C /

这里解压的路径为 / 即 /vdata 的上一级目录。由于与数据备份非常相似,这里不再给出结果分析。

总结

本文主要使用三种不同的方式将数据从 Docker 主机挂载到容器中,分别为卷(volumes),绑定挂载(bind mounts),临时文件系统(tmpfs)。还介绍了数据卷容器、数据卷的备份与恢复。

下文讲解Docker网络管理。

到此这篇关于Docker 存储管理的文章就介绍到这了,更多相关Docker 存储管理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Docker 存储管理的几种方式

本文链接: https://www.lsjlt.com/news/153277.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Docker 存储管理的几种方式
    目录前言一、存储二、卷列表三、绑定挂载四、数据卷容器五、数据备份六、数据恢复总结前言 在本文内容中,我们将讨论 Docker 中管理数据的几种方式,涉及将数据从 Docker 主机挂...
    99+
    2022-11-13
  • redis有几种存储方式
    Redis其实就是一个用C语言写的一个程序,这个程序用来存储 key-value数据,数据先放在内存,然后写入磁盘指定位置。下面我们梳理一下Redis存储两种方式: RDB和AOF    ...
    99+
    2022-10-18
  • Docker存储管理的方式有哪些
    这篇“Docker存储管理的方式有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Docker存储管理的方式有哪些”文章吧...
    99+
    2023-07-02
  • Docker中数据卷管理的方式有哪几种
    本篇内容介绍了“Docker中数据卷管理的方式有哪几种”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是数据卷数据卷( volume ):...
    99+
    2023-06-20
  • kafka的存储方式有哪几种
    Kafka的存储方式主要有两种: 持久化存储方式:Kafka使用持久化存储方式将消息持久化到磁盘上,确保消息的可靠性。Kafka...
    99+
    2023-10-27
    kafka
  • docker容器的几种存储详解
    目录写在前面几种存储挂载方式1.bind mounts2.volumes3.tmpfs mount存储数据共享写在前面 我们在上篇学习了容器网络,对容器网络驱动bridge工作原理...
    99+
    2022-11-12
  • Android数据存储几种方式整理笔记
        目录 一、文件存储 1.写入文件步骤 2.读取文件步骤 3.实现存储和读取用户名和密码实例 二、SharedPreferences存储 三、SQLite数据库存储 四、ContentProvider存储 五、网络存储 实际开发A...
    99+
    2023-10-12
    java 开发语言
  • HTML5中web Storage的存储方式有几种
    这篇文章主要为大家展示了“HTML5中web Storage的存储方式有几种”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“HTML5中web Storage的存...
    99+
    2022-10-19
  • android数据存储方式有哪几种
    Android数据存储方式有以下几种:1. Shared Preferences(共享偏好设置):用于存储简单的键值对,适用于存储少...
    99+
    2023-09-27
    android
  • Android 数据存储方式有哪几种
    以下内容给大家介绍Android数据存储提供了五种方式: 1、SharedPreferences 2、文件存储 3、SQLite数据库 4、ContentProvider 5、...
    99+
    2022-06-06
    数据 存储 数据存储 Android
  • Android数据存储几种方式讲解
    目录一、文件存储1.写入文件步骤2.读取文件步骤3.实现存储和读取用户名和密码实例二、SharedPreferences存储三、SQLite数据库存储四、ContentProvide...
    99+
    2022-12-26
    Android数据存储 Android数据存储方式有哪些
  • Hive表的几种存储格式
    Hive的文件存储格式: textFile     textFile为默认格式     存储方式:行存储         缺点:磁盘开销大;数据解析开销大;压缩的text文件,hive无法进行合并和拆分 sequencefile  ...
    99+
    2016-06-06
    Hive表的几种存储格式
  • java事务管理的方式有哪几种
    Java事务管理的方式有以下几种:1. 编程式事务管理:开发人员通过编写代码来手动管理事务的开始、提交和回滚等操作。这种方式需要开发...
    99+
    2023-09-13
    java
  • Kubernetes几种存储方式性能对比是怎样的
    Kubernetes几种存储方式性能对比是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。摘要展示了一个简单的存储对比,使用未经性能优化的多种存储提供的存储卷进行测试和比较...
    99+
    2023-06-04
  • Docker中数据卷(volume)管理的两种方式
    上篇文章给大家介绍过 docker基础知识之挂载本地目录的方法 ,今天给大家介绍Docker中数据卷(volume)管理的两种方式,具体内容如下所示: 什么是数据卷 数据卷...
    99+
    2022-11-12
  • Oracle存储过程的几种调用方式图文详解
    目录一、案例场景1.基础环境2.SQL窗口中调用存储过程3.命令窗口中调用存储过程4.Procedures菜单列表中调用存储过程5.Package或Package Bodies菜单列表中调用存储过程6.Jobs菜单列表调...
    99+
    2023-04-14
    oracle存储过程怎么调用 oracle调用存储过程语句 oracle存储过程实例
  • Docker存储管理方式以及容器数据的备份与恢复
    这篇文章主要讲解了“Docker存储管理方式以及容器数据的备份与恢复”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Docker存储管理方式以及容器数据的备份...
    99+
    2022-10-19
  • 详解java项目打包docker镜像的几种方式
    目录前言一、背景环境二、打包方式(三种)1. 在idea环境里打包方式一2. 在idea环境里打包方式二3. 基本打包方式三、启动服务四、总结前言 本文章记录了 sprin...
    99+
    2023-01-15
    java项目打包docker镜像 java打包docker镜像
  • vuex存储数据的几种方法实例详解
    目录一、Vuex是什么1、Vuex的构成2、Vuex的使用二、本地存储1.存储数据2.取出数据3.清除数据总结一、Vuex是什么 Vuex是专门为Vuejs应用程序设计的状态管理工具...
    99+
    2022-11-13
    vuex存储数据几种方式 vuex存储数据 vuex怎么存数据
  • iSCSI存储的3种连接方式
    我们分析了iSCSI存储的系统结构,下面来看iSCSI是如何与服务器、工作站等主机设备来连接的,也就是我们如何建立一个iSCSI网络存储系统。 iSCSI设备的主机接口一般默认都是IP接口,可以直接与以太网络交换机和iSCSI交换机连接,形...
    99+
    2023-01-31
    方式 iSCSI
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作