docker存储配置与管理--项目三
一、Docker存储概念
1、容器本地存储与Docke存储驱动
容器本地存储:每个容器都被自动分配了内部存储,即容器本地存储。采用的是联合文件系统。通过存
储驱动进行管理。
容器本地存储空间:分层结构构成,由一个可写容器层和若干只读的镜像层组成。
联合文件系统:Docker的一种底层技术,由存储驱动(Storage Driver)实现。相应的存储驱动有aufs、overlay、overlay2、devicemapper、btrfs、zfs、vfs等。
存储驱动:控制镜像和容器在 docker 主机上的存储和管理方式。
每个Docker主机只能选择一种存储驱动,不能为每个容器选择不同的存储驱动。
(1)查看主机支持的存储驱动
语法:docker info
点击查看代码
Storage Driver: overlay2 # 存储驱动是overlay2
Backing Filesystem: xfs # 底层文件系统是xfs
Supports d_type: true # 支持d_type
Native Overlay Diff: true
userxattr: false
(2)Linux发行版支持的存储驱动
您的操作系统和内核可能不支持每个存储驱动程序。
通常,以下配置适用于最新版本的Linux发行版:

(3)可支持的文件系统
关于Docker,备份文件系统是/var/lib/doker/所在的文件系统。某些存储驱动程序仅适用于特定的备份文件系统。

(4)更改现有的存储驱动
注意:
主机只能选择一个存储驱动。
系统版本和存储驱动的兼容问题。
更改存储驱动会使得现有的容器和镜像不可访问(原因:每种存储驱动存储镜像层的
位置是不同的)
但恢复存储驱动,可以再次访问之前的镜像和容器
2、容器和非持久化数据
非持久化数据:不需要保存的数据。容器本地存储中的数据属于非持久化数据。
容器创建时会创建非持久化存储,非持久化存储自动创建,从属于容器,生命周期与容器相同。删除容器也会删除全部非持久化数据。
非持久化数据存在问题:
- 这类数据从属于容器,生命周期与容器相同,会随着容器的删除而被删除.(易丢失)
- 当该容器不再运行时,数据不会持久保存,如果另一个进程需要,则可能很难从该
容器中获取数据。(难获取) - 容器的可写层与运行容器的Docker主机紧密耦合,无法轻松地将数据转移到其他位
置。(难转移) - 写入容器的可写层需要Docker存储驱动管理文件系统。存储驱动使用Linux内核提供的联合文件系统,其性能不如直接写入主机文件系统的Docker卷。(读写性能差)
3、容器和持久化数据
持久化数据:需要保存的数据。例如:日志、业务数据、客户信息等有用的数据。
外部存储:Docker通过将主机中的文件系统挂载到容器中供容器存取,从而实现持久化数据存储。
容器持久化数据存储方式:Docker目前支持卷、绑定挂载,这两种挂载类型实现容器的持久化。
卷(数据卷):Docker中进行持久化数据存储的最佳方式。本质是Docker主机文件系统中的目录或文件直接挂载到容器的文件系统中。
特点:
1.卷和容器是解耦的,可以独立地创建并管理卷
2.卷不与容器的生命周期绑定(容器的停止删除和卷无关)
3.可以将任意数量的卷装入容器,多个容器也可以共享一个或多个卷(多对多关系)
4、挂载类型
往容器中挂载的外部文件系统主要有:卷、绑定挂载、tmpfs挂载。无论哪种挂载,对容器内部来说是一样的,都会显示为文件或目录。
(1)卷
卷是Docker持久化存储数据的最佳方式。卷支持使用卷驱动,可以让用户将数据存储在远程主机或云提供商处等。
卷存储在主机文件系统中由Docker管理的位置,在Linux主机上该位置默认是
/var/lib/docker/volumes 目录。
可以以命名方式或匿名方式挂载卷:
- 匿名卷(Anonymous Volumes):首次挂载容器未指定名称,Docker为其随机指定一个唯一名称。
- 命名卷(Named Volumes):指定明确名称,和匿名卷其他特性相同。
卷适合以下应用场景:
- 在多个正在运行的容器之间共享数据。(数据共享)
- 当Docker主机不能保证具有特定目录结构时,卷有助于将Docker主机的配置与容器运行时解耦。(构建新目录与主机不同)
- 当需要将容器的数据存储到远程主机或云提供商处,而不是本地时。(可以远程挂载卷,公有云、灾备等场景)
- 当需要在两个Docker主机之间备份、恢复或迁移数据时。(主机间备份迁移)
(2)绑定挂载
绑定挂载可以存储到主机系统的任意位置,甚至会存储到一些重要的系统文件或目录中。
特点:
- 主机上进程或容器可以随时修改。
- 相比卷,功能更受限、性能更高。
- 绑定挂载运行访问敏感文件。
绑定挂载适合以下应用场景。
- 在主机和容器之间共享配置文件。
- 在Docker主机上的开发环境和容器之间共享源代码或构建工件。
- 当Docker主机上的目录结构保证与容器要求的绑定挂载一致时。
(3)tmpfs挂载
tmpfs挂载仅限于运行Linux操作系统的Docker主机使用,它只存储在主机的内存中,不会被写到主机的文件系统中,因此不能持久保存容器的应用数据。
在不需要将数据持久保存到主机或容器中时,tmpfs挂载最合适。
如果容器产生了非持久化数据,那么可以考虑使用tmpfs挂载避免将数据永久存储到任何位置,并且通过避免写入容器的可写层来提高容器的性能。
二、Docker卷管理
docker volume 是Docker卷的管理命令。
创建卷的时候主机上的Docker根目录(linux默认是/var/lib/docker)下的volumes子目录内会生成一个以卷名命名的子目录,这个子目录里面再创建一个_data的子目录作为卷的数据存储路径。卷名必须唯一,不同的卷驱动不能使用相同的卷名。
1、创建卷
语法:docker volume create 卷名
选项:
-d //说明卷驱动名称(默认是'local') --label list //设置卷元数据
-o //设置驱动特殊选项
案例1:创建tmpfs卷,大小100m,uid为1000

