涨薪技术|Docker容器数据管理

embedded/2025/3/26 1:51:45/

 在生产环境中使用Docker时,经常需要对数据进行持久化,这就有点像Redis里面的持久性一样的,或者需要在多个容器之间在进行数据共享,这就是Docker中我们说的数据管理操作。

容器中管理数据主要有两种方式:

数据卷(Data Volumes):容器内数据直接映射到本地主机环境;

数据卷容器(Data Volume Containers):使用特定容器维护数据卷;

01数据卷

数据卷(Data Volumes)是一个可供容器使用的特殊目录,它可以将主机操作系统目录直接映射进容器,类似于Linux中的mount行为。

数据卷可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效与方便;

  • 对数据卷内数据的修改会立即生效,无论是容器内操作还是本地操作;

  • 对数据卷的更新不会影响镜像,解藕开应用和数据;

  • 卷会一直存在,直到没有容器使用,可以安全地卸载它。

目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中。

图片

volume:

Docker管理宿主机文件系统的一部分,默认位于/var/lib/docker/volumes目录中,这是目前使用的最多的方式。

目前所有容器的数据都保存在这个目录下,由于没有创建指定卷,所以Docker帮默认创建了许多匿名卷。

bind mount:

表示可以存储在宿主机系统的任意位置,这种方法比较常用。但是bind mount在不同的宿主机系统时不可移植。

tmpfs mount:

表示挂载存储在宿主机系统内存中,而不会写入宿主机的文件系统,几乎不用。

02创建数据卷

Docker提供了volume子命令来管理数据卷,volume子命令的语法格式如下:

docker volume create [OPTIONS] [VOLUME]
    //创建一个自宝义容器root@ubuntu:/var/lib/docker/volumes# docker volume create my-vol//查看所有容器root@ubuntu:/var/lib/docker/volumes# docker volume lsDRIVER VOLUME NAMElocal badc300c2e02888929999ee56f2653983adc52a06b62e2b86f3a2ce6228b4ae4local my-vol//查看指定容器卷详细信息root@ubuntu:/var/lib/docker/volumes# docker volume inspect my-vol[{"CreatedAt": "2021-09-26T08:17:59-07:00","Driver": "local","Labels": {},"Mountpoint": "/var/lib/docker/volumes/my-vol/_data","Name": "my-vol","Options": {},"Scope": "local"}]//删除数据卷docker volume rm my-vol

    03绑定数据卷

    定义好数据卷后,即可以创建一个使用这个数据卷的容器,下面 nginx为例,将数据卷绑定到容器中。将本地的my-vol数据卷挂载到/usr/share/nginx/html目录下。

    root@uuntu:/var/lib/docker/volumes# docker run -it --name=test-nginx -p 80:80 -vlocal-test-vol:/usr/local/nginx/html nginx

    绑定完成后可以通过inspect命令来查看是否绑定成功。

    root@ubuntu:/var/lib/docker/volumes/local-test-vol/_data# docker inspect testnginx//inspect命令可以看到以下内容,由于内容比较多,所以只摘起核心内容"HostConfig": {"Binds": [ //这是绑定的数据卷信"local-test-vol:/usr/local/nginx/html"//这是挂载点的信息"Mounts": [{"Type": "volume","Name": "local-test-vol","Source": "/var/lib/docker/volumes/local-test-vol/_data","Destination": "/usr/local/nginx/html","Driver": "local","Mode": "z","RW": true,"Propagation": ""}]

    接下来在本地目录/var/lib/docker/volumes/local-test-vol数据卷就可以与容器

    的/usr/local/nginx/html目录进行同步数据,进而达到持久化的效果。即不管是在本地数据卷中还是容器中的/usr/local/nginx/html目录中进行修改文件,两个目录的信息都可以互通。

    即使如果容器停止了,我们在本地更新文件,再将容器启动也可以实现数据同步。

    04Dockerfile添加数据卷

    除了使用-v选项来添加数据卷之外,也可以使用Dockerfile文件中的VOLUME命令来创建一个带数据卷的镜像。VOLUME 指令创建具有指定名称的挂载点,并将其标记为保存来自本地主机或其他容器的外部安装的数据卷。该值可以是 JSON 数组,VOLUME ["/var/log/"],也可以是带有多个参数的纯字符串,例如 VOLUME /var/log 或 VOLUME /var/log /var/db。

    使用Dockerfile创建带数据卷的镜像步骤如何下:

    1)创建一个Dockerfile文件

    任意一个目录下创建一个Dockerfile文件,Dockerfile文件内容如下:​​​​​​​

    FROM alpine:3.14//设置容器内的数据卷VOLUME ["/var/html"]EXPOSE 80

    2)使用build命令进行构建镜像​​​​​​​

    root@ubuntu:/home/test# docker build -t nginx:v1.0 .Sending build context to Docker daemon 8.65MBStep 1/3 : FROM alpine:3.143.14: Pulling from library/alpinea0d0a0d46f8b: Pull completeDigest: sha256:e1c082e3d3c45cccac829840a25941e679c25d438cc8412c2fa221cf1a824e6aStatus: Downloaded newer image for alpine:3.14---> 14119a10abf4Step 2/3 : VOLUME ["/var/html"]---> Running in baa52a8c37bdRemoving intermediate container baa52a8c37bd---> 83ba81539ce7Step 3/3 : EXPOSE 80---> Running in b0b0efd15aa3Removing intermediate container b0b0efd15aa3---> d10277ba6308Successfully built d10277ba6308Successfully tagged nginx:v1.0​​​​​​​
    root@ubuntu:/home/test# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEnginx v1.0 d10277ba6308 23 minutes ago 5.6MBnginx latest ad4c705f24d3 2 weeks ago 133MBalpine 3.14 14119a10abf4 4 weeks ago 5.6MB其中nginx标签为v1.0的是我们使用Dockerfile新建的镜像

    使用inspect命令可以查看该镜像的详细信息,在该镜像的详细信息中可以看到数据卷的信息。​​​​​​​

    root@ubuntu:/home/test# docker inspect d10277ba6308"Volumes": {"/var/html": {}},

    3)使用刚创建的镜像创建并运行一个容器​​​​​​​

    //创建一个容器,用的镜像为Dockerfile文件创建的镜像root@ubuntu:/home/test# docker run -it --name nginx-v1.0 d10277ba6308//查看创建容器的详细信息root@ubuntu:/home/test# docker inspect nginx-v1.0

    05数据卷容器

    如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载。

    1)创建一个父容器

    创建方法跟之前类似;

    2)再创建一个容器,并使用volumes-from选项来创建一个依赖于父容器容器。​​​​​​​

    //创建一个依赖容器root@ubuntu:/var/lib/docker/volumes# docker run -it --name nginx-dc2 --volumesfromtest-nginx nginx//查看刚创建的容器详细信息root@ubuntu:/home/test# docker inspect 41530b76bebf//可以看到会自动继承挂载的信息"Mounts": [{"Type": "volume","Name": "local-test-vol","Source": "/var/lib/docker/volumes/local-test-vol/_data","Destination": "/usr/local/nginx/html","Driver": "local","Mode": "","RW": true,"Propagation": ""}]

    挂载数据卷完成后,在父容器test-nginx或继承容器nginx-dc2中的任意一个容器更新、删除文件,都可以同步到另外一个容器中。


    http://www.ppmy.cn/embedded/176667.html

    相关文章

    RabbitMQ的高级特性介绍(二)

    发送方确认 当消息的⽣产者将消息发送出去之后,消息到底有没有正确地到达服务器呢? 如果在消息到 达服务器之前已经丢失(比如RabbitMQ重启, 那么RabbitMQ重启期间⽣产者消息投递失败), 持久化操作也解决不了这个问题,因为消息根本没有到达服务器&#…

    Bash 脚本基础

    一、Bash 脚本基础 什么是 Bash 脚本:Bash 脚本是一种文本文件,其中包含了一系列的命令,这些命令可以被 Bash shell 执行。它用于自动化重复性的任务,提高工作效率。 Bash 脚本的基本结构:以 #!/bin/bash 开头&#x…

    MyBatis-Plus(Ⅲ)IService详解

    目录 一、逐一演示 1.save(插入一条) 结果 断言(引入概念) 2.saveBatch(批量插入) 结果 3.saveOrUpdateBatch(批量插入&更新) 结果 4.removeById(通过id删除…

    VUE2导出el-table数据为excel并且按字段分多个sheet

    首先在根目录下建一个文件夹export用来存储export.js import * as XLSX from xlsxfunction autoWidthFunc(ws, data) {// 设置每列的最大宽度const colWidth data.map(row > row.map(val > {var reg new RegExp([\\u4E00-\\u9FFF], g) // 检测字符串是否包含汉字if (v…

    从零到一开发一款 DeepSeek 聊天机器人

    AI聊天机器人 目标设计方案系统架构技术选型功能模块 实现代码环境配置安装依赖 核心代码API 请求函数主循环函数 功能扩展1. 情感分析2. 多语言支持3. 上下文记忆4. 用户身份识别 总结附录 目标 开发一个智能聊天机器人,旨在为用户提供自然、流畅的对话体验。通过…

    二分查找------查找区间

    1. 题目 2. 思路和题解 这道题虽然是道中等题,并且看起来很复杂,但是实际上就是给定一个数组和目标值,让我们去寻找该目标值在数组中的位置。题目还提到说设计O(log n)的算法解决问题,更进一步暗示我们去用二分查找。要找开始位置…

    DeepSeek+RAG局域网部署

    已经有很多平台集成RAG模式,dify,cherrystudio等,这里通过AI辅助,用DS的API实现一个简单的RAG部署。框架主要技术栈是Chroma,langchain,streamlit,答案流式输出,并且对答案加上索引。支持doc,docx,pdf,txt。…

    《AI大模型开发笔记》企业RAG技术实战(二)

    接上一篇 《AI大模型开发笔记》企业RAG技术实战(一)https://mp.csdn.net/mp_blog/creation/editor/146381354 使用llamaindex实例 https://docs.llamaindex.ai/en/stable/api_reference/ 环境配置 我们继续使用前面langchain例子的python虚环境,不用新建,激活就行 …