小白快速上手 Docker 03 | Docker数据卷

数据卷

在前面使用Docker时,可能会遇到以下几个问题:

  1. 当Docker 里的容器挂了以后打不开,这时候只有删除该容器了,但删除容器会连容器中的产生的数据也一起删除了,大部分场景下这是不能接受的。
  2. Docker容器与容器之间不能直接交换数据。
  3. 容器和宿主机之间不能共享文件数据,如以nginx容器为例,需要修改默认页面内容时,需要先进入容器内部,再修改对应的index.html文件,极其不方便。

举个例子,假设我们的应用程序需要一个 MongoDB 数据库,因此,我们运行一个mongo容器:

docker run -d mongo

现在,如果容器被删除(无论是有意还是无意),我们将丢失 MongoDB 数据库中的所有数据。

这不是我们想要的。我们可能需要将数据持久地存储在数据库中,即使容器被删除了。

基于以上痛点,出现了容器数据卷的技术。

数据卷是宿主机中的一个目录或者文件,当容器目录挂载到宿主机的某个目录之后,宿主机的这个目录就成为了一个数据卷,这样容器和宿主机之间的文件就会同步。容器删除之后,容器产生的数据还会保留在宿主机上。这就解决了以上的问题。

数据卷类型

Docker 主要提供了两种不同的方式将数据从 Docker Host 挂载到 Docker 容器,来实现数据持久性:

  • 绑定挂载(Bind Mount)
  • 卷(Volumes)

Docker 卷主要有两种类型:

  • 匿名卷
  • 命名卷

中有三种数据卷类型:Bind Mount、匿名数据卷、命名数据卷,一般推荐大家使用 Bind Mount数据卷 方式持久化数据。

使用容器数据卷非常简单,只需在使用docker run命令运行容器的时候加上 -v 选项即可。

Bind Mount

bind mount自docker早期便开始为人们使用了,用于将host上的文件或目录被挂载到容器中。挂载时需要我们指定文件或目录在 host 上的完整路径。

docker run -d -v 主机目录:容器目录 镜像名称

通过这种方式运行命令后,会在宿主机上自动创建相应的目录,在宿主机上该目录下创建或者修改文件都会自动同步到容器中去。

下面通过Bind Mount形式启动一个nginx容器,并将宿主机目录/Users/qin/docker/volume/nginx_90映射到容器的/usr/share/nginx/html/目录。

进入到容器,查看/usr/share/nginx/html目录,发现容器内文件和宿主机内文件一致。

下面修改宿主机的index.html文件中v1改成v2,容器内对应的index.html文件内容也同步更改了:

删除容器后,数据卷还存在,这样保证了容器中相关数据的持久化。

需要注意的是:使用Bind Mount,宿主机文件夹将覆盖容器文件夹内容,因此如果宿主机文件夹为空,需要先将容器中要映射的文件复制到宿主机文件夹中。

Volumes

匿名数据卷

下面介绍如何通过匿名数据卷形式启动一个nginx容器,并将容器的/usr/share/nginx/html/目录映射到宿主机指定目录。

下面指令中的/usr/share/nginx/html是容器中的的路径,启动成功后docker 会将匿名卷映射到宿主机的某个途径,可以通过docker inspect查看到这个路径。

qin@linux-01:~$ docker run -itd -p 82:80  -v /usr/share/nginx/html  --name  nginx_82_anonymous_volume  nginx

匿名数据卷的优点在于,它们不需要用户手动管理。如果容器启动时使用了 --rm 选项,容器停止时,容器被自动删除,匿名卷也会自动被删除。(注意直接通过docker rm删除容器匿名卷不会被删除,只有通过docker stop停止容器才会将匿名卷删除)

但是如果容器启动时没有–rm选项,即使使用命名 docker stop/rm my_container 停止了容器,匿名卷不会被自动删除。

命名数据卷

与匿名卷相反,命名数据卷不会被附加到具体容器上,如果容器被删除,命名卷会保留。

qin@linux-01:~$ docker run -itd --rm -p 86:80  -v nginx_name_volume:/usr/share/nginx/html  --name  nginx_86_name_volume  nginx

此外需要注意的是不能在 Dockerfile 内创建命名卷,只能在运行容器时使用-v 选项指定。

卷和绑定挂载的读写权限

默认情况下,卷和绑定挂载都是可读写的,这意味着容器不仅可以读取主机上挂载的数据,还可以修改这些数据。

有时这可能不是我们所希望的,在某些情况下,你可能希望容器只具备读取权限,而不允许进行写入。

可以在 Docker 命令中的挂载选项后面添加:ro来指定挂载为只读。

