【Docker】多个容器和宿主机之间如何进行数据同步和数据共享?容器数据卷从介绍到常用操作图文教程

news2024/11/17 11:50:01

请添加图片描述

专栏往期文章

  1. 《Docker是什么?Docker从介绍到Linux安装图文详细教程》
  2. 《30条Docker常用命令图文举例总结》
  3. 《Docker如何构建自己的镜像?从镜像构建到推送远程镜像仓库图文教程》

前言

你是否担心 Docker 容器被删除后,容器内的重要数据就丢失了?
你是否想知道,Docker容器中的重要数据如何备份到外面的宿主机中?
你是否想知道,多个容器之间如何能够数据共享并相互同步?
恭喜你,看完本篇博文,你将能解决上述所有问题。


本期目录

  • 专栏往期文章
  • 前言
  • 1. 避坑
  • 2. 什么是容器数据卷
  • 3. 数据卷常用操作
    • 3.1 创建带数据卷的容器
    • 3.2 查看数据卷的挂载路径
    • 3.3 数据共享特性总结
  • 4. 读写规则映射
  • 5. 卷的继承和共享


1. 避坑

更新:记录笔者遇到的大坑。

创建容器卷命令记得加入 --privileged=true

这条命令是用来解决 Docker 挂载主机目录访问时出现 cannot open directory.:Permission denied

【出现的原因】CentOS 7 安全模块比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为。在 SELinux 里面挂载目录是被禁止的。如果要开启,一般使用命令 --privileged=true 命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,容器内的 root 拥有真正的 root 权限。否则,容器内的 root 只是外部的一个普通用户权限。


2. 什么是容器数据卷

卷就是目录或文件,存在于 Docker 容器中,由 Docker 挂载到容器,但不属于 UnionFS 联合文件系统,因此能够绕过 UnionFS 提供一些用于持续存储或共享数据的特性。

容器数据卷,作用就是将 Docker 容器内的数据保存并同步到宿主机的硬盘中。如下图所示。卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此 Docker 不会在容器删除时删除其挂载的数据卷。

image-20221212141222508

将应用与运行的环境打包成镜像,run 之后形成容器实例运行,但我们希望容器中的数据能持久化到宿主机的硬盘中,不会随着容器的删除而消失。然而,Docker 容器产生的数据,如果不备份,那么当容器实例被删除后,容器内的数据自然也没有了。为了能保存容器中的数据,我们就要使用容器数据卷。

特点:

  1. 数据卷可以在容器之间共享或重用;
  2. 卷中的数据更改可以直接实时自动同步到宿主机上;
  3. 宿主机卷中的数据更改也会实时同步到容器内的卷中;(双向同步)
  4. 卷中的数据更改不会包含在镜像的更新中;
  5. 数据卷的生命周期一直持续到没有容器使用它为止。

3. 数据卷常用操作


3.1 创建带数据卷的容器

$ docker run -it --privileged=true -v /宿主机绝对路径目录/:/容器内目录 镜像名或镜像ID

其中,-v 就是启动容器数据卷,把 /容器内目录 备份到 /宿主机绝对路径目录/ 中。同时,如果 /宿主机绝对路径目录 卷中有数据更改,也会实时同步到 /容器内目录 中。换句话说,容器和主机的数据卷之间是双向同步的。

此外,--privileged=true 就是文章开头提到的解决 Docker 挂载主机目录访问时出现 cannot open directory.:Permission denied 报错的问题。

如果目录不存在,Docker 会自动创建 。此外,-v 后可以绑定一对或多对数据卷。

(Ps. 永远要记住容器实例也是一个简易版的 Linux 系统)


举例:接下来创建一个带有容器卷存储功能的 Ubuntu 容器实例。

$ docker run -it --privileged=true -v /tmp/host_data/:/tmp/docker_data --name=u1 ubuntu:latest /bin/bash

其中,把容器中 /tmp/docker_data 目录下的数据备份到宿主机的 /tmp/host_data 目录中。

image-20221212134243040

image-20221212134410192

可以看到,Docker 确实自动创建了目录。

下面,我们在容器内 /tmp/docker_data 下创建数据 dockerin.txt ,验证是否能实时同步到宿主机的 /tmp/host_data 下。

