Docker 持久化存储 Volumes

news2025/1/11 12:54:57

Docker 持久化存储 Volumes

  • 简介
  • 如何选择 -v 和 --mount
    • -v或--volume
    • --mount
  • 创建和管理卷
  • 启动带有卷的容器
  • 使用Docker Compose的卷
  • 使用卷启动服务
  • 使用只读卷
  • 备份、恢复或迁移数据卷
    • 备份卷
  • 删除卷
    • 自动删除匿名卷
    • 删除所有未使用卷


简介

官方文档: https://docs.docker.com/storage/volumes/

卷是持久化Docker容器生成和使用的数据的首选机制。虽然绑定挂载依赖于主机的目录结构和操作系统,但卷完全由Docker管理。与绑定挂载相比,卷具有以下几个优势:

  • 卷比绑定挂载更容易备份或迁移。
  • 可以使用Docker CLI命令或Docker API管理卷。
  • 卷可以在Linux和Windows容器上工作。
  • 可以在多个容器之间更安全地共享卷。
  • 卷驱动程序允许将卷存储在远程主机或云提供商上,以加密卷的内容或添加其他功能。
  • 新卷的内容可以由容器预先填充。

在这里插入图片描述


如何选择 -v 和 --mount

一般来说,--mount 更加明确和详细。最大的区别是-v 语法将所有选项组合在一个字段中,而--mount语法将它们分开。

  • 如果需要指定卷驱动程序选项,则必须使用 --mount
  • 创建服务时,使用 --mount

-v或–volume

由三个字段组成,用冒号(:)分隔。字段必须按正确的顺序排列,并且每个字段的含义不同。

docker run -d --name vtest  -v myvol2:/app:ro nginx:latest
#								[1]    [2] [3]
  • [1]: 对于命名卷,第一个字段是卷的名称,并且在给定的主机上是唯一的。对于匿名卷,第一个字段被省略,由docker 生成。
  • [2]: 第二个字段是容器中要挂载的目录或文件路径。
  • [3]: 第三个字段是可选的,是一个逗号分隔的选项列表,如ro。

–mount