例如,假设你有一个本地目录/path/to/local/html,你想把它挂载到容器内的/usr/share/nginx/html目录,并且希望这个挂载是只读的,你可以使用以下命令:

docker run -v /path/to/local/html:/usr/share/nginx/html:ro -d nginx

这条命令中的:ro确保了容器只能读取/usr/share/nginx/html中的内容,而不能修改它。

同样,如果你使用的是命名卷,你可以这样挂载:

docker run -v nginx-vol:/usr/share/nginx/html:ro -d nginx

多个容器间共享数据

另一个与持久性相关的问题是如何在多个容器之间共享文件/目录。

使用绑定挂载,容器只能在单个主机/机器内共享文件。

相比之下,使用卷可以实现更灵活的文件共享。通过卷,来自不同主机的容器可以共享底层数据。例如,可以使用 NFS(网络文件系统)或 S3(Amazon Simple Storage Service)等解决方案,让多个主机上此类的容器访问同一份数据。

案例

最后让我们看看如何使用绑定挂载和卷解决我们之前讨论过的 MongoDB 持久性问题。

要使用绑定挂载,我们需要指定宿主机的路径(/path/on/your/host)映射到容器内的/data/db目录。

docker run -v /path/on/your/host:/data/db -d mongo

使用匿名卷则不需要指定宿主机的路径:

docker run -v /data/db -d mongo

第一次运行时,Docker 会自动创建一个具有随机名称的新卷。

使用命名卷需要指定卷的名称,在本例中卷的名称指定为mongo_data

docker run -v mongo_data:/data/db -d mongo

如果指定名称的卷在本地不存在,则会自动创建。

数据卷相关命令

docker提供了一系列命令用于Docker数据卷管理,这些命令都是以docker volume开头,理解和熟练运用这些命令,将有助于我们高效地管理容器数据,确保数据的持久性和一致性。

#查看系统中有哪些数据卷
docker volume  ls#删除指定的一个或者多个数据卷
docker volume  rm 数据卷名#docker volume prune 命令删除所有没有被挂载到容器的数据卷,不管该数据卷是具名的还是匿名的。
docker volume prune#查看指定数据卷的信息 
docker volume inspect 数据卷名#创建一个数据卷,该数据卷并没有挂载到任何容器
docker volume create 数据卷名

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

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

相关文章

【图论】1 (最小生成树虚拟点思想)C.戴森球计划 题解

一. 题目 题目描述 输入输出格式 样例 样例1 样例2 & 样例解释 数据范围 二. 思路 对于前20%数据 解法 因为保证了 x i 1 x_i 1 xi​1,也就是说这些点都在 x 1 x 1 x1 这条直线上。 那么最优解必定是在 c i c_i ci​ 最小的点上建发电站&#xff0c…

4.人员管理模块(开始预备工作)——帝可得管理系统

目录 前言一、需求分析1.页面原型2.创建SQL 二、使用若依框架生成前后端代码1.添加目录菜单2.添加数据字典3.配置代码生成信息4.下载代码并导入项目5.快速导入方法 三、 总结 前言 提示:本篇讲解人员管理模块的开发的预备工作,包括需求分析、生成代码、…

Android 10.0 系统framework层控制传感器开启和禁用功能实现

1.前言 在10.0的系统rom定制化开发中,对于系统传感器,光线,距离,重力等传感器的使用过程中,在某些产品 做定制的时候,需要控制这些传感器的使用情况,所以就需要看下怎么样限制传感器的使用功能, 2.系统framework层控制传感器开启和禁用功能实现的核心类 frameworks\…

uniapp+Android面向网络学习的时间管理工具软件 微信小程序

目录 项目介绍支持以下技术栈:具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是:数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 用户功能…

最新版本SkyWalking【10.1.0】部署

这里写目录标题 前言前置条件启动Skywalking下载解压启动说明 集成Skywalking Agent下载Agent在IDEA中添加agent启动应用并访问SpringBoot接口 说明 前言 基于当前最新版10.1.0搭建skywalking 前置条件 装有JDK11版本的环境了解SpringBoot相关知识 启动Skywalking 下载 地…

golang grpc进阶

protobuf 官方文档 基本数据类型 .proto TypeNotesGo Typedoublefloat64floatfloat32int32使用变长编码,对于负值的效率很低,如果你的域有可能有负值,请使用sint64替代int32uint32使用变长编码uint32uint64使用变长编码uint64sint32使用变长…

Linux:无法为立即文档创建临时文件: 设备上没有空间