$ cd /tmp/docker_data/
$ touch dockerin.txt

image-20221212134657604

此时,查看宿主机的 /tmp/host_data 目录。

$ cd /tmp/host_data/
$ ls

image-20221212134901705

容器内的数据 dockerin.txt 成功同步到宿主机的 /tmp/host_data 目录下。

接下来,我们在宿主机的 /tmp/host_data 目录下也创建数据 hostin.txt 来验证这种同步是否是双向的。

$ touch hostin.txt

image-20221212135543914

切回到容器内,查看容器内 /tmp/docker_data 目录。

$ ls /tmp/docker_data

image-20221212135701761

可以发现,宿主机的 /tmp/host_data 目录下也创建数据 hostin.txt 也出现在了容器的数据卷 /tmp/docker_data 中。

得出结论:容器和宿主机的数据卷之间是实时双向同步的。


3.2 查看数据卷的挂载路径

可以使用下面的命令来查看数据卷挂载路径。

$ docker inspect 容器ID

举例:查看刚刚创建的 Ubuntu 容器数据卷挂载目录。

$ docker inspect 16e840d638e7

返回的是一大堆有关这个容器信息的 JSON 字符串。在 "Mounts" 挂载这段可以看到该容器数据卷的挂载目录。

image-20221212140809472

其中,"Source" 是其对应的宿主机挂载目录,"Destination" 是 Docker 容器数据卷目录。


3.3 数据共享特性总结

  1. Docker 容器修改,主机同步获得数据;
  2. 主机修改,Docker 容器同步获得数据;
  3. Docker 容器 stop ,主机修改,Docker 容器 start 重启后依然可以获得数据;

4. 读写规则映射

在上一节的案例中,使用的是 Docker 默认的规则:rw 可读可写。换句话说,下面两行命令是等价的。

$ docker run -it --privileged=true -v /宿主机绝对路径目录/:/容器内目录 镜像名或镜像ID
$ docker run -it --privileged=true -v /宿主机绝对路径目录/:/容器内目录:rw 镜像名或镜像ID

但在实际开发中,有时容器实例内部的读写权限被限制,只能读不能写,数据只能由宿主机同步给容器实例。这是我们把容器数据卷的读写权限改为 ro (Read Only) 只读即可。

$ docker run -it --privileged=true -v /宿主机绝对路径目录/:/容器内目录:ro 镜像名或镜像ID

image-20221212142509350

此时如果宿主机写入内容,可以同步给容器实例,容器可以读取到。


5. 卷的继承和共享

数据卷的继承,指的是容器 2 继承容器 1 的卷规则,卷规则包括数据卷的同步目录、读写规则等;此外,容器 1 、容器 2 与宿主机三者之间可以数据共享和同步。用 docker run 的一个参数 --volumes-from 父容器ID 来设置。

$ docker run -it --privileged=true --volumes-from 父容器 --name=容器名称 镜像名或镜像ID

卷继承的特点:

  1. 继承父容器与宿主机的同步目录、数据;
  2. 三者之间的数据能够相互共享,相互实时同步;
  3. 即使在容器停止的状态下,其他容器或宿主机更改的数据依然能在容器重启后同步过来。

举例:

第 3 节中我们创建了 Ubuntu 容器 u1 ,把容器中 /tmp/docker_data 目录下的数据备份到宿主机的 /tmp/host_data 目录中。

现在我们使用卷的继承,创建一个新的 Ubuntu 容器 u2 ,使其继承容器 u1 的卷规则。

$ docker run -it --privileged=true --volumes-from u1 --name=u2 ubuntu:latest /bin/bash

image-20221212150141433

在容器 u2 中,我们查看 /tmp/docker_data 目录下是否有数据。

image-20221212150620698

发现在 u1 和宿主机之间同步的数据,在 u2 容器中也同步了。

如果我在 u2 中创建数据,能不能同步到 u1 和宿主机上呢?

$ touch u2data.txt

image-20221212151307353

切到 u1 容器,发现 u2data.txt 也同步过来了。

image-20221212151446306

切到宿主机,发现 u2data.txt 也同步过来了。

