Docker数据持久化与数据共享

news2024/11/22 16:07:07

Docker部署了项目,但还有一个很重要的问题就是容器中产生的数据(比如log文件),容器一旦被删除,容器内的所有数据也就没有了,为了避免这个问题我们可以将数据存储到容器之外(比如宿主机),这样即使删除容器也不会丢失数据。一旦容器故障,我们可以重新创建一个容器,将数据挂载到容器里,就可以快速恢复。

数据存储方式

Docker提供了以下几种存储方式:

  • volume卷:这种方式是在宿主机文件系统分配一块专有存储区域,由 Docker管理,并且与主机的核心功能隔离。非 Docker 进程不能修改文件系统的这一部分。卷是在 Docker 中持久保存数据的最佳方式,它适合存储数据库数据,可挂到多个容器上

  • bind mount 绑定挂载:这种方式是直接把宿主机目录映射到容器内,适合挂代码目录和配置文件,可挂到多个容器上

  • tmpfs mount临时挂载:这种方式仅存储在主机系统的内存中,并且永远不会写入主机系统的文件系统,适合存储临时文件,不可多容器共享

这张图很清晰的解释了volumebind mounttemps mount与容器和宿主机之间的关系,这三者最终都是存储在宿主机上的。

重点了解volume数据卷:(其实绑定挂载也可以当成volume来理解)

  • 数据卷其实是宿主机上的一个目录
  • 当容器目录与数据卷目录绑定之后,双方的修改都会立即同步
  • 一个数据卷可以被多个容器挂载
  • 一个容器也可以挂载多个数据卷

数据卷可以用来做容器数据持久化、外部机器与容器间接通信、容器之间间接通信

数据卷操作

数据卷(Volume)也是常见的 Docker 对象类型的一种,因此它也支持创建、查看、删除等操作

创建数据卷

使用docker volume create [name]指令来创建一个数据卷

docker volume create nanjiu-data

查看所有的数据卷

docker volume ls

查看卷信息

使用docker volume inspect [name]指令来查看对应卷信息

docker volume inspect nanjiu-data

从上图我们可以看到Mountpoint数据卷挂载的地址,需要注意的是对于非 Linux 系统而言(Windows 、Mac ),该目录不存在于你的文件系统中,而是存在于 Docker 虚拟机中。

删除数据卷

使用docker volume rm [name]指令来删除对应的数据卷

docker volume rm nanjiu-data

这里需要注意的是:

  • 数据卷是用来做持久化数据的,它的生命周期独立于容器,所以Docker不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷
  • 如果需要在删除容器的同时移除数据卷,可以在删除容器的时候使用 docker rm -v 指令

如果想要清除所有无容器引用的数据卷,可以使用以下指令:

docker volume prune

与容器一起使用

数据卷本身是用来为容器做数据持久化的,所以单独创建一个数据卷的意义并不大

创建容器与数据卷

命名数据卷

可以使用docker run指定-v-mount来创建数据卷,两者产生的结果相同,最大的区别在于-v语法将所有选项组合在一个字段中,而--mount 语法则将它们分开。

docker run -itd -v nanjiu-vol:/nanjiu-data --name nanjiu nginx:latest

这里通过-v指定了数据卷的名称为nanjiu-vol,并且对应绑定容器中的路径为/nanjiu-data

对于容器中不存在的文件夹,Docker会帮我们自动新建,所以我们可以进入到容器中查看是否有该文件夹

这里我们可以看到容器中对应的数据卷目录

匿名数据卷

这里还有一种类型叫做匿名数据卷,他的创建方式只需要省略数据卷名称就可以,然后Docker会为它生成一长串的hash值作为数据卷的名称

docker run -itd -v /nanjiu-noname --name nanjiu-noname nginx:latest

验证数据持久化

我们先在这个数据卷目录新建一个文件,再把当前容器删除

然后我们再重新创建一个容器并绑定上面那个数据卷,如果数据卷中的内容还存在,那就能够证明数据是持久化存储的,不会随着容器的删除而删除

从这里我们就能够验证数据卷可以用来做持久化存储了

绑定挂载

上面我们提到过它可以当成数据卷来理解,因为它在使用过程中几乎与数据卷类似,不同的地方是它其实是与宿主机的文件系统进行绑定