虚拟机磁盘空间不足解决记录 1、问题描述2、问题解决 1、问题描述 在命令行输入命令按Tab键时出现如下报错: 很明显,设备上没有空间,即磁盘空间不足。通过命令查看具体情况如下: df -h2、问题解决 首先想到的是虚拟机扩容。关机虚…

numpy 逻辑运算方法介绍

在 NumPy 中,逻辑运算方法用于对数组中的元素进行逻辑操作,通常用于布尔数组,也可用于数值数组,非零值视为 True,零值视为 False。常见的逻辑运算方法有: 1. numpy.logical_and 逐元素进行逻辑与运算&…

每日学习一个数据结构-树

文章目录 树的相关概念一、树的定义二、树的基本术语三、树的分类四、特殊类型的树五、树的遍历六、树的应用场景 树的遍历一、前序遍历二、中序遍历三、后序遍历使用java代码实现遍历总结 树的相关概念 树是一种重要的非线性数据结构,在计算机科学中有着广泛的应用…

C++IO流

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 CIO流 收录于专栏 [C进阶学习] 本专栏旨在分享学习C的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. C语言的输入与输出 2. 流是什…

(PyTorch) 深度学习框架-介绍篇

前言 在当今科技飞速发展的时代,人工智能尤其是深度学习领域正以惊人的速度改变着我们的世界。从图像识别、语音处理到自然语言处理,深度学习技术在各个领域都取得了显著的成就,为解决复杂的现实问题提供了强大的工具和方法。 PyTorch 是一个…

大数据分析入门概述

大数据分析入门概述 本文旨在为有意向学习数据分析、数据开发等大数据方向的初学者提供一个学习指南,当然如果你希望通过视频课程的方式快速入门,B站UP主戴戴戴师兄的课程质量很高,并且适合初学者快速入门。本文的目的旨在为想要了解大数据但…

C语言基础(7)之操作符(1)(详解)

目录 1. 各种操作符介绍 1.1 操作符汇总表 2. 移位操作符 2.1 移位操作符知识拓展 —— 原码、反码、补码 2.2 移位操作符讲解 2.2.1 右移操作符 ( >> ) 2.2.2 左移操作符 ( << ) 3. 位操作符 3.1 & (按位与) 3.2 | (按位或) 3.3 ^ (按位异或) 3.4…

vue3 父子组件调用

vue3 父子组件调用 父组件调用子组件方法 子组件使用defineExpose将方法抛出 父组件定义 function&#xff0c;子组件通过 defineExpose 暴露方法&#xff0c;父组件通过 ref 获取子组件实例&#xff0c;然后通过 ref 获取子组件方法。 // 父组件 <template><div>…

探索Cherry键盘的FN+F9游戏模式与Ctrl+Fn功能

简言 在电竞和日常办公领域&#xff0c;Cherry键盘以其卓越的按键反馈和耐用性而闻名。今天&#xff0c;我们将深入探讨Cherry键盘的两个独特功能&#xff1a;FNF9游戏模式和CtrlFn锁定功能。 介绍 FNF9&#xff1a;一键切换游戏模式 功能介绍&#xff1a; FNF9是Cherry键…

零基础编程从哪开始学?

目录 第一、零基础怎么学习编程&#xff1f;第二、什么书籍、教程或者博主比较好 第一、零基础怎么学习编程&#xff1f; 1. 确定目的而不是语言。 首先&#xff0c;你要知道你学习编程是为了什么目的&#xff0c; 或者说你学习编程的初心是什么&#xff1f; 可能你对游戏开发…

JMeter源码解析之JMeter命令行新增命令

JMeter源码解析之JMeter命令行新增命令 需求描述 需要新增一条命令&#xff0c;能够在JMeter命令行中能够展示输入对应的JMeter命令&#xff0c;能够展示对应的命令信息 查看命令效果如下&#xff1a; apache-jmeter-5.1\bin>jmeter --? Copyright © 1999-2024 The …

深度学习每周学习总结J1(ResNet-50算法实战与解析 - 鸟类识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数&#xff1a;定义损失函数&#xff0c;学习率&a…

Python 解析 html

一、场景分析 假设有如下 html 文档&#xff1a; 写一段 python 脚本&#xff0c;解析出里面的数据&#xff0c;包括经度维度。 <div classstorelist><ul><li lng"100.111111" lat"10.111111"><h4>联盟店1</h4><p>…

资源网站分享

云计算文档中心各个方向(云计算 大数据 路由器 交换机 无线 物联网 安全 光模块 智能管理与运维 移动通信 服务器 存储 PON ICG信息通信 EPCN网关 License Server 其他产品 智能终端 传输产品 云简网络 商用终端 ALGC SMB 产品)云计算-云计算产品-云计算解决方案-新华三集团-H3…