由多个键值对组成,用逗号分隔,每个键值对由一个<key>=<value>元组组成。--mount语法比-v或--volume更详细,但键的顺序并不重要。

  • type 键:值可以为 bind volume tmpfs
  • source 键: 值为挂载的来源,对于命名卷,是卷的名称。对于匿名卷,此字段被省略。也可以写成为 src
  • destination 键: 值为要挂载到容器中的目录或文件的路径,也可以写成 dst 或者 target
  • readonly 选项如果存在,会以只读方式挂载到容器。也可以写成 ro
    docker run -d \
      --name=nginxtest \
      --mount source=nginx-vol,destination=/usr/share/nginx/html,readonly \
      nginx:latest
    
  • volume-opt 可以指定多次,选项名称和其值组成的键值对。

    从外部CSV解析器中转义值
    如果卷驱动程序接受以逗号分隔的列表作为选项,则必须从外部CSV解析器中转义该值。要转义volume-opt,用双引号(“)将volume-opt括起来,并用单引号(')将整个mount参数括起来。
    例如,本地驱动程序接受挂载选项作为o参数中逗号分隔的列表。此示例演示了转义列表的正确方法。

    docker service create \
        --mount 'type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=local,volume-opt=type=nfs,volume-opt=device=<nfs-server>:<nfs-path>,"volume-opt=o=addr=<nfs-address>,vers=4,soft,timeo=180,bg,tcp,rw"'
        --name myservice \
        <IMAGE>
    

创建和管理卷

  • 创建卷
    docker volume create my-vol
    
  • 列出卷
    docker volume ls
    local               my-vol
    
  • 查看卷详情
    docker volume inspect my-vol
    [
        {
            "Driver": "local",
            "Labels": {},
            "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
            "Name": "my-vol",
            "Options": {},
            "Scope": "local"
        }
    ]
    
  • 删除卷
    docker volume rm my-vol
    

启动带有卷的容器

如果用一个不存在的卷启动一个容器,Docker会创建该卷。以下示例将卷 myvol2 挂载到容器中的 /app/ 中。

  • --mount
    docker run -d \
      --name devtest \
      --mount source=myvol2,target=/app \
      nginx:latest
    
    
  • -v
    docker run -d \
      --name devtest \
      -v myvol2:/app \
      nginx:latest
    

【注】:--mount-v 示例产生的效果一样。

  • 使用 docker inspect devtest 查看docker 是否创建了卷,并正确挂载到容器中。
    "Mounts": [
        {
            "Type": "volume",
            "Name": "myvol2",
            "Source": "/var/lib/docker/volumes/myvol2/_data",
            "Destination": "/app",
            "Driver": "local",
            "Mode": "",
            "RW": true,
            "Propagation": ""
        }
    ],
    

    这表明挂载是一个卷,并且源路径和目标路径正确,权限是读写。

  • 删除容器和卷
    docker container stop devtest
    docker container rm devtest
    docker volume rm myvol2
    

使用Docker Compose的卷

  • 下面的示例展示了一个带有卷的Docker Compose服务:
    services:
      frontend:
        image: node:lts
        volumes:
          - myapp:/home/node/app
    volumes:
      myapp:
    

第一次运行docker compose up会创建一个卷。当随后运行该命令时,Docker会重用相同的卷。

  • 也可以使用docker volume create直接在Compose 外部创建一个卷,然后在docker-Compose.yml内部引用它,如下所示:
    services:
      frontend:
        image: node:lts
        volumes:
          - myapp:/home/node/app
    volumes:
      myapp:
        external: true
    
    

使用卷启动服务

启动服务并定义卷时,每个服务容器都使用自己的本地卷。如果使用本地卷驱动程序,则任何容器都无法共享此数据。但是,有些卷驱动程序确实支持共享存储。
以下示例启动一个具有四个副本的nginx服务,每个副本使用一个名为myvol2的本地卷。

docker service create -d \
  --replicas=4 \
  --name devtest-service \
  --mount source=myvol2,target=/app \
  nginx:latest
  

使用 docker service ps devtest-service 服务来验证服务是否正在运行:

docker service ps devtest-service

ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
4d7oz1j85wwn        devtest-service.1   nginx:latest        moby                Running             Running 14 seconds ago

删除服务以停止正在运行的任务:

docker service rm devtest-service

删除该服务不会删除该服务创建的任何卷。删除卷是一个单独的步骤。

docker service create 不支持 -v 或者 --volume ,必须使用 --mount


使用只读卷

设置权限

  • --mount

    docker run -d \
      --name=nginxtest \
      --mount source=nginx-vol,destination=/usr/share/nginx/html,readonly \
      nginx:latest
    
  • -v

    docker run -d \
      --name=nginxtest \
      -v nginx-vol:/usr/share/nginx/html:ro \
      nginx:latest
    
    

    有多个权限选项时,用逗号隔开。

  • 使用 docker inspect nginxtest, 查看详情,只看 Mount 部分就好。

    "Mounts": [
        {
            "Type": "volume",
            "Name": "nginx-vol",
            "Source": "/var/lib/docker/volumes/nginx-vol/_data",
            "Destination": "/usr/share/nginx/html",
            "Driver": "local",
            "Mode": "",
            "RW": false,
            "Propagation": ""
        }
    ],
    

备份、恢复或迁移数据卷

备份卷

  • 创建一个容器 dbstore

    docker run -v /dbdata --name dbstore ubuntu /bin/bash
    
  • 备份

    • 创建一个新容器并从 dbstore 容器挂载卷。
    • 将本地目录挂载到容器 /backup
    • /dbdata 的内容打包到 /backup/backup.tar 中。
      docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
      

      当命令执行结束容器停止时,dbdata 备份完成。

  • 从备份还原卷
    使用刚刚创建的备份,可以将其恢复到同一个容器,或者恢复到另一个容器。

    • 恢复到另一个容器 dbstore2
      docker run -v /dbdata --name dbstore2 ubuntu /bin/bash
      
      docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"
      

删除卷

自动删除匿名卷

删除容器时并不会自动删除匿名卷,运行容器时使用 --rm 选项自动删除匿名卷。

docker run --rm -v /foo -v awesome:/bar busybox top

--rm 可以自动删除 /foo 的匿名卷,但是命名卷 awesome 不会被删除。

如果其它容器使用 --volumes-from 绑定了匿名卷,容器删除时,匿名卷会被保留,不会被删除。


删除所有未使用卷

  • 删除所有未使用的卷释放空间
docker volume prune



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/482507.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python JS逆向篇(四)

Python JS逆向篇&#xff08;四&#xff09; 找到参数加密位置跟进window.asrsea函数结果扣取的js代码扩展 逆向主题&#xff1a;某易云评论数据&#xff0c;请求时的加密参数。 &#xff08;注&#xff1a;文章所涉及内容只做学习参考交流&#xff0c;不做除此之外的任何其它用…

正则表达式基础一

BRE(basic regular expression)&#xff1a;匹配数据流中的文本字符 普通文本匹配 特殊字符 正则表达式存在一些特殊字符&#xff0c;如需当成普通文本来匹配&#xff0c;必须加上转义&#xff0c;即反斜杠\&#xff0c;如下所示 .*[]^${}?|() 指定出现位置的字符 ^ 指定行首…

Python两三行代码轻松批量添加~防韩还是很有必要的~

人生苦短&#xff0c;我用python 一直想做一个这种系列的但是因为七七八八的事情总是忘记&#xff0c; 今天正好有空&#xff0c;来开整一下~ 首先&#xff0c; 天冷防韩是什么梗&#xff1f; 【天冷防韩】 “天冷防韩”是“天冷防寒”的谐音&#xff0c; 不过“寒”指的…

编程工具集-我的JavaScript/TypeScript/NodeJS实用工具模块

JavaScript/TypeScript编程工具集 JavaScript/TypeScript/NodeJS实用工具模块 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https…

【微服务 | 学成在线】项目易错重难点分析(媒资管理模块篇·上)

文章目录 模块整体认识架构问题分析nacos配置管理搭建nacos公用配置配置优先级网关搭建 分布式文件系统什么是分布式文件系统MinIO数据恢复测试SDK 上传图片http请求头中的content-typeRequestPart接口分析Service层的优化 上传视频断点续传技术java代码模拟分块与合并上传视频…

BFD场景作用及缺省配置

一、BFD缺省配置 表&#xff1a;BFD参数缺省值 二、BFD场景作用 表&#xff1a;BFD场景作用 三、BFD配置缺省参数汇总 1&#xff09;配置BFD单跳检测 图&#xff1a;BFD单跳检测配置流程图 执行命令bfd&#xff0c;使能全局BFD功能并进入BFD视图。缺省情况下&#xff0c;全…

30天、2000公里、400亿,“长沙国际工程机械展”竖起世界展会新地标

文|智能相对论 作者|佘凯文 2021年4月的一天&#xff0c;一台重达120吨的日立建机超大型液压挖掘机在日本的某港口装载完成&#xff0c;或许绝大多人对120吨没有概念&#xff0c;给大家解释下&#xff0c;一吨等于2000斤&#xff0c;120吨就是240000斤。金箍棒知道吧&#xf…

RocketMQ学习1

1、RocketMQ快速入门 RocketMQ是阿里巴巴2016年MQ中间件&#xff0c;使用Java语言开发&#xff0c;在阿里内部&#xff0c;RocketMQ承接了例如“双11”等高并发场景的消息流转&#xff0c;能够处理万亿级别的消息。 1.1 准备工作 1.1.1 下载RocketMQ RocketMQ最新版本&#xff…

【垃圾回收器】基于Go实现引用计数法(ReferenceCount)

不想传火的&#xff0c;可以点击下面的链接&#xff01; github:GCByGO 给我点赞嘛&#xff0c;球球了&#xff01; What This? 现象 引用计数法是一种垃圾回收算法&#xff0c;用于跟踪对象被引用的次数。在该算法中&#xff0c;每个对象都会维护一个计数器&#xff0c…

PyTorch:深度学习框架的优雅演进与设计理念

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

【Linux】文件与路径

一、Linux相关软件 xftp&#xff1a;用来传文件 xshell&#xff1a;用来敲命令 二、Linux的文件结构 windows系统下设有盘符&#xff1a;如C盘、D盘等&#xff0c;Linux没有盘符的概念&#xff0c;只有一个根目录/&#xff0c;所有文件都在它下面。 在根目录下输入命令ls&am…

PHP 入门学习笔记

现在如果问什么行业最火&#xff0c;很多人第一反应肯定就是IT。的确&#xff0c;这些年随着互联网的不断发展&#xff0c;IT热门众所周知。那么就一起来说说&#xff0c;IT行业里&#xff0c;哪些技术更热门。 一、PHP技术&#xff1a; PHP 是一种创建动态交互性站点的强有力…

2. C 语言基础

2. C 语言基础 常考面试题 int main(int argc, char ** argv)函数中&#xff0c;参数argc和argv分别代表什么意思&#xff1f;⭐⭐⭐⭐ 第一个参数&#xff0c;int型的argc&#xff0c;为整型&#xff0c;用来统计程序运行时发送给main函数的命令行参数的个数。 第二个参数&am…

深度遍历模版与广度遍历模版

深度优先遍历 //void dfs(中间容器&#xff0c;数据) //{ // if(临界走到末尾) // { // 中间容器加到最终容器 // return&#xff1b; // } // for(做选择) // { // 改变中间容器 // dfs(中间容器&#xff0c;数据) // 撤回…

Linux下编译MySQL++/mysqlpp

一、简介 MySQL&#xff08;又名mysqlpp&#xff09;是对MySQL和MariaDB C api的c封装。它建立在与标准c库相同的规范之上&#xff0c;使得处理数据库与处理std容器一样简单。MySQL还提供了一些功能&#xff0c;使用户可以在自己的代码中避免最重复的SQL排序&#xff0c;为这些…

springboot 整合rabbitMq保证消息一致性方案

rabbitMq介绍 RabbitMQ是一种开源的消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;标准&#xff0c;可用于在应用程序之间传递消息。RabbitMQ最初由LShift开发&#xff0c;现在由Pivotal Software维护。 RabbitMQ可以在多个平台上运行&#x…

计算机网络笔记:TCP协议 和UDP协议(传输层)

TCP 和 UDP都是传输层协议&#xff0c;他们都属于TCP/IP协议族。 TCP 基本概念 TCP的全称是传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP 是面向连接的、可靠的流协议&#xff08;流就是指不间断的数据结构&#xff09; TCP报文格式 TCP报文是…

图神经网络:在Cora上动手实现图神经网络

文章说明&#xff1a; 1)参考资料&#xff1a;PYG官方文档。超链。 2)博主水平不高&#xff0c;如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook。超链。提取码8888。 文章目录 代码实操1&#xff1a;GCN的复杂实现代码实操2&#xff1a;GCN的简单实现…

C++语言练习题位运算

位运算(01)基础 位运算(02)从一个 16 位的单元中取出某几位 题目描述 从一个 16 位的单元中取出某几位&#xff08;即该几位保留原值&#xff0c;其余位为 0. 使用 value 存放该 16 位的数&#xff0c;n1 为欲取出的起始位&#xff0c;n2 为欲取出的结束位。&#xff…

thinkphp6 JWT报错 ‘“kid“ empty, unable to lookup correct key‘解决办法

文章目录 JWT简介安装问题先前的代码解决办法修改后的完整代码 JWT简介 JWT全称为Json Web Token&#xff0c;是一种用于在网络应用之间传递信息的简洁、安全的方式。JWT标准定义了一种简洁的、自包含的方法用于通信双方之间以JSON对象的形式安全的传递信息。由于它的简洁性、可…