image-20221212151609877

因此,使用卷的继承能实现多个容器与宿主机的数据共享和互相同步。

接下来做个实验,在停止 u1 容器的情况下,在 u2 容器中更改数据,三者之间还能实现数据共享和同步吗?

停止 u1 容器。

$ exit

image-20221212151923357

切到宿主机,新增数据 host2.txt

$ touch host2.txt

image-20221212152204618

切到 u2 容器,发现宿主机的新增数据成功同步过来。

image-20221212152313849

u2 容器中新增数据 u2datav2.txt

$ touch u2data2.txt

image-20221212152421119

切到宿主机,发现 u2 容器的新增数据成功同步过来。

image-20221212152517272

重启 u1 容器并进入,查看宿主机和 u2 新增的数据是否能同步过来。

$ docker start u1
$ docker exec -it u1 /bin/bash

image-20221212152844225

可以看到,即使 u1 容器已经停止运行的情况下,宿主机和 u2 新增的数据依然成功同步过来。实现三者之间数据共享同步。

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

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

相关文章

VFIDILDKVENAIHNAAQVGIGFAKPFEKLINPK,果蝇抗菌肽

果蝇抗菌肽是一种含有Lys的抗菌多肽,序列中包含34个氨基酸,是一种含有α-折叠的抗菌多肽。 编号: 223981中文名称: 果蝇抗菌肽,Andropin英文名: Antimicrobial Peptide Andropin单字母: H2N-VFIDILDKVENAIHNAAQVGIGFAKPFEKLINPK-OH三字母: H2…

自然语言处理(NLP)数据集汇总 3(附下载链接)

