前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >拿捏docker+k8s系列--docker存储

拿捏docker+k8s系列--docker存储

作者头像
微客鸟窝
发布于 2022-05-24 05:08:37
发布于 2022-05-24 05:08:37
6360
举报
文章被收录于专栏:Go语言指北Go语言指北

Docker容器提供了两种存放数据的资源:

  • storage driver 管理的镜像层和容器层
  • Data Volume

storage driver

容器由最上面一个可写的容器层 + 若干只读的镜像层组成,容器的数据就存放在这些层中。

这样分层的特性就是 Copy-on-Write:

  • (1)新数据会直接存放在最上面的容器层。
  • (2)修改现有数据会先从镜像层将数据复制到容器层,修改后的数据直接保存在容器层中,镜像层保持不变。
  • (3)如果多个层中有命名相同的文件,用户只能看到最上面那层中的文件。

分层结构使镜像和容器的创建、共享以及分发变得非常高效,而这些都要归功于 Docker storage driver。storage driver实现了多层数据的堆叠并为用户提供一个单一的合并之后的统一视图。

Docker 支持多种storage driver,有 AUFS、Device Mapper、Btrfs、OverlayFS、VFS 和 ZFS。它们都能实现分层的架构,同时又有各自的特性。Docker官方推荐优先使用 Linux 发行版默认的 storage driver.

Docker 安装时会根据当前系统的配置选择默认的 driver。默认driver 经过了严格的测试,具有最好的稳定性。

使用 docker info 命令可以查看默认的 driver:

Ubuntu 默认 driver用的是 AUFS,底层文件系统是 exts,各层数据存放在 /var/lib/docker/aufs。

❝对于那些无状态的应用容器,直接将数据放在由 storage driver 维护的层中是很好的选择,无状态意味着容器没有需要持久化的数据,随时可以从镜像直接创建,不需要保存数据供以后使用,使用完直接退出,容器删除时存放在容器层中的工作数据也一起被删除。 ❞

对于有状态的容器,有持久化数据的需求,容器在启动时需要加载已有的数据,销毁的时候需要保留产生的新数据,就需要使用 「Data Volume」 存储机制。

Data Volume

Data Volume 是Docker Host 文件系统中的目录或文件,能够直接被 mount 到容器的文件系统中。

Data Volume 的特点:

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

volume 是docker host 文件系统的一部分,所以 volume 的容量取决于文件系统当前未使用的空间,在具体的使用上,docker 提供了两种类型的 volume: bind mount 和 docker managed volume。

bind mount

bind mount 是将 host 上存在的目录或文件 mount 到容器。

运行容器时,使用 -v 来 mount 到容器上。

  • -v 的格式:<host path>:<container path>

例如,将 ~/data 挂载到 httpd 容器上,如下:

由于 /usr/local/apache2/htdocs 已经存在,原有的数据会被隐藏起来,使用的是挂载的 host 上的 ~/data/ 中的数据。我们修改 host 上的内容,再次查看,发现 bind mount 可以让 host 与容器共享数据,如下:

将容器销毁,可以看到 bind mount 也还存在,「bind mount 不会随着容器的销毁而删除」,如下:

读写权限

bind mount 还可以指定数据的读写权限,默认是可读可写,可以指定为只读:

docker run -d -p 8080:80 -v ~/data:/usr/local/apache2/htdocs:ro httpd

  • ro:设置了只读权限,在容器中便无法对 bind mount 数据进行修改。

docker managed volume

❝bind mount 不足的地方:bind mount 需要指定 host 文件系统的特定路径,这就限制了容器的可移植性,当需要将容器迁移到其他 host, 而该 host 没有要 mount 的数据或者数据不在相同的路径时,操作会失败。 移植性更好的方式是使用 docker managed volume。 ❞

docker managed volume 不需要指定 mount 源,指明 mount point 就可以了,同样使用 -v ,告诉 docker 需要一个 data volume,并 mount 到 /usr/local/apache2/htdocs :