案例2:创建匿名卷
语法:ddocker volume create
2、查看卷列表
使用 docker volume ls 命令列出当前的卷。
3、查看卷详细信息
使用 docker volume inspect 命令查看卷详细信息。包含卷在Docker主机文件系统中的具体位置。
4、删除卷
使用 docker volume rm 删除指定卷(不能删除正在被容器使用的卷)。
使用 docker volume prune 删除未被容器或服务使用的所有卷。
使用 dicker volume rm 删除未被使用的卷或空白卷
语法:docker volume rm 卷名 //删除指定卷
选项: -f //强制删除
三、容器文件系统挂载
使用 docker run 或 docker create 命令的相关选项将外部的文件系统挂载到容器中。
早期版本:
- 卷和绑定挂载都可以通过 -v 和 --mount 选项挂载到容器中,主要是两者的语法的细微区别。
- -v 用于独立容器, --mount 用于集群服务。
- tmpfs挂载可以使用 --tmpfs 选项。
docker 17.06或更高版本:
- 建议所有的容器或服务,绑定挂载、卷、tmpfs都使用 --mount 选项。(语法清晰、定制详细)
- --mount 选项也可以用于独立容器。
-v 和 --mount 的区别:
- -v 语法是将选项组合在一个字段中, --mount 的语法是将它们分开。
- --mount 采用键值对写法支持更多的设置选项, -v 写法更加简洁。
1、-v(--volume)选项
[root@hqs ~]# docker run(create)
-v, 【卷】:【容器挂载目的地】:【读写权限】
第一个host-src字段表示挂载源,来自主机的文件系统,为绝对路径或名称变量。
第二个container-dest字段表示挂载目标,即容器的挂载点,可以是目录或文件路径(绝对路径)
第三个options字段可选,以逗号分隔选项列表:
如:[rw|ro], [z|Z], [[r]shared|[r]slave|[r]p
rw:读写模式??
ro:只读模式
nocopy:禁止自动复制到卷存储地址
注意:
1.可以挂载主机现有的目录文件,如果不存在,则自动创建
2.mount选项则不可以自动创建目录文件
案例:

2.--mount 选项
绑定挂载、卷、tmpfs类型都使用 --mount 选项。
--mount 选项的参数由多个由逗号分隔的键值对组成
特殊键如下:
type:指定要挂载的类型,值可以是bind(绑定挂载)volume(卷)或tmpfs。
source(或src):指定挂载源
destination(或dst、target):指定挂载目标,即容器中的挂载点,必须采用绝对路径的形式
readonly:指定只读选项,表示源以只读方式挂载到容器中。
其他键:可以被多次指定,由若干键值对组成。卷和绑定挂载有不同的键。
注意:
1.指定主机现有的卷,如果没有则是自动创建卷
2.如果将一个空白的卷挂载到容器的文件目录中,会将里面的文件复制到卷中
3.如果挂载卷时,没有指定卷名称,则会生成一个匿名卷
4.当挂载主机目录文件时,不可以自动生成目录文件。
绑定卷案例:

绑定挂载案例:
注意:挂载指定主机文件,为绝对路径

3、备份、恢复和迁移数据卷
可以通过卷容器(Volume Container)实现卷的备份、恢复和迁移。
卷容器(数据卷容器):一种特殊的容器,专门用来将卷(或绑定挂载)提供给其他容器挂载。
--volumes-from 选项,创建容器时使用这个选项:
- 可基于 卷容器 创建一个新的容器;
- 新容器挂载 卷容器 提供的卷。
创建卷容器dbstore,该卷容器挂载一个匿名卷
[root@hqs tmp]# docker create -v /dbdata --name dbstore busybox /bin/sh
总结:
1.如果将主机上的目录绑定挂载到容器上的非空目录,则容器载的目录中的现有内容会被绑定挂载(主机上的目录)所遮盖。没有删除,只是被挂载期间无法访问
2. 无论主机上的目录是否为空,绑定挂载到容器中的非空目都会发生被遮盖的情况。
docker存储配置与管理--项目三的更多相关文章
- Docker集群管理(三)—— docker swarm mode基础教程
docker从1.12版(及后续版本)集成了swarmkit.可以方便的实现docker集群.它有哪些特点呢: 集成了集群功能 分散设计:manager和worker两种节点. 声明式服务模式 可伸缩 ...
- docker swarm实现java项目的发布/滚动更新/回滚/镜像管理
使用docker swarm滚动更新java项目,部署集群,这一切的前提是使用Jenkins+maven进行项目打包,分发等功能 具体可以参考我的另外三篇文章 https://www.cnblogs. ...
- docker部署项目 <三>
使用docker运行一个控制台项目,新建一个控制台测试项目 一.安装mono,直接在网易镜像中心找下载路径 docker pull hub.c..com/library/mono:latest 二.安 ...
- 使用Visual Studio Team Services敏捷规划和项目组合管理(三)——使用Kanban板
使用Visual Studio Team Services敏捷规划和项目组合管理(三)--使用Kanban板 1.要查看Kanban板,请单击Work>Backlogs页面上的Board 链接. ...
- Docker学习第三天(Docker数据卷管理)
1.Docker数据卷管理 在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中.目前Docker提供了三种 ...
- 使用Docker部署Spring boot项目
Docker是一个使用广泛的Linux容器管理工具包,它允许用户创建镜像,并将其容器实例化.通过本指南,我们可以学习到如何使用Docker部署Spring Boot项目. 先决条件 开发之前,你必须具 ...
- SpringCloud教程 | 第十一篇: docker部署spring cloud项目
版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 ,博主地址:http://blog.csdn.net/forezp. http://blog.csdn.net/forezp/art ...
- 史上最简单的SpringCloud教程 | 第十一篇: docker部署spring cloud项目
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2017/07/12/sc11-docker/ 本文出自方志朋的博客 一.docker简介 ...
- Docker如何部署Python项目
Docker 部署Python项目 作者:白宁超 2019年5月24日09:09:00 导读: 软件开发最大的麻烦事之一就是环境配置,操作系统设置,各种库和组件的安装.只有它们都正确,软件才能运行.如 ...
- SpringCloud 教程 (四) docker部署spring cloud项目
一.docker简介 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机). ...
随机推荐
- 【产品兼容认证】WhaleStudio 成功兼容TiDB数据库软件
平凯星辰和白鲸开源宣布成功完成产品兼容认证 北京,2023年12月27日 - 平凯星辰(北京)科技有限公司(以下简称平凯星辰)旗下的 TiDB 产品与白鲸开源的 WhaleStudio 已成功完成产品 ...
- 手把手教你掌握SeaTunnel k8s运行Zeta引擎本地模式的技巧
转载自小虾米0.0 导读:随着Kubernetes的普及和发展,越来越多的企业和团队开始使用Kubernetes来管理和部署应用程序.然而,Kubernetes的默认工作方式可能不是最佳的选择,尤其是 ...
- .NET 8 中利用 MediatR 实现高效消息传递
前言 MediatR 是 .NET 下的一个实现消息传递的库,轻量级.简洁高效,用于实现进程内的消息传递机制.它基于中介者设计模式,支持请求/响应.命令.查询.通知和事件等多种消息传递模式.通过泛型支 ...
- 屏蔽RaiDrive的广告
RaiDrive 广告域名:ads.raidrive.com 在 HOSTS 添加 127.0.0.1 ads.raidrive.com 或者在代理中设置为阻止即可. 效果: 补 最新版(2023.9 ...
- typeof、offsetof、container_of
typeof 用于获取一个对象的类型,比如: unsigned int a = 1; // typeof (a) is unsigned int short b = 2; // typeof (b ...
- C语言实现url解析小实例
一.前言 前面一口君写了一篇关于url的文章: <一文带你理解URI 和 URL 有什么区别?> 本篇在此基础上,编写一个简单的用于解析url的小例子, 最终目标是解析出URL中所有的数据 ...
- 7. 从0学ARM-GNU伪指令、代码编译,lds使用
<嵌入式工程师到底要不要学习ARM汇编指令?arm学习文章汇总> <到底什么是Cortex.ARMv8.arm架构.ARM指令集.soc?一文帮你梳理基础概念[科普]> 关于A ...
- 十五分钟两百行代码,手写一个vue项目全局通用的弹框
前言: 我们在写vue项目时,弹框是非常常用的组件,并且在同一个项目中,弹框大多类似.所以我们可以抽离封装出一个通用的弹框: 因为vue3可向下兼容,所以作者这边会使用vue2的写法,vue3写法大同 ...
- vue导出word文档
具体需求 在我的疫情可视化项目中有一个功能需要导出word文档,在页面点击按钮后处理数据生成word文件,然后自动下载文档. 实现步骤 多番查询后发现前端导出word,使用docxtemplater较 ...
- 【YashanDB知识库】ycm托管数据库时报错OM host ip:127.0.0.1 is not support join to YCM
问题现象 托管数据库时检查报错OM的IP是127.0.0.1,不支持托管到YCM OM 问题的风险及影响 导致数据库无法托管监控 问题影响的版本 问题发生原因 安装数据库时修改了OM的监听ip为127 ...