🎄🎄【自然语言处理NLP】简介 🎄🎄 自然语言处理(Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门…

Allure:根据step动态设置description

背景 使用pytestAllure进行自动化的时候,为了报告展示更明确会使用 with allure.step(xxx)和 allure.step(xxx)测试结束后就可以看到 测试步骤 Allure还支持配置Description 之前直接在case中编写,例如 """ [用例描述]: 专家问诊 [前置步骤]:1. 打开h5页面…

ScheduledExecutorService的使用及守护线程

只运行一次 private static ScheduledExecutorService scheduler; public static void main(String[] args) throws Exception { scheduler Executors.newScheduledThreadPool(5); // 循环任务,按照上一次任务的发起时间计算下一次任务的开始时间 scheduler.schedu…

解决mysql存储emoji表情唯一索引报错问题

问题发现: 1、正常上班的一天,突然间有运营同事反馈,我们在添加数据的时候,发现添加了🐸之后,对应的💩没有了,添加了💩然后🐸就没有了,需要研发帮…

【Linux】四、Linux 进程概念(四)|进程地址空间

目录 十、进程地址空间 10.1 回顾C/C 地址空间 10.2 测试 10.3 感性理解虚拟地址空间 10.4 如何画大饼? 10.5 如何理解区域划分和区域调整 10.6 虚拟地址空间、页表和物理地址 10.7 为什么存在地址空间 10.7.1 保证物理内存的安全性 10.7.2 保证进程的独立…

铁蛋白-海藻酸钠纳米包埋ACE抑制肽|海藻酸钠修饰碳纳米管(SAL-MWNTs)

铁蛋白-海藻酸钠纳米包埋ACE抑制肽|海藻酸钠修饰碳纳米管(SAL-MWNTs) 铁蛋白-海藻酸钠纳米包埋ACE抑制肽产品描述:利用铁蛋白在较酸条件下可逆组装特性和海藻酸钠(sodium alginate,SA)的控释作用,以马脾脱铁铁蛋白(horse spleen apoferritin,HSF)和SA作为纳米载体,…

Rust 基础(八)—— 高级特性

十九、高级特性 到目前为止,您已经学习了Rust编程语言最常用的部分。在我们开始第20章的下一个项目之前,我们先来看一下你可能偶尔会碰到,但不是每天都在使用的语言的一些方面。当你遇到任何未知的情况时,你可以使用这一章作为参…

[毕业设计]2022-2023年最新最全计算机专业毕设选题推荐汇总

目录 ①javaweb信息管理系统或web应用选题(应用开发类) ②微信小程序开发方向 ③游戏动画、数字媒体方向 ④深度学习、机器学习方向 ⑤算法研究方向 ⑥物联网、嵌入式方向 ⑦信息安全、网络安全 ⑧大数据分析、大数据预测 ⑨Matlab 选题迷茫 选题的重要性 选题指导 对毕…

Springboot利用Security做OAuth2资源服务器

Springboot利用Security做OAuth2授权验证_LO嘉嘉VE的博客-CSDN博客_springbootsecurity oauth2 密码认证 验证服务器在上一篇文章中. 验证服务器是做权限验证,有没有登录,有没有权限访问某些内容等。资源服务器指提供业务功能的服务器,他们…

使用idea创建springboot项目

一、第一种创建方法 点击File——>New——>Project 接下来选择空项目,如下图所示: 接下来点击Next——>项目名称——>finish 点击finish后会弹出如下图,让你新建一个Moudles 如下图, 在项目结构里面点击Modules——…

Kubeadm 部署 k8s 集群

目录 1.初始化设置 2.所有节点安装docker 3.k8s节点安装kubeadm,kubelet和kubectl 4.部署K8S集群 5.部署Dashboard 6.部署harbor私有仓库 名称设置组件master192.168.116.70(2C/4G,cpu核心数要求大于2)docker、kubeadm、ku…

南开大学程明明-学术规范及论文写作指导

第一讲 学术规范与论文写作-写作规范 主要内容 why writing is important 导致剽窃的原因(引用不当也会导致): 引用不是介绍别人的工作,而是更加清晰介绍自己的工作 第二讲 学术规范与论文写作-WrittingTips 各种工具的使用 Ove…

s5pv210 i2c 时序

1 低层时序 ①. 底层时序 ******** 低层时序: ①.空闲: scl clk都是高电平②.起始位: 一个时间段,这个段时间内,SCL高电平, SDA 出现下降沿 , 接收方收到以后,知道了,…

为什么在 2023 年只使用 console.log 是一个大禁忌

这里有 5 个必须知道的控制台对象方法和技巧! 在 2023 年,您是否仍在使用它console.log来满足所有 JavaScript 调试需求? 是时候提升您的技能并发现 JavaScript 控制台对象的全部功能了。 从console.table到console.time,这些高…

CFD-Post后处理,你真的会做吗?

导读:流体仿真中,解决问题通常分为四个步骤:几何—网格—求解—后处理。今天我们来学习最后一步:后处理。尤其对新手来说,首先要了解一下什么是后处理? 我们通过软件计算收敛后的得到的结果,只…

Python学习笔记-面向对象程序设计

记述python中关于面向对象程序设计的使用。 一、面向对象概述 面向对象(Object Oriented),简称OO; 面向对象编程(Object Oriented Programming),简称OOP。 1.对象 英文为Object&#xff0c…

IMX6ULL学习笔记(13)——GPIO接口使用【汇编方式】

一、GPIO简介 i.MX6ULL 芯片的 GPIO 被分成 5 组,并且每组 GPIO 的数量不尽相同,例如 GPIO1 拥有 32 个引脚, GPIO2 拥有 22 个引脚, 其他 GPIO 分组的数量以及每个 GPIO 的功能请参考 《i.MX 6UltraLite Applications Processor Reference M…

vTESTstudio入门到精通 - vTESTstudio工程创建_01

入行车载网络测试多年以来,最大的困扰就是网上几乎无法搜到工作中常见的问题答案,特别是vTESTstudio的工程和开发相关的问题,在晚上几乎就是一片未知的大陆,偶尔有几篇同行写的,基本也都是某个问题或者某个demo的创建基础讲解,至今我还未找到有博主将vTESTstudio从入门的…

艾美捷—如何选择合适的SAM甲基转移酶活性分析试剂盒?

SAM,也称为 AdoMet,充当修饰蛋白质和 DNA 所需的甲基的供体。SAM 的异常水平与许多异常有关,包括阿尔茨海默氏症、抑郁症、帕金森氏症、多发性硬化症、肝功能衰竭和癌症。 市面上,SAM甲基转移酶酶活性分析试剂盒非常少&#xff0c…