docker run -d -p 8080:80 -v /usr/local/apache2/htdocs httpd

data volume 具体在哪?我们可以执行 docker inspect 命令在容器的配置信息中找到,如下(其他信息已省略):

其中 Mounts 这部分会显示容器当前使用的所有 data volume,包括 bind mount 和 docker managed volume。

「Source 就是该 volume 在 host 上的目录」 当容器申 请 mount docker manged volume 时,docker 都会在var/lib/docker/volumes 下生成一个目录(如:/var/lib/docker/volumes/b3ed2d6d09750f5b8ef4ea613ba38f2511ba1c122ff3db339a061c0ed0d6d41d/_data),这个日录就是 mount 源。 同时,如果 mount point 指向的是已有的目录(如上/usr/local/apache2/htdocs),原有的数据会被复制到 volume 中,所以我们 host 上生成的目录中的内容,会和 /usr/local/apache2/htdocs 中完全一致。 ❞

docker managed volume 创建过程:

  • 容器启动时,使用 -v ,告诉 docker 需要一个 data volume,并 mount 到 /a :。
  • docker 在var/lib/docker/volumes 中生成一个随机目录作为 mount源。
  • 如果/a 已经存在,则将数据复制到 mount 源。
  • 将 volume mount 到 /a。

数据共享

容器与 host 共享数据

  1. bind mount

例如前面的 httpd 例子,可直接将需要共享的目录 mount 到容器。

  1. docker managed volume

这种类型的 data volume 是在容器启动的时候才生成的,所以需要将共享的数据复制到 volume 中,如:

上面我们使用的是 docker cp ,我们还可以直接通过 linux 的 cp 命令复制到 /var/lib/docker/volumes/...中。

容器之间共享数据

1. bind mount

将共享数据放在 bind mount 中,然后将其 mount 到多个容器。

2. volume container

volume container 是专门为了给其他容器提供 volume 的容器,它提供的卷可以是 bind mount,也可以是 docker managed volume。

我们创建(docker create ...)一个名为 vc_data 的容器,vc 是 volume container 的缩写。创建容器,但不运行,因为 此容器只是提供数据,并不需要运行,如下:

容器 mount 两个 volume:

  • bind mount
  • docker managed volume

docker inspect 看下俩 volume:

--volumes-from

其他容器通过 --volumes-from 来使用 vc_data 这个 volume container :

以 httpd1 为例,看下 volume:

数据共享效果:

3. data-packed volume container

上面的 volume container 的数据其实还是在 host 里,而 data-packed volume container 是将数据打包到镜像中,再通过 docker managed volume 共享。

通过如下 Dockerfile 构建镜像 datapacked :

❝ADD 将静态文件添加到容器目录 usr/local/apache2/htdocs. VOLUME 的作用与 -v 等效,用来创建 docker managed volume,mount point为 usr/local/apache2/htdocs,因为这个目录就是 ADD 添加的目录,所以会将已有数据复制到volume中。 ❞

用新镜像创建 data-packed volume container:

Dockerfile 中我们使用了 VOLUME 指令,这里就不需要指定 volume 的mount point 了。启动 httpd 容器并使用 data-packed volume container:

❝容器能够正确读取volume中的数据。data-packed volume container 是自包含的,不依赖 host,具有很强的移植性,非常适合只使用静态数据的场景,比如应用的配置信息、Web server的静态文件等。 ❞

Data Volume 管理

Data Volume 中存放的是重要的应用数据,我们应该重视对 volume 的备份、恢复、销毁等操作。

备份

volume 其实就是 host 文件系统中的资源,备份的话实际上就是对文件系统的备份。

恢复

volume 的恢复,只需要将之前备份数据复制到 volume 中即可。

销毁

需要注意的是,volume 删除后数据便找不回来了。

  1. bind mount

docker 不会销毁 bind mount,删除数据的工作只能由 host负责。

  1. docker managed

