Docker存储

2023-11-04

前言

上一篇文章中简单总结了一下docke的基础使用方法,这次我来总结一下有关docker存储方面的相关知识。本文同样建立在CloudMan的系列教程之上,有兴趣的可以直接移步。

有些人可能觉得这个很简单,存储就是硬盘嘛,docker容器既然也是操作系统,那就直接存在他的容器的文件系统里就好了。看似没错,但问题在于docker的容器是无状态的,当容器重启的时候里面的数据会全部清除,如果是一些静态的数据,我们可以在build镜像的时候直接写死,但是对于数据库、日志等数据实时变化的镜像我们就不能通过这种方式来保存数据。所以本文来谈谈不同的存储方式。

一、Docker的两种存储资源

根据上述分析可以知道,Docker为容器起码提供了两种存放数据的资源,确实如此,分别是:

  1. 由storage driver管理的镜像层和容器层,即镜像内文件系统。
  2. Data Volume,宿主机文件系统。

1.1 storage driver

对于某些容器,直接将数据放在由storage driver维护的层中是很好的选择,比如那些无状态的应用。无状态意味着容器没有需要持久化的数据,随时可以从镜像直接创建。比如busybox,它是一个工具箱,我们启动busybox是为了执行诸如wget,ping之类的命令,不需要保存数据供以后使用,使用完直接退出,容器删除时存放在容器层中的工作数据也一起被删除,下次再启动新容器时又是一个干净如初的内部文件系统。

通过上一篇文章可以知道使用Dockerfile build镜像的时候,可以通过COPY或ADD命令来向镜像中添加数据。如下:

COPY将文件从宿主机复制到镜像。

COPY支持两种形式:

  1. COPY src dest
  2. COPY ["src", "dest"]

注意:src只能指定宿主机中的文件或目录。

ADDCOPY类似,从宿主机复制文件到镜像。不同的是,如果src是归档文件(tar,zip,tgz,xz等),文件会被自动解压到dest。

1.2 data vloume

有些容器需要保存状态,如数据库容器等,这些就需要使用Data Volume,即将内部数据映射到外部宿主机的文件系统上。

Data Volume 有以下特点:

  1. Data Volume是目录或文件,而非没有格式化的磁盘(块设备)。
  2. 容器可以读写volume中的数据。
  3. volume数据可以被永久的保存,即使使用它的容器已经销毁。

1.2.1 bind mount

bind mount的意思是挂载宿主机中固定目录,启动容器的时候执行:

docker run -d -p 80:80 -v src:dst httpd

-v的格式为:。在此镜像中为/usr/local/apache2/htdocs,此目录是httpd镜像中apache server存放静态文件的地方。由于/usr/local/apache2/htdocs已经存在,但是其中数据会被隐藏起来,取而代之的是宿主机中的数据,这与 linux mount 命令的行为是一致的,即将宿主机中的目录挂载到镜像中的目录。

1.2.2 docker managed volume

docker managed volume的意思是由docker自动映射目录。启动容器的时候执行:

docker run -d -p 80:80 -v dst httpd

此处-v的格式为,即只有镜像中路径。

它与bind mount的区别在于,managed volume不需要指定宿主机上的mount目录,docker会自动在宿主机/var/lib/docker/volumes下为其生成一个随机目录。

docker managed volume的创建过程:

  1. 容器启动时,简单的告诉docker:我需要一个volume存放数据,帮我mount到目录/abc(镜像内目录)。
  2. docker在宿主机/var/lib/docker/volumes中生成一个随机目录作为mount源。
  3. 如果/abc已经存在,则将数据复制到 mount源。
  4. 将volume(宿主机)mount到/abc(镜像)。

1.2.3 两种方式对比

类型 bind mount docker managed volume
volume 位置 可任意指定 /var/lib/docker/volumes/...
对已有mount point 影响 隐藏并替换为 volume 原有数据复制到 volume
是否支持单个文件 支持 不支持,只能是目录
权限控制 可设置为只读,默认为读写权限 无控制,均为读写权限
移植性 移植性弱,与host path绑定 移植性强,无需指定host目录

二、容器与宿主机之间以及容器之间数据共享

由于docker的设计目的就是为了互相不干扰,相互独立,但是有时候我们又不得不在容器与宿主机之间或者容器之间共享数据,以实现某些功能。

2.1 容器与host共享数据

  1. 使用docker cp命令可以在容器和host之间拷贝数据,与scp相似。

  2. 将镜像的某一目录挂载到host path也是一种共享方式。

2.2 容器之间共享数据

2.2.1 共享host目录

只需要将同一个host目录挂载到不同的容器即可。