docker run -itd -v ~/Desktop/nanjiu-mount-data:/nanjiu-mount-data --name nanjiu nginx:latest

这里-v的格式为 <host path>:<container path>,对应绑定的是宿主机目录与容器目录

然后可以到桌面看对应的文件是否存在

绑定挂载可以让宿主机与容器共享数据,并且同样不会随容器的删除而删除,也可以用来实现数据持久化,上面有提到他适合用来挂载代码目录和配置文件

数据共享

容器与宿主机共享数据

绑定挂载

这个很好理解,上面那种bind mount绑定挂载方式就是最明确的,它是直接将宿主机上的目录挂载到容器。

docker cp

volume数据卷的方式想要实现容器与宿主机共享数据稍微有点麻烦,因为这种方式是在宿主机文件系统分配一块专有存储区域,由 Docker管理,并且与主机的核心功能隔离。非 Docker 进程不能修改文件系统的这一部分

但好在docker提供的docker cp命令可以用来拷贝文件,该docker cp命令可以将内容从SRC_PATH复制到DEST_PATH. 您可以从容器的文件系统复制到本地计算机,或者相反,从本地文件系统复制到容器。

docker cp 88eecfd2dd14:/nanjiu-data ~/Desktop/cpDir

然后查看本地桌面是否有了拷贝过来的内容

通过这种方式也能实现宿主机与容器之间的数据共享,但它的缺点在于每次都需要手动操作,数据共享比较麻烦。

容器与容器之间共享数据

绑定挂载

这里第一种方式仍然是可以使用bind mount绑定挂载,因为同一个文件可以挂载到多个容器,这样就可以借助宿主机中转来实现容器之间的数据共享了,这种方式比较简单易懂。

数据卷容器

数据卷容器是一个专门为其它容器提供卷的容器,它提供的卷可以是bind mount,也可以是docker volume

数据卷容器在为其它容器提供卷功能时可以不需要处于运行状态

这里创建了两种类型的volume,同时挂载在nanjiu-vc这个数据卷容器上,这个容器可以不启动

docker create --name nanjiu-vc \                            
> -v ~/Desktop/nanjiu-vc:/nanjiu-vc \
> -v nanjiu-vc:/nanjiu-vc2 \
> nginx:latest

其他容器可以通过--volumes-from使用nannie-vc这个数据卷容器

这里建了两个容器都使用nanjiu-vc这个数据卷容器

这样两个容器就通过数据卷容器实现了数据共享。

这种方式的优点在于:

  • bind mount相比,不必为每一个容器指定宿主机path,所有path都在volume container中定义好了,容器只需与volume container关联,实现了容器与host的解耦。

  • 使用volume container的容器,其mount point是一致的,有利于配置的规范和标准化,但也带来一定的局限,使用时需要综合考虑。

改造之前的log存储方式

之前的那种部署方式存在一个问题,如果容器出现故障被销毁,那么容器内产生的log文件也就没有了,现在我们可以把它改造成将nginx产生的log文件使用数据卷存储,当容器出现故障,我们只需要重新创建一个容器并挂载数据就可以快速恢复log文件排查问题

修改Dockerfile

# 指定node镜像
FROM node:16-alpine as builder
# 指定工作目录
WORKDIR /code
# 代码复制到工作目录
ADD . /code
# 安装依赖
RUN npm install --registry=https://registry.npm.taobao.org
# 打包
RUN npm run build
# 指定nginx镜像
FROM nginx:alpine
# 创建nginx日志目录数据卷
VOLUME ["/var/log/nginx"]
# 复制打包后的代码到nginx容器中
COPY --from=builder /code/dist /usr/share/nginx/html
COPY /nginx.conf /etc/nginx/nginx.conf
# 暴露端口
EXPOSE 8080

重新打包镜像

docker build -t nanjiu:1.0.1 . 

创建容器

基于上面nanjiu:1.0.1镜像创建一个容器nanjiu-web3

docker run -d -p 9099:8080 --name nanjiu-web3 nanjiu:1.0.1

访问页面

这里主要是为了产生nginx日志文件

将容器删除

docker stop 4355deda547f # 停止容器
docker rm 4355deda547f # 删除容器