在执行docker rm 删除容器时使用 -v 参数,docker会将容器使用到的 volume 一起删除,「前提是该 volume 没有其他容器使用」,这样可以做到对数据的保护。

如果没有使用 -v 参数,那么就会产生孤儿 volume,后期我们可以使用 docker volume 命令对其维护。

  • docker volume create :创建一个卷
  • docker volume inspect :显示一个或多个卷的详细信息
  • docker volume ls :列出卷
  • docker volume prune :删除所有未使用的卷
  • docker volume rm :删除一个或多个卷
    • docker volume rm $(docker volume ls -q) :批量删除孤儿 volume

❝删除一个或多个卷。无法删除容器正在使用的卷。 ❞

总结

  • storage driver : 容器内的存储,管理镜像层和容器层
    • docker info 命令:查看系统默认的 driver
  • Data Volume :容器外的存储
    • bind mount :手动挂载目录
    • docker managed volume :docker 启动时自动生成目录
  • docker volume 命令:管理卷
  • docker inspect 命令:查看容器的配置信息

图片及部分相关技术知识点来源于网络搜索,侵权删!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微客鸟窝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Docker实践(三):数据持久化及共享
 在Linux上运行的Docker有三种不同的方式将数据从 Docker Host挂载到 Docker 容器,并实现数据的读取和存储:volumes、bind mounts、tmpfs。  
