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

news2024/11/28 8:38:35

数据卷

在前面使用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.coloradmin.cn/o/2189589.html

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

相关文章

【D3.js in Action 3 精译_028】3.4 小节 DIY 实战:使用 Observable 在线绘制 D3 条形图

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一部分 D3.js 基础知识 第一章 D3.js 简介(已完结) 1.1 何为 D3.js?1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践(上)1.3 数据可…

渗透测试入门学习——使用python脚本自动跟踪csrf_token实现对网站登录界面的暴力破解

目录 写在前面 使用方法 相关代码 写在前面 最近在学习使用Burp Suite时发现其intruder模块无法实现多种模式的混合使用,就如想要暴力破解账号和口令两个区域并同时跟踪网页的csrf_token时BP似乎不能很方便的实现这一功能,于是自己在练习时就想到了用…

【DataLoom】智能问数 - 自然语言与数据库交互

探索DataLoom的智能问数功能:简化数据库查询 在数据驱动的决策制定中,数据库查询是获取洞察的关键步骤。但是,传统的数据库查询方法往往复杂且技术性强,这限制了非技术用户的使用。DataLoom的智能问数功能正是为了解决这一问题而…

【WebGis开发 - Cesium】如何确保Cesium场景加载完毕

目录 引言一、监听场景加载进度1. 基础代码2. 加工代码 二、进一步封装代码1. 已知存在的弊端2. 封装hooks函数 三、使用hooks方法1. 先看下效果2. 如何使用该hooks方法 三、总结 引言 本篇为Cesium开发的一些小技巧。 判断Cesium场景是否加载完毕这件事是非常有意义的。 加载…

Spring Boot中线程池使用

说明:在一些场景,如导入数据,批量插入数据库,使用常规方法,需要等待较长时间,而使用线程池可以提高效率。本文介绍如何在Spring Boot中使用线程池来批量插入数据。 搭建环境 首先,创建一个Spr…

自动驾驶系列—颠覆未来驾驶:深入解析自动驾驶线控转向系统技术

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

【树莓派系列】交叉编译工具、交叉编译链的安装使用

交叉编译工具、交叉编译链的安装使用 文章目录 交叉编译工具、交叉编译链的安装使用一、交叉编译1.1什么是交叉编译1.2为什么要交叉编译1.3宿主机和目标机 二、搭建交叉编译工作环境2.1安装工具链2.2配置环境变量● 配置临时环境变量● 配置永久环境变量 三、交叉编译宿主机和目…

NASA:Seasat-A 散射计(SASS)得出的风速和风向矢量数据集

目录 简介 摘要 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 SEASAT SCATTEROMETER DEALIASED OCEAN WIND VECTORS (Atlas) 简介 SEASAT散射计反回波强度(scattering)提供了对海面风速和风向的估计。SEASAT散射计被用来获取海面风场的信…

LabVIEW提高开发效率技巧----调度器设计模式

在LabVIEW开发中,针对多任务并行的需求,使用调度器设计模式(Scheduler Pattern)可以有效地管理多个任务,确保它们根据优先级或时间间隔合理执行。这种模式在需要多任务并发执行时特别有用,尤其是在实时系统…

【算法】---归并排序(递归非递归实现)

参考 左程云算法 算法导论 前言 本篇介绍 归并排序分治法 前置知识 了解递归, 了解数组。 引入 归并排序 归并排序最早是由公认的现代计算机之父John von Neumann发明的, 这是一种典型的分治思想应用。 我们先介绍分治思想 分治思想 分治思想的…

java:pdfbox 3.0 去除扫描版PDF中文本水印

官网下载 https://pdfbox.apache.org/download.html下载 pdfbox-app-3.0.3.jar cd D:\pdfbox 运行 java -jar pdfbox-app-3.0.3.jar java -jar pdfbox-app-3.0.3.jar Usage: pdfbox [COMMAND] [OPTIONS] Commands:debug Analyzes and inspects the internal structu…

(C语言贪吃蛇)7.显示贪吃蛇完整身体改进

前言 上节显示了贪吃蛇身子的三个节点,但是吃了食物后蛇身变长应该如何操作,本节给出答案。 一、贪吃蛇身体是什么? 使用链表这个数据结构来动态的显示贪吃蛇的身体。 二、对贪吃蛇身体进行改进 1.贪吃蛇身子显示 代码如下: …

信息学奥赛使用的编程IDE:Dev-C++ 安装指南

信息学奥赛(NOI)作为全国性的编程竞赛,要求参赛学生具备扎实的编程能力,而熟练使用适合的编程工具则是学习与竞赛的基础。在众多编程环境中,Dev-C IDE 因其简洁、轻量、支持C编程等特点,成为许多参赛者的常…

最新版的dubbo服务调用(用nacos做注册中心用)

一、介绍 1.1、什么是 nacos Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&a…

Java 每日一刊(第21期):反射机制

文章目录 前言动态插件系统面临的问题如何在运行时动态加载和调用类与方法设计模式的尝试引入反射 Java 反射的核心概念Class 类Constructor 类Method 类Field 类 Java 反射的应用场景框架开发插件系统序列化与反序列化动态代理测试工具 反射的优缺点反射实战动态加载类并调用方…

【hot100-java】【将有序数组转换为二叉搜索树】

二叉树篇 BST树 递归直接实现。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNo…

【C++差分数组】2381. 字母移位 II|1793

本文涉及知识点 C差分数组 LeetCode2381. 字母移位 II 给你一个小写英文字母组成的字符串 s 和一个二维整数数组 shifts ,其中 shifts[i] [starti, endi, directioni] 。对于每个 i ,将 s 中从下标 starti 到下标 endi (两者都包含&#…

STM32的串行外设接口SPI

一、SPI简介 1.SPI总线特点 (1)四条通信线 SPI需要SCK、MISO、MOSI、NSS四条通信线来完成数据传输 ,每增加一个从机,多一条NSS通信线。 (2)多主多从 SPI总线允许有多个主机和多个从机。 (3&…

再见 ESNI,你好 ECH!—— ECH的前世今生

译者注:2024 年 9 月 25 日,Cloudflare 宣布再次推出 ECH 功能。借此契机,本人翻译了 Cloudflare 介绍 ECH 的博文 Good-bye ESNI, hello ECH! ,以便科普ECH的发展历程。 现代互联网上的大多数通信都经过加密,以确保其…

Flink源码剖析

写在前面 最近一段时间都没有更新博客了,原因有点离谱,在实现flink的两阶段提交的时候,每次执行自定义的notifyCheckpointComplete时候,好像就会停止消费数据,完成notifyComplete后再消费数据;基于上述原因…