容器虽然被删除了,但数据卷并不会跟随容器的删除而删除

新建容器绑定数据卷查看数据

docker run -d \
-v 3690f4f3b2d15466a9dfa7f692cba06add99daba3f76b8e7ffdc99b1c5937a8a:/nginx-data \
--name nanjiu-web4 nginx:latest

这样一来即使容器出现故障被删除,也不影响查看log文件排查问题。

原文https://www.cnblogs.com/songyao666/

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

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

相关文章

手机短视频素材哪里下载?手机做短视频库有哪些?

在移动互联网时代&#xff0c;手机已成为我们日常生活中不可或缺的工具。许多人喜欢使用手机制作短视频&#xff0c;分享自己的生活和创意。但是&#xff0c;高质量的视频素材对于制作出色的短视频至关重要。那么&#xff0c;手机短视频素材哪里可以下载&#xff1f;有哪些适合…

STM32(更新中)

目录 1 时钟&#xff08;心跳&#xff09; 1.1 CubeMX基本配置 1.2 外设在时钟上的分配原理 1.3 时钟树 2 寄存器&#xff08;地址&#xff09; 3 GPIO 3.1 GPIO实物 3.2 GPIO两种结构&#xff08;推挽/开漏&#xff09; 3.3 LED 3.4 CUBEMX 3.5 常用函数 …

最强生产力|卸载并重装Anaconda3

一、Anaconda3卸载 &#xff08;一&#xff09;官方方案一&#xff08;Uninstall-Anaconda3-不能删除配置文件&#xff09; 官方推荐的方案是两种&#xff0c;一种是直接在Anaconda的安装路径下&#xff0c;双击&#xff1a; &#xff08;可以在搜索栏或者使用everything里面搜…

使用css将文字在水平线中显示

方法一&#xff1a; 1.效果图 2.html <!-- <div class"line">第三方登录</div> --> 3.css /* 让文字在水平线中显示 */.line {display: flex;flex-direction: row;color: #ccc;font-size: 18px;font-weight: bolder; }.line:before, .line:aft…

Spring boot3.x 无法向 Nacos2.x进行服务注册的问题

一&#xff1a;问题描述 配置中心都是可用的&#xff0c;但是就是无法向nacos进行服务注册。 二&#xff1a;问题可能出现的原因有如下两种 1.Nacos2.0版本相比1.X新增了gRPC的通信方式&#xff0c;因此需要增加2个端口。除了8848还需要开放9848&#xff0c;9849端口。 官方…

阿里云负载均衡对接

1 、开通负载均衡产品 2 、ALB / NLB / CLB ALB&#xff1a; 应用型负载均衡 &#xff0c; 给定对应服务域名与当前实例DNS绑定之后即可使用 支持&#xff1a; HTTP/HTTPS/QUIC等应用层流量协议 NLB&#xff1a; 网络型负载均衡 支持&#xff1a; TCP / UDP / TCPSSL C…

安装miniconda、tensorflow、libcudnn

目录 安装miniconda 安装tensorflow 安装 libcudnn 安装miniconda wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && bash Miniconda3-latest-Linux-x86_64.sh 安装tensorflow tensorflow官网&#xff0c;查看版本对应 https:…

阿里云 Flink 原理分析与应用:深入探索 MongoDB Schema Inference

摘要&#xff1a;本文整理自阿里云 Flink 团队归源老师关于 阿里云 Flink 原理分析与应用&#xff1a;深入探索 MongoDB Schema Inference 的研究&#xff0c;内容主要分为以下四部分&#xff1a; 1. MongoDB 简介 2. 社区MongoDB CDC 核心特性 3. MongoDB CDC 在阿里云 Flink …

网络通信(18)-C#TcpClient 和 TcpListener的使用实例

本文演示C#TcpClient 和 TcpListener的使用实例,掌握基本用法。 目录 TcpListener服务器 客户端TcpClient TcpListener服务器 界面 UI代码 namespace TcpListenerDemo {partial class Form1{/// <summary>/// 必需的设计器变量。/// </summary>private System…

【GitHub项目推荐--不错的Rust开源项目】【转载】