2.2.2 用volume container共享数据

volume container是专门为其他容器提供volume的容器。它提供的卷的类型可以是bind mount,也可以是docker managed volume。通过下面的命令创建一个volume container:

docker create --name vc_data -v ~/htdocs:/usr/local/apache2/htdocs -v /other/useful/tools busybox

此处只需要create即可,不需要run,因为其他容器只需获取到他的这个挂载点,并不需要他的数据。

其他容器启动的时候可以通过--volumes-from参数使用vc_data这个volume container容器的挂载点,命令如下:

docker run --name web1 -d -p 80 --volumes-from vc_data httpd
docker run --name web2 -d -p 80 --volumes-from vc_data httpd

这样web1、web2就有了相同的挂载点。

volume container 的特点:

  1. 与 bind mount 相比,不必为每一个容器指定host path,所有path都在 volume container中定义好了,容器只需与volume container关联。实现了容器与host的解耦。
  2. 使用volume container的容器其mount point是一致的,有利于配置的规范和标准化,但也带来一定的局限,使用时需要综合考虑。

2.2.3 data-packed volume container

这种场景是将数据先放到镜像中,build此镜像,然后create此镜像,其他容器的--volumes-from设置为此容器。这样run出来的容器都会共享同一份数据。

我们用下面的 Dockfile 构建镜像:

FROM busybox
ADD htdocs /usr/local/apache2/htdocs
VOLUME /usr/local/apache2/htdocs

ADD命令将静态文件添加到容器目录/usr/local/apache2/htdocs。

VOLUME 的作用与-v等效,用来创建docker managed volume,mount point 为usr/local/apache2/htdocs,因为这个目录就是ADD添加的目录,所以会将已有数据拷贝到volume中。用下面的命令build词镜像:

docker build -t datapacked .

创建此镜像的容器:

docker create --name vc_data datapacked

此处不再需要-v,因为datapacked的镜像VLOUME已经实现了。

启动其他容器:

docker run --name web2 -d -p 80 --volumes-from vc_data httpd

这样也可实现容器之间共享数据,而且此数据保存在datapacked中。这种方式适合只使用静态文件共享场景。并且datapacked中包含了共享数据,可移植性非常强。

三、volume管理

docker volume ls查看宿主机上所有vloume

docker inspect <container>查看某一容器具体的信息

dcoker vloume rm <iamgeid>删除某一个volume

如果想批量删除孤儿 volume,可以执行:

docker volume rm $(docker volume ls -q)

四、总结

本文简单总结了docker存储方面的相关知识和用法,包含两种数据存储方式、容器与host之间、容器之间共享数据以及volume管理等知识。下一篇总结以下docker网络的相关知识和用法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker存储 的相关文章