loong576
2019/09/10
9230
Docker实践(三):数据持久化及共享
Docker存储
前言 上一篇文章中简单总结了一下docke的基础使用方法,这次我来总结一下有关docker存储方面的相关知识。本文同样建立在CloudMan的系列教程之上,有兴趣的可以直接移步。 有些人可能觉得这个很简单,存储就是硬盘嘛,docker容器既然也是操作系统,那就直接存在他的容器的文件系统里就好了。看似没错,但问题在于docker的容器是无状态的,当容器重启的时候里面的数据会全部清除,如果是一些静态的数据,我们可以在build镜像的时候直接写死,但是对于数据库、日志等数据实时变化的镜像我们就不能通过这种方式来保
魏守峰
2018/04/28
1.1K0
4-数据的持久化和共享互连
正常情况下,删除容器,容器中所有的文件也会被删除。所以需要能持久化容器中数据的方法,也就是数据卷 数据卷(Data Volume)的作用:
jackxiao
2021/11/16
7020
Docker 存储
-v ~/htxxx:/usr/local/hcc -v /hx:/xx:ro #指定为只读
用户5760343
2019/10/08
4050
Docker 存储
005.Docker存储管理
因为Docker 采用 AFUS 分层文件系统时,文件系统的改动都是发生在最上面的容器层,在容器的生命周期内,它是持续的,包括容器在被停止后。但是,当容器被删除后,该数据层也随之被删除了。因此,Docker 采用 volume (卷)的形式来向容器提供持久化存储。Docker volume 有如下几种形态。
木二
2019/07/26
8950
云原生系列 六【轻松入门容器基础操作】
③删除容器,验证数据持久化。 使用docker rm删除容器,(删除前先停止容器),并在宿主机挂载源查看文件内容。
用户10216580
2022/12/06
4090
云原生系列 六【轻松入门容器基础操作】
Docker学习笔记之docker volume 容器卷的那些事(一)
接触 docker 的朋友都知道,docker 镜像是以 layer 概念存在的,一层一层的叠加,最终成为我们需要的镜像。但该镜像的每一层都是 ReadOnly 只读的。只有在我们运行容器的时候才会创建读写层。文件系统的隔离使得:
Jetpropelledsnake21
2019/03/19
1.9K0
Docker学习笔记之docker volume 容器卷的那些事(一)
详解Docker——你需要知道的Docker进阶知识三
针对上述的缺点,有些数据,例如数据库文件,我们不应该将其保存在镜像或者容器的可写层中。Docker 提供三种不同的方式将数据从 Docker 主机挂载到容器中,分别为卷( volumes),绑定挂载( bind mounts),临时文件系统( tmpfs)。很多时候, volumes 总是正确的选择。
云原生
2021/05/31
8260
一文了解 Docker 数据卷
Docker 镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker 会加载只读镜像层并在其上(镜像栈顶部)添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。
用户1278550
2020/11/26
1.8K0
云原生之Docker容器的存储管理
一、检查本地docker环境1.检查宿主机系统版本[root@docker ~]# cat /etc/centos-releaseCentOS Linux release 7.6.1810 (Core) 2.检查docker版本[root@docker ~]# docker -vDocker version 20.10.18, build b40c2f6二、创建一个测试httpd容器1.创建测试目录[root@docker ~]# mkdir -p /data/test[root@docker ~]# cd
江湖有缘
2023/01/21
7450
云原生之Docker容器的存储管理
No zuo no die ,用Docker安装Mysql
回显,GENERATED ROOT PASSWORD: Axegh3kAJyDLaRuBemecis&EShOs
birdskyws
2018/09/12
1.2K0
No zuo no die ,用Docker安装Mysql
Docker容器入门操作介绍
Docker是一个C/S结构的项目,有Docker Client、RESTAPI、Docker Server、images、container、 volumes、network组成。
王先森sec
2023/04/24
4290
Docker容器入门操作介绍
【Docker】:Docker 数据管理 - Volumes & Bind Mounts
This will download and start a GitLab container and publish ports needed to access SSH, HTTP and HTTPS. All GitLab data will be stored as subdirectories of GITLAB_HOME. The container will automatically restart after a system reboot. (译:所有 GitLab 的数据都会被存储到宿主机 GITLAB_HOME 的子目录中)
WEBJ2EE
2022/01/04
1.5K0
【Docker】:Docker 数据管理 - Volumes & Bind Mounts
k8s(5)-kubernetes存储系统Volume和PV
K8S的存储系统从基础到高级又大致分为三个层次:普通Volume,Persistent Volume 和动态存储供应。
黄规速
2023/03/06
1.6K0
k8s(5)-kubernetes存储系统Volume和PV
Docker中Web集群迁移及共享数据
用物理机ip访问这些端口,来验证物理机的cyj目录是否被每台容器的htdocs挂载使用
全栈程序员站长
2022/06/29
3700
Docker中Web集群迁移及共享数据
Docker-Volume
存储卷(volume)是容器上的一个或多个目录,此类目录可绕过联合文件系统,与宿主机上的某个目录绑定(关联)。
懒人的小脑
2019/10/15
6290
Docker-Volume
Docker学习笔记之Docker的数据管理和存储
数据是应用程序重要的产出,所以很好的管理和存储数据,是对应用程序劳动结果的尊重。特别是在大数据时代,所有的数据都是重要的资产,保护好数据是每个开发者必须掌握的技能。我们知道,在 Docker 里,容器运行的文件系统处于沙盒环境中,与外界其实是隔离的,那么我们又要如何在 Docker 中合理的通过文件与外界进行数据交换呢?在这一小节中,我们就来介绍 Docker 中与文件数据有关的内容。
Jetpropelledsnake21
2019/03/04
9870
Docker学习笔记之Docker的数据管理和存储
Docker实践之07-数据管理
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特性:
编程随笔
2022/09/09
4000
Docker应用程序数据管理与持久化
默认情况下,container内部新创建文件或者修改文件,结果会保存在container的可读写层中,这意味着:当container消失时,与container一体的可读写层也一并消失,数据并没有持久化。并且,当一个container需要其它container中可读写层的数据时,取出操作非常困难。
Power
2025/03/03
1180
docker storage driver
使用docker目录创建一个volume,并将该volume挂载到容器的/my_Cvol目录下
charlieroro
2020/03/24
1.4K0
docker storage driver
相关推荐
Docker实践(三):数据持久化及共享
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档