01 Rust 即时模式 GUI 库 egui 是一个简单、快速且高度可移植的 Rust 即时模式 GUI 库&#xff0c;可以轻松地将其集成到你选择的游戏引擎中&#xff0c;旨在成为最易于使用的 Rust GUI 库&#xff0c;以及在 Rust 中制作 Web 应用程序的最简单方法。 项目地址&#xff1a;ht…

对齐大型语言模型与人类偏好:通过表示工程实现

1、写作动机&#xff1a; 强化学习表现出相当复杂度、对超参数的敏感性、在训练过程中的不稳定性&#xff0c;并需要在奖励模型和价值网络中进行额外的训练&#xff0c;导致了较大的计算成本。为了解决RL方法带来的上述挑战&#xff0c;提出了几种计算上轻量级的替代方案&…

图像处理算法:白平衡、除法器、乘法器~笔记

参考&#xff1a; 基于FPGA的自动白平衡算法的实现 白平衡初探 (qq.com) FPGA自动白平衡实现步骤详解-CSDN博客 xilinx 除法ip核&#xff08;divider&#xff09; 不同模式结果和资源对比&#xff08;VHDL&ISE&#xff09;_ise除法器ip核-CSDN博客 数…

关于C#中的HashSet<T>与List<T>

HashSet<T> 表示值的集合。这个集合的元素是无须列表&#xff0c;同时元素不能重复。由于这个集合基于散列值&#xff0c;不能通过数组下标访问。 List<T> 表示可通过索引访问的对象的强类型列表。内部是用数组保存数据&#xff0c;不是链表。元素可重复&#xf…

Istio-gateway

一. gateway 在 Kubernetes 环境中&#xff0c;Kubernetes Ingress用于配置需要在集群外部公开的服务。但是在 Istio 服务网格中&#xff0c;更好的方法是使用新的配置模型&#xff0c;即 Istio Gateway&#xff0c;Gateway 允许将 Istio 流量管理的功能应用于进入集群的流量&…

C#基础:用ClosedXML实现Excel写入

直接在控制台输出&#xff0c;确保安装了该第三方库 using ClosedXML.Excel;class DataSource {public int id { get; set; }public string name { get; set; } "";public string classes { get; set; } "";public int score { get; set; } } class Te…

深入浅出hdfs-hadoop基本介绍

一、Hadoop基本介绍 hadoop最开始是起源于Apache Nutch项目&#xff0c;这个是由Doug Cutting开发的开源网络搜索引擎&#xff0c;这个项目刚开始的目标是为了更好的做搜索引擎&#xff0c;后来Google 发表了三篇未来持续影响大数据领域的三架马车论文&#xff1a; Google Fil…

spring Cloud Stream 实战应用深度讲解

springCloudStream 简介 Spring Cloud Stream是一个框架&#xff0c;用于构建与共享消息传递系统连接的高度可扩展的事件驱动微服务。 该框架提供了一个灵活的编程模型&#xff0c;该模型建立在已经建立和熟悉的 Spring 习惯用语和最佳实践之上&#xff0c;包括对持久发布/订…

【Maven】-- 打包添加时间戳的两种方法

一、需求 在执行 mvn clean package -Dmaven.test.skiptrue 后&#xff0c;生成的 jar 包带有自定义系统时间。 二、实现 方法一&#xff1a;使用自带属性&#xff08;不推荐&#xff09; 使用系统时间戳&#xff0c;但有一个问题&#xff0c;就是默认使用 UTC0 的时区。举例…

什么叫特征分解?

特征分解&#xff08;Eigenvalue Decomposition&#xff09;是将一个方阵分解为特征向量和特征值的过程。对于一个 nn 的方阵A&#xff0c;其特征向量&#xff08;Eigenvector&#xff09;v 和特征值&#xff08;Eigenvalue&#xff09; λ 满足以下关系&#xff1a; 这可以写…

Python批量自动处理文件夹

假如在你的电脑硬盘某文件夹里有这样一堆不同格式的文件&#xff0c;看起来非常混乱&#xff0c;详情如图所示&#xff1a; 为了方便自己快速检索到文件&#xff0c;我们需要将这些文件按照不同格式分类整理到不同的文件夹中&#xff0c;应该怎么做呢&#xff1f;源码如下&…