随机推荐

  • 一种数据驱动的自动驾驶汽车前馈补偿器优化方法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 Matlab代码实现 4 参考文献 1 概述 一个可靠的控制器对于自动驾驶汽车的安全和平
  • Vue Excel文件的下载和上传(formData)

    Vue Excel文件的下载和上传 formData 在本文中传给后台的数据为FormData 首先介绍Excel文件的上传和下载代码 HTML代码 其中引用了Element UI的button
  • 人工智能——衣服分类(大作业必备)

    官方网站 大作业系列传送门 文本分类 模仿VGG16的衣服分类 导入数据 指定名称 观察里面图片 预处理 建立模型 编译模型 开始训练 绘制曲线 模型评估 图形测试定义 验证结果 预测多张结果 预测单张结果 导入数据 tf keras da
  • laravel-admin整合wangEditor2及上传图片

    小伙伴说MD编辑器不好用 因为复制粘贴不方便 所以我换了一个编辑器整合 选择了老朋友wangEditor 下面为大家介绍怎么在laravel v6 9 laravel admin v1 7 wangEditor2的情况下上传图片 第一步 c
  • android sdk配置图文教程

    首先配置 java sdk 下载java sdk java sdk也有很多版本 问清项目版本 下载相对应的 然后配置环境变量 下图是我电脑下载的版本 下载好就就是配置环境变量了 配置java sdk 环境变量 右击我的电脑 属性 高级系统设
  • VUE element-ui 之table表格导出Excel功能封装(纯前端实现)

    需求 导出当前页面所有数据 步骤 下载所需依赖 npm install save xlsx file saver 引入依赖 这里我进行了封装 由于很多页面都需要导出excel功能 js文件中引入依赖 进行导出方法封装 import File
  • 简单的jsp+servlet+jdbc+mysql实现用户增删改查-一抹茶-csdn

    jsp servlet jdbc mysql实现用户增删改查 项目下载地址 里面包含了项目文件 jar bootstrap jquery sql 也可以联系957406675 QQ群获取下载 运行环境 jdk1 8 0 102 eclips
  • 操作系统课程设计 - 多线程模拟 - 时间片轮转法实现处理机调度

    此篇博客用于记录学习历程 仅供交流参考 一 课程设计题目及内容 题目 设计一个按照时间片轮转法实现处理机调度的程序 时间片轮转法实现处理机调度的程序设计提示如下 1 假设系统有n个进程 每个进程用一个进程控制块 PCB 来代表 进程控制块的
  • 如何使用css将多出范围的字变为...

    话不多说 上代码 呈一行效果 width 100px text overflow ellipsis 将文本溢出显示为 white space nowrap 强制显示为一行 overflow hidden 溢出隐藏 呈多行效果 width 1
  • Golang开发项目目录简介以及目录结构设置规范

    一 Golang项目简单介绍 Golang简单的目录结构如下 其中 bin用来存放经过go bulid后的可执行文件 pkg存放编译后的go module 而src就存放我们项目的代码 二 三种常用目录结构 1 适合个人开发者 2 流行的目
  • 大数据组件-kafka(基础篇)

    大数据组件 kafka 基础篇 Kafka简介 Kafka是什么 Kafka的应用场景 Kafka的架构组成 Kafka的主要竞争力 Kafka简介 Kafka是什么 Kafka是一个消息队列 存储消息的队列中间件 可以存储消息进队列中 也
  • 关于CMake生成包含PCL库和CGAL库的工程时出现“无法解析的外部符号”的错误

    前言 博主之前安装了PCL 1 8 0库 教程链接 PCL 1 8 0 AllInOne VS2013 Win8 X64 安装配置及部分问题解决方法 和CGAL库 教程链接 在Win8 VS2013中配置CGAL库 最近需要把两个库用在同一
  • 红球进黑洞【线段树区间更新+二进制异或处理】【牛客小白月赛9-C】

    题目链接 给你N个点 M次查询 问的是 一 区间 l r 的数的总和 二 把区间 l r 上的所有点去异或 xor 一个数X 一开始用了点更新 然后T了 想了一会 最后在比赛结束前终于美滋滋的完成了AC 庆幸 我的想法是这样的 将每个点的值
  • 学习笔记 JavaScript ES6 ES6数组的扩展

    学习内容 类数组 伪数组 Array from Array of copyWithin fill includes 类数组 伪数组 下面这几行代码的返回值就是伪数组 伪数组有索引 且长度是非负的整数 即长度length属性 但是没有数组的方
  • 51单片机学习笔记(二) 单个数码管显示1到9

    转自我的博客 http sincos in p 20 数码管 其实就是8个发光二极管按顺序排列而成的 所以让数码管显示特定的数字 只需要将该亮的二极管点亮 不该亮的灭了就好了 为了达到这个目的 就得参考电路图了 51HEI开发板的电路图在我
  • 腾讯校招编程题之快递分身术

    题目描述 城市里有3000条横向的道路和3000条纵向的道路 分别从1开始编号知道3000 相邻两条平行道路的间距为1 我们用 x y 表示第x号横向道路和第y号纵向道路 N个需要送快递的点坐落在这些交点上 小Q只能沿着这些道路送快递 而且
  • [Unity3D]Lua中使用协程coroutine和计时器timer

    习惯了unity3d的协程用法 那么我们在Unity里面怎么使用 StartCoroutine StopCoroutine WaitForSeconds 首先lua也有coroutine 其实lua中的协程真的是暂停 用法和unity并非相
  • 模型分类model

    模型可以按照多个维度进行分类 以下是常见的几种模型分类方式 1 根据应用领域分类 数学模型 基于数学原理和方程式来描述和解决问题 如微积分模型 线性代数模型等 物理模型 基于物理原理和规律来模拟和解释现象 如力学模型 电路模型等 经济模型
  • D3.js 绘制柱状图

    使用D3 V4版本绘制 使用D3绘制柱状图 绘制效果如下 使用D3绘制柱状图 先对需要绘制的图形拆解 主要分为以下几个部分 1 比例尺的定义 2 坐标轴的绘制 3 添加矩形 4 修改坐标轴样式 5 柱状图装饰效果添加 首先 先定义data
  • Docker存储

    前言 上一篇文章中简单总结了一下docke的基础使用方法 这次我来总结一下有关docker存储方面的相关知识 本文同样建立在CloudMan的系列教程之上 有兴趣的可以直接移步 有些人可能觉得这个很简单 存储就是硬盘嘛 docker容器既然