Docker基础教程 - 7 容器数据卷

news2024/11/17 23:50:16

更好的阅读体验:点这里 ( www.doubibiji.com

7 容器数据卷

什么是容器卷,为什么需要容器卷?

我们在运行容器的时候,产生的数据都是保存在容器内部的。如果使用Docker来运行mysql容器,数据都保存在容器内部,此时删除容器,数据就全部没了!没了!了!比删库跑路还容易,简直离谱他妈给离谱开门——离谱到家了。


所以需要容器卷,将主机的目录挂载到容器内部(宿主机目录相当于一个外部移动硬盘一样),将容器的目录与宿主机的目录进行映射,将数据保存到宿主机上,这样,即使容器被删除,挂载到容器卷中的数据仍然会被保留在宿主机上。使用容器卷既可以实现容器数据的持久化,也可以在容器间共享数据。

目录挂载后,两个目录进行了映射,在宿主机对应目录进行操作,都会反应到容器内的对应目录中;同样,在容器内对挂载的目录进行操作,也会同步到宿主机上,两个文件夹之间的内容始终保持一致。将容器停止,然后修改宿主机的目录,重启容器,还是会将宿主机的内容同步到容器内部。


Docker 提供了三种常见的挂载方式,分别是:绑定挂载(Bind Mounts)、卷挂载(Volume Mounts)和临时文件系统(tmpfs)挂载。下面分别介绍这三种挂载方式的使用。

7.1 绑定挂载

下面使用 Ubuntu 镜像来运行一个容器,使用绑定挂载,将宿主机的目录挂载到容器中。

命令:

# 容器卷使用-v参数
docker run -it --privileged=true -v 宿主机目录:容器内目录 镜像名称

# 例如,运行ubuntu并进行容器卷的挂载:
docker run -it --privileged=true \
-v /home/doubi/my-ubuntu/host_data:/root/docker_data \
--name my-ubuntu ubuntu

shell 命令太长,使用 \ 进行换行。

解释一下:

  • --privileged=true :建议都添加 --privileged=true 参数来开启权限,否则可能出现 ls: cannot open directory .: Permission denied 的错误。使用该命令,容器内的root拥有真正的root权限,否则容器内的root在外部只是一个普通用户权限,所以导致容器内的root权限不够。

  • -v /home/doubi/my-ubuntu/host_data:/root/docker_data :表示将宿主机上的 /home/doubi/my-ubuntu/host_data 目录挂载到容器内的 /root/docker_data 目录,使两个目录进行映射。

运行上面的命令后,如果宿主机没有 /home/doubi/my-ubuntu/host_data 目录,则会自动创建,如果容器内部没有 /root/docker_data 目录,也会自动创建,挂载的路径必须是绝对路径,如果容器内/root/docker_data 目录有内容,内容将被覆盖删除。

-v 参数也是可以使用多个的,进行多个目录挂载的,例如:

docker run -it --privileged=true \
-v /home/doubi/my-ubuntu/host_data:/root/docker_data \
-v /home/doubi/my-ubuntu/config:/root/config \
--name my-ubuntu ubuntu

大多数情况下,我们都使用了绑定挂载的方式。

7.2 卷挂载

卷挂载方式,Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中。

卷挂载有两种方式:具名挂载匿名挂载

1 具名挂载

下面运行 ubuntu 并使用卷挂载:

docker run -it --privileged=true \
-v ubuntu_data:/root/docker_data \
--name my-ubuntu ubuntu

ubuntu_data 就是容器卷的名称,使用卷挂载,docker 会查看 ubuntu_data 容器卷是否存在,如果不存在就会创建 ubuntu_data 容器卷。docker 会将容器中的目录映射到 ubuntu_data 容器卷。

使用命令 docker volume ls 可以查看 docker 中存在的卷:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以使用 docker inspect 命令查看容器卷的位置:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

容器中对应的目录中的数据会被存储在 /var/lib/docker/volumes/容器卷名/_data 目录中。


我们也可以使用命令创建容器卷,然后在运行容器的时候,使用已存在的卷:

# 创建容器卷
docker volume create 卷名称

# 举个栗子,创建ubuntu_data2容器卷
docker volume create ubuntu_data2

我们可以使用多个容器使用同样的容器卷,实现容器间数据的共享:

# 创建容器1
docker run -it --privileged=true \
-v ubuntu_data:/root/docker_data \
--name my-ubuntu1 ubuntu

# 创建容器2,使用同样的数据卷
docker run -it --privileged=true \
-v ubuntu_data:/root/docker_data \
--name my-ubuntu2 ubuntu

2 匿名挂载

在上面使用命令进行容器卷挂载的时候,是指定了容器卷的名称。还有一种是匿名挂载,也就是只指定容器内部的目录,不指定宿主机的目录。

举个栗子:

docker run -it --privileged=true -v /root/docker_data --name my-ubuntu ubuntu

docker inspect 命令查看匿名挂载的容器的信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以看到,使用匿名挂载,容器卷是被挂载到宿主机的 /var/lib/docker/volumes/xxxx/_data 目录下。

匿名挂载一般很少使用。

7.3 临时文件系统挂载

这种挂载方式,数据只存储在宿主机的内存中,不会写入到宿主机的文件系统中,当容器停止时,挂载的数据会被删除。

例如,使用如下命令可以实现临时文件系统挂载:

docker run --tmpfs /container/path image_name

不过一般不会使用这种方式,就当我没说,忽略。

7.4 查看挂载

使用 docker inspect 容器ID 命可以查看容器挂载的详细信息,里面就包含了容器的挂载信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

7.5 理解挂载 - 重要

重新来说一下挂载,其实上面说的将宿主机和容器的目录进行映射是不准确的说法。

例如我们在运行容器的时候,使用了绑定挂载,指定了 -v /home/doubi/my-ubuntu/data:/root/docker_data

这表示将宿主机的 /home/doubi/my-ubuntu/host_data 目录挂载到容器内部的 /root/docker_data 目录,也就是容器内部的 /root/docker_data 目录变成了指向了宿主机的 /home/doubi/my-ubuntu/host_data 目录的一个链接,或快捷方式。在容器内部将数据保存到 /root/docker_data 目录,数据实际保存到的是宿主机的 /home/doubi/my-ubuntu/host_data 目录。

所以在执行挂载的时候,如果容器内的 /root/docker_data 目录是非空的,那么目录中的文件将会丢失,因为 /root/docker_data 目录变成了一个链接,指向了宿主机的目录的 /home/doubi/my-ubuntu/host_data 目录,显示的自然是宿主机 /home/doubi/my-ubuntu/host_data 目录的内容,如果 /home/doubi/my-ubuntu/host_data 目录是空的,那么容器内的 /root/docker_data 目录也将变成空的。

而卷挂载不一样:如果volume是空的而容器中的目录有内容,那么docker会将容器目录中的内容拷贝到volume中,但是如果volume中已经有内容,则会将容器中的目录覆盖。

7.6 容器卷读写规则

上面在进行容器卷挂载的时候,我们没有指定容器卷的读写规则,那么使用的就是默认规则,也就是说容器内部对挂载的目录具有可读可写权限。

还可以使用容器卷读写规则,限制容器内对挂载目录的读写权限。

命令:

docker run -it --privileged=true -v 宿主机目录:容器内目录 镜像名称

没有指定读写规则,默认是 rw 的读写规则,那么其实是这样的:

docker run -it --privileged=true -v 宿主机目录:容器内目录:rw 镜像名称

如果想限制容器内对挂载目录的操作权限,例如在容器内只能对挂载目录进行只读,那么,可以修改命令为:

# 容器内对挂载目录只能读
docker run -it --privileged=true -v 宿主机目录:容器内目录:ro 镜像名称

# 举例:
docker run -it --privileged=true -v /home/doubi/my-ubuntu/host_data:/root/docker_data:ro --name my-ubuntu ubuntu

ro 表示 readonly ,只读。目录下的内容只能通过宿主机来修改,容器内部是无法操作的,只能读!

一般情况下都是使用默认规则,可读可写。

7.7 容器卷的继承和共享

如果要在多个容器之间共享数据,那么可以使用相同的挂载目录。

举个栗子:

# 运行my-ubuntu1容器
docker run -it --privileged=true -v /home/doubi/my-ubuntu/host_data:/root/docker_data --name my-ubuntu1 ubuntu
# 运行my-ubuntu2容器
docker run -it --privileged=true -v /home/doubi/my-ubuntu/host_data:/root/docker_data --name my-ubuntu2 ubuntu

上面运行了两个 ubuntu 容器,使用的是宿主机相同的挂载目录,这样在宿主机修改目录下的内容,会同时同步到两个容器中;同样,在一个容器内修改目录下的内容,也可以同步到宿主机和其他的容器中。


上面是一种方式,我们还可以使用 --volumes-from 参数,让一个容器继承另一个容器的卷规则。

举个栗子:

# 运行my-ubuntu1容器
docker run -it --privileged=true \
-v /home/doubi/my-ubuntu/host_data:/root/docker_data \
--name my-ubuntu1 ubuntu

# 运行my-ubuntu2容器,继承my-ubuntu1容器的卷规则
docker run -it --privileged=true \
--volumes-from my-ubuntu1 \
--name my-ubuntu2 ubuntu

上面的 my-ubuntu2 容器,使用 --volumes-from 参数继承 my-ubuntu1容器的卷规则,那么他们的挂载将是相同的。

这样在宿主机修改目录下的内容,会同时同步到两个容器中;在一个容器内修改目录下的内容,也可以同步到宿主机和其他的容器中。

这种继承的方式在使用多个容器时更为方便。

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

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

相关文章

网络性能优化工具

网络优化是 IT 行业的一个重要方面,网络很复杂,管理员努力保持其平稳运行,然而,网络环境也是不可预测和动态的,任何未受监控的问题都可能像滚雪球一样变成中断。 优化网络性能需要引入: 新设备和应用程序…

Axure RP 10:让原型设计更快、更直观、更智能 mac版

Axure RP 10是一款强大的原型设计工具,它能够帮助设计师快速创建高保真、交互式的原型,从而更好地展示和测试设计方案。这款软件凭借其直观易用的界面和丰富的功能,已经成为了许多设计师的首 选工具。 Axure RP 10 for Mac版软件获取 首先&a…

还在使用 RESTful API ? 试一试 GraphQL

前言 GraphQL 和 RESTful API 是两种不同的网络通信接口设计理念,它们都可以用于客户端和服务器之间的数据交换,但是有着不同的工作方式和特点。 各自的特点以及优缺点 GraphQL: 特点: 查询语言: GraphQL 是一个查询语言&…

【MySQL 系列】MySQL 架构篇

在我们开始了解 MySQL 核心功能之前,首先我们需要站在一个全局的视角,来看 SQL 是如何运作执行的。通过这种方式,我们可以在头脑中构建出一幅 MySQL 各组件之间的协同工作方式,有助于我们加深对 MySQL 服务器的理解。 文章目录 1、…

DEYO: DETR with YOLO for End-to-End Object Detection论文翻译

DEYO:DETR与YOLO用于端到端目标检测 摘要 DETR的训练范式在很大程度上取决于在ImageNet数据集上预训练其骨干。然而,由图像分类任务和一对一匹配策略提供的有限监督信号导致DETR的预训练不充分的颈部。此外,在训练的早期阶段匹配的不稳定性会…

利用Cocos游戏开发中的跑马灯祝女神们节日快乐

点击上方亿元程序员+关注和★星标 引言 Cocos游戏开发中的跑马灯广播效果 大家好,今天是国际劳动妇女节,也就是我们如今熟知的女神节。 今天打算通过游戏开发中的跑马灯广播这最直接的方式祝女神们节日快乐! 跑马灯作为游戏中常见的UI元素,通常被用来展示重要的信息或者…

Gafana Redis Overview dashboard

1. 简介 根据提供的 Redis 监控仪表盘 JSON 文件,包含的监控指标及其简要描述如下: redis_uptime_in_seconds: Redis 实例的运行时间(秒)。 redis_connected_clients: 当前连接到 Redis 实例的客户端数量。 redis_memory_used_bytes: Redis 实例使用的内存量(字节)。 redis_m…

Qt + mqtt对接阿里云平台(一)

一、阿里云平台 官网:点击跳转 二、创建产品与设备 1、“公共实例” 2、“设备管理”->“产品”->“创建产品” 3、“产品名称”->“自定义品类”->"确认" 4、“前往添加” 5、“添加设备” 6、摄入DeviceName和备注名称 7、"前往查…

css-vxe-form-item中输入框加自定义按钮(校验位置错误)

1.浮动错误效果 提示内容不对 2.不使用浮动&#xff0c;使用行内块元素 代码如下 <vxe-form-item title"yoyo:" field"assembleWorkNo" span"8"><template #default><vxe-input style"width:70%;display:inline-block;&quo…

Linux之cd、pwd、mkdir 命令

cd命令&#xff0c;切换目录 1&#xff09;当Linux终端&#xff08;命令行&#xff09;打开的时候&#xff0c;会默认以用户的HOME目录作为当前的工作目录。 2&#xff09;我们可以通过cd命令&#xff0c;更改当前所在的工作目录。 3&#xff09;cd命令来自英文&#xff1a;C…

基于FPGA的PSRAM接口设计与实现

一 PSRAM与HyperRAM 1、概述 2、异同 待完善 二 PSRAM分析 1、特性 1、关键点 待完善 三 PSRAM方案设计与验证 待完善 1、整体方案设计 2、验证 仿真工具采用VCSVerdi&#xff0c;PSRAM接口控制IPAPS6408L model进行验证。 四 结论 备注&#xff1a;以AP公司的APS6408L…

IP传输方式——组播

组播作为IP传输三种方式之一&#xff0c;指的是报文从一个源发出&#xff0c;被转发到一组特定的接收者&#xff0c;相同的报文在每条链路上最多有一份。相较于传统的单播和广播&#xff0c;组播可以有效地节约网络带宽、降低网络负载&#xff0c;所以被广泛应用于IPTV、实时数…

mysql如何开启远程访问?

MySQL是一种常见的关系型数据库管理系统&#xff0c;广泛应用于各行各业。默认情况下&#xff0c;MySQL仅允许本地访问&#xff0c;即只能在本地主机上进行数据库操作。有时候我们需要通过远程连接访问MySQL数据库&#xff0c;以便实现更灵活的管理和操作。本文将介绍如何在MyS…

HTML静态网页成品作业(HTML+CSS)——原神介绍设计制作(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

如何恢复未保存的Word文档

Microsoft Word 是世界上最流行的软件之一。它不仅是各行业提高生产力的利器&#xff0c;而且广泛应用于我们的日常生活中。因此&#xff0c;当您发现自己工作了数小时和数天的word doc文档被意外未保存、删除或丢失时&#xff0c;大多数人可能都知道恐慌和绝望。 今天我们将向…

HelpLook VS GitBook:知识库优劣详解

在信息爆炸的时代&#xff0c;企业要保持竞争优势&#xff0c;就必须善于管理和利用内部的知识资产。企业知识库作为一种集中存储和共享知识的工具&#xff0c;正在成为现代企业不可或缺的一部分。 HelpLook和Gitbook是提供专业知识库的两个平台&#xff0c;也被大众熟知。它们…

Spring Boot 配置热部署

前言 对于 Spring Boot 项目之中, 在刚开始学习的时候, 每当代码进行变动的时候, 想要生效那就必须要手动重启. 为什么要重启呢 ? 原因在于写的代码是依靠运行之后的 class 文件运行的, 当我们的代码更新以后, 如果不去手动重启, 那么就无法生成新的 class 文件, 执行的就是旧…

Python与FPGA——图像锐化

文章目录 前言一、图像锐化二、Python robert锐化三、Python sobel锐化四、Python laplacian锐化五、FPGA sobel锐化总结 前言 在增强图像之前一般会先对图像进行平滑处理以减少或消除噪声&#xff0c;图像的能量主要集中在低频部分&#xff0c;而噪声和图像边缘信息的能量主要…

结构体:位段(C语言进阶)(二)

目录 前言 2、位段 2.1 什么是位段 2.2 位段的内存分配 2.3 位段的跨平台问题 2.4 位段的应用 总结 前言 C语言除了有其内置类型&#xff0c;还有自定义类型。因为在实际运用中&#xff0c;我们可能会遇到一类数据&#xff0c;它的内容是由多种数据组成的&#xff0c;例如&…

27.基于springboot + vue实现的前后端分离-网上租赁交易系统(项目 + 论文)

项目介绍 本课题是根据用户的需要以及网络的优势建立的一个基于Spring Boot的网上租贸系统&#xff0c;来满足用户网络商品租赁的需求。本网上租贸系统应用Java技术&#xff0c;MYSQL数据库存储数据&#xff0c;基于Spring Boot框架开发。在网站的整个开发过程中&#xff0c;首…