【Docker】Docker数据的存储

默认情况下,在运行中的容器里创建的文件,被保存在一个可写的容器层里,如果容器被删除了,则对应的数据也随之删除了。

这个可写的容器层是和特定的容器绑定的,也就是这些数据无法方便的和其它容器共享。

Docker主要提供了两种方式做数据的持久化:

  • Data Volume:由Docker管理(数据目录/var/lib/docker/volumes/), 持久化数据的最好方式
  • Bind Mount:由用户指定存储的数据具体mount在系统什么位置

Data Volume

准备一个脚本

date.sh

#!/bin/bashwhile true
doecho `date`echo `date` >> /home/morris/dockerfile/volumn/logs/date.logsleep 1
done

准备一个镜像

Dockerfile

from alpine:latestlabel author=morrisenv work_dir /usr/appworkdir $work_dircopy date.sh .volume ["/home/morris/dockerfile/volume/logs/"]entrypoint ["sh", "date.sh"]

构建镜像:

$ docker build -t date:1.0 .
Sending build context to Docker daemon  4.608kB
Step 1/7 : from alpine:latest---> c059bfaa849c
Step 2/7 : label author=morris---> Using cache---> 4a7f368ccac1
Step 3/7 : env work_dir /usr/app---> Using cache---> 2413cf06006b
Step 4/7 : workdir $work_dir---> Using cache---> 1230bcd7bf40
Step 5/7 : copy date.sh .---> Using cache---> 6ad3761a0592
Step 6/7 : volume ["/home/morris/dockerfile/volume/logs/"]---> Using cache---> 82ad0fd1b949
Step 7/7 : entrypoint ["sh", "date.sh"]---> Using cache---> ca25386d02f3
Successfully built ca25386d02f3
Successfully tagged date:1.0

创建容器(不指定-v参数)

启动容器:

$ docker container run --rm date:1.0
Fri Sep 22 02:01:56 UTC 2023
Fri Sep 22 02:01:57 UTC 2023

另外启动一个shell,进入容器中查看日志:

$ docker container exec -it e4 sh
/usr/app # tail -f /home/morris/dockerfile/volume/logs/date.log
Fri Sep 22 02:03:32 UTC 2023
Fri Sep 22 02:03:33 UTC 2023
Fri Sep 22 02:03:34 UTC 2023

此时Docker会自动创建一个随机名字的volume,去存储我们在Dockerfile定义的volume。

可以使用docker container inspect命令查看随机生成的volume名称:

... ..."Mounts": [{"Type": "volume","Name": "b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87","Source": "/var/lib/docker/volumes/b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87/_data","Destination": "/home/morris/dockerfile/volume/logs","Driver": "local","Mode": "","RW": true,"Propagation": ""}],
... ...

可以使用docker volume ls查看所有的volume列表:

$ docker volume ls
DRIVER    VOLUME NAME
local     3dc166ddf9968412b6d9f8050a0b9d84f74a0fae4d8f5d1c55222222ec142c82
local     b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87
local     bc5e8a682761ee129bf98206758d4e6a76df9755f825c61c030330ce78190376
local     d62c8edbe60a80ba8c5d57c678e0badb542ec7ceb6120ce3d0e442c3e6d2f7b7
local     f3bbbca769c38f706f286b08824f6bcee0dfb362931c7bf5d97102f12e11fe4f
local     fc6e4e62f182938fa48954252ecbee4485194dcd1c11d995f25678744ce0300d

可以使用docker volume inspect查看volume的详细信息:

$ docker volume inspect b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87
[{"CreatedAt": "2023-09-22T10:01:56+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87/_data","Name": "b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87","Options": null,"Scope": "local"}
]

可以看到volume对应宿主机器上存储的物理地址为/var/lib/docker/volumes/b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87/_data,我们到这个目录查看下:

# cd /var/lib/docker/volumes/b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87/_data# ll
total 36
drwxr-xr-x 2 root root  4096 Sep 22 10:01 ./
drwx-----x 3 root root  4096 Sep 22 10:01 ../
-rw-r--r-- 1 root root 23867 Sep 22 10:15 date.log# tail -f date.log
Fri Sep 22 02:15:36 UTC 2023
Fri Sep 22 02:15:37 UTC 2023
Fri Sep 22 02:15:38 UTC 2023
... ...

当容器删除后,这个volume也随之删除了:

$ docker volume inspect b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87
[]
Error: No such volume: b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87

创建容器(指定-v参数)

在创建容器的时候通过-v参数我们可以手动的指定需要创建Volume的名字,以及对应于容器内的路径,这个路径是可以任意的,不必需要在Dockerfile里通过VOLUME定义。

比如在创建容器时指定volume的名字为mydate,对应容器的路径为/home/morris/dockerfile/volume/logs

$ docker container run -v mydate:/home/morris/dockerfile/volume/logs --rm date:1.0
Fri Sep 22 02:32:31 UTC 2023
Fri Sep 22 02:32:32 UTC 2023

查看volume列表:

$ docker volume ls
DRIVER    VOLUME NAME
local     mydate

删除容器后volume还存在,不会跟着容器一起删除,这样我们在下次运行新的容器时可以volume的名称继续使用volume中的数据。

Bind Mount

Docker Bind Mounts是一种用于将主机文件或目录挂载到Docker容器中的方法,可以实现容器与主机之间的文件共享。

Data Volume模式只能将/var/lib/docker/volumes/中的目录与Docker容器共享,而Docker Bind Mounts能实现主机中任意文件与容器之间的共享。

由于我这里使用的是WSL中运行的Docker,所以我们可以将Windows中的D盘的docker_data目录映射到一个具体GCC环境的Docker容器中,这样可以在Windows下使用编辑器编辑c语言的源文件,然后使用Docker容器中的GCC环境进行编译:

$ docker run --rm -it -v /mnt/d/docker_data:/usr/app gcc:9.4 bash
root@aedaf7a3e462:/# cd /usr/app/
root@aedaf7a3e462:/usr/app# ls
hello.c

多个机器之间的容器共享数据

官方参考链接 https://docs.docker.com/storage/volumes/#share-data-among-machines

Docker的volume支持多种driver。默认创建的volume driver都是local

$ docker volume inspect mydate
[{"CreatedAt": "2023-09-22T10:32:31+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/mydate/_data","Name": "mydate","Options": null,"Scope": "local"}
]

下面我们来看看一个叫sshfs的driver,如何让docker使用不在同一台机器上的文件系统做为volume

主机规划

准备两天Linux机器,之间可以通过SSH相互通信。

  • 192.168.200.10:名称为host1,安装Docker
  • 192.168.200.11:名称为host2,作为数据存储

账号密码都是 root/root

安装插件

host1:192.168.200.10上安装Docker插件vieux/sshfs

$ docker plugin install --grant-all-permissions vieux/sshfs
latest: Pulling from vieux/sshfs
Digest: sha256:1d3c3e42c12138da5ef7873b97f7f32cf99fb6edde75fa4f0bcf9ed277855811
52d435ada6a4: Complete
Installed plugin vieux/sshfs

创建volume

使用类型为vieux/sshfs的driver创建一个名为sshvolume的volume。

$ docker volume create --driver vieux/sshfs -o sshcmd=root@192.168.200.11:/home/logs -o password=root sshvolume

查看volume:

$ docker volume ls
DRIVER               VOLUME NAME
local                mydate
vieux/sshfs:latest   sshvolume$ docker volume inspect sshvolume
[{"CreatedAt": "0001-01-01T00:00:00Z","Driver": "vieux/sshfs:latest","Labels": {},"Mountpoint": "/mnt/volumes/24ef5f7f94863e87f7802e20f5662e68","Name": "sshvolume","Options": {"password": "root","sshcmd": "root@192.168.200.11:/home/logs"},"Scope": "local"}
]

创建容器挂载Volume

创建容器,挂载sshvolume

$ docker container run -v sshvolume:/home/morris/dockerfile/volume/logs --rm date:1.0
Thu Sep 28 07:39:49 UTC 2023
Thu Sep 28 07:39:50 UTC 2023
Thu Sep 28 07:39:51 UTC 2023
Thu Sep 28 07:39:52 UTC 2023

这个文件我们可以在host2上看到:

$ tail -f /home/logs/date.log
Thu Sep 28 07:39:49 UTC 2023
Thu Sep 28 07:39:50 UTC 2023
Thu Sep 28 07:39:51 UTC 2023
Thu Sep 28 07:39:52 UTC 2023

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Loop Copilot:AI驱动,小白也能自己生成音乐?

01 项目介绍 Loop Copilot是一个使用自然语言生成音乐的系统。它不仅允许你使用自然语言来生成你想要的音乐风格、节奏或旋律,还支持通过多轮对话对已生成的音乐进行进一步的编辑和修改。包括对生成的音乐进行编辑修改、添加或删除乐器、加入音效等。 02 工作流程…

(三)(Driver)驱动开发之双机调试环境搭建及内核驱动的运行

文章目录 1. 驱动开发环境搭建2. 驱动开发新建项目及项目属性配置和编译3. 双机调试环境搭建3.1 安装虚拟机VMware3.2 配置Dbgview.exe工具3.3 基于Windbg的双机调试 4. 内核驱动的运行4.1 临时关闭系统驱动签名校验4.2 加载驱动 1. 驱动开发环境搭建 请参考另一篇:https://bl…

Stable Diffusion WebUI扩展canvas-zoom详细讲解

canvas-zoom这是什么? 这是一个针对画布做一些操作的工具,比如缩放等。 下面来详细说一下这些操作的热键。 重要的热键: 缩放(Alt+滚轮)、移动画布 (F)、全屏 (S) 和重置缩放 (R) (1)Shift + wheel - 缩放画布 按住Shift + 滚轮之后,一点反应都没有,之后按…

上海市道路数据,有63550条数据(shp格式和xlsx格式)

数据地址: 上海市道路https://www.xcitybox.com/datamarketview/#/Productpage?id391 基本信息. 数据名称: 上海市道路数据 数据格式: Shpxlsx 数据时间: 2020年 数据几何类型: 线 数据坐标系: WGS84坐标系 数据来源:网络公开数据 数据字段&am…

lv8 嵌入式开发-网络编程开发 20 域名解析与http服务实现原理

目录 1 域名解析 2 如何实现万维网服务器&#xff1f; 2.1 HTTP 的操作过程 2.2 万维网服务器实现 1 域名解析 域名解析gethostbyname函数 主机结构在 <netdb.h> 中定义如下&#xff1a; struct hostent {char *h_name; /* 官方域名 */char **h_alias…

设计模式(五)—— 建造者模式/生成器模式

先简单记一下&#xff0c;以后再来认真写 还是造房子那个例子&#xff0c;一个房子分为①打地基 ② 砌墙 ③封顶三步&#xff0c;如果不用设计模式去写的话。就是一个超类&#xff0c;然后多个子类继承超类去重写 但是这样有两个缺点&#xff1a; &#xff08;1&#xff09;产…

【Python3】【力扣题】169. 多数元素

【力扣题】题目描述&#xff1a; 众数&#xff1a;一组数据中出现次数最多的数据。 【Python3】代码&#xff1a; 1、解题思路&#xff1a;哈希表。使用哈希映射存储各元素以及出现的次数&#xff0c;哈希映射中的键值对中的键为元素、值为该元素出现次数。 知识点&#xff1…

postman打开后,以前的接口记录不在,问题解决

要不这些文件保存在C:\Users\{用户名}\AppData\Roaming\Postman 比如&#xff0c;你目前使用的window登录用户是abc&#xff0c;那么地址便是C:\Users\abc\AppData\Roaming\Postman 打开后&#xff0c;这个目录下会有一些命名为backup-yyyy-MM-ddThh-mm-ss.SSSZ.json类似的文…

数据结构和算法概述

什么是数据结构&#xff1f; 官方解释&#xff1a; 数据结构是一门研究非数值计算的程序设计问题中的操作对象&#xff0c;以及他们之间的关系和操作等相关问题的学科。 大白话&#xff1a; 数据结构就是把数据元素按照一定的关系组织起来的集合&#xff0c;用来组织和存储…

知识分享|分段函数线性化及matlab测试

目录 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 4 matlab测试结果说明 5 分段线性化应用 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 clc;clear all;gn10;tn1;x_pfsdpvar(1, tn,…

云原生Docker Cgroups资源控制操作

目录 资源控制 cgroups四大功能 CPU 资源控制 设置CPU使用率上限 进行CPU压力测试 设置50%的比例分配CPU使用时间上限 设置CPU资源占用比&#xff08;设置多个容器时才有效&#xff09; 设置容器绑定指定的CPU 对内存使用的限制 限制容器可以使用的最大内存 限制可用的…

代码随想录Day24 LeetCode T491 递增子序列 LeetCode T46 全排列 LrrtCode T47 全排列II

LeetCode T491 递增子序列 题目链接:491. 递增子序列 - 力扣&#xff08;LeetCode&#xff09; 题目思路: 首先这里的测试用例很容易误导我们,这道题不能使用上次子集的思路对数组先排序,使用一个used数组来解决问题. 我们用[4,7,6,7]举例这道题的递增序列不存在[4,6,7,7]这个…

iconfont

iconfont-阿里巴巴矢量图标库https://www.iconfont.cn/ UI - 优设网 - 学设计上优设 (uisdc.com)https://www.uisdc.com/category/uiicon TreeNode moveNode (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode"); Point pt; …

重庆助理工程师申请步骤及注意事项

目录 一、前言二、步骤1. 职称系统网址 2. 一定使用谷歌浏览器&#xff0c;其他白搭三、材料准备1.思想和工作-要手写签字并盖单位公章&#xff0c;无模板2.近五年年度考核-填优秀&#xff0c;并改单位公章&#xff0c;无模板 四、流程1.单位公示要公示5个工作日&#xff0c;再…

C语言进阶第九课 --------动态内存管理

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

Python武器库开发-面向对象篇(六)

面向对象篇(六) 多态 多态指的是一类事物有多种形态&#xff0c;一个抽象类有多个子类&#xff08;因而多态的概念依赖于继承&#xff09;&#xff0c;不同的子类对象调用相同的方法&#xff0c;产生不同的执行结果&#xff0c;多态可以增加代码的灵活度 实现多态的步骤&…

物联网知识复习

物联网的内涵和体系结构 物联网的基本内涵 物联网的基本内涵在于物联&#xff0c;物物相连或者物和人相连的互联网。 也就是说&#xff0c;它是要由物主动发起的&#xff0c;物物互联的互联网。 它的第一层意思是说物和物相连&#xff1b;第二层意思是说物和人相连。 物联网的…

mac上mongodb 以及可视化工具 下载以及安装

简介 1. 下载 官网上的下载地址藏得非常深&#xff0c;不花老半天 根本找不到 下载地址 https://www.mongodb.com/try/download/community 目前最新社区版本7.0.2 下载链接 mac intel芯片 &#xff1a; https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-7.0.2.tgz ma…

VR全景应用广泛体现在哪里?有何优势?

VR全景作为一种新型营销方式&#xff0c;正在逐渐走进人们的视线&#xff0c;它区别于以往单一角度的照片和视频&#xff0c;VR全景制作显得更加直观、更加真实、更加生动。VR全景通过VR技术将所拍摄的图片变成720度可观看的场景模式&#xff0c;把产品的特色以及魅力整体呈现展…

css中px、em、rem、%、vw、vh、vm、rpx 这些单位的区别

序言 px&#xff1a;像素 相对长度单位&#xff0c;相对于显示器屏幕分辨率(推荐使用) em&#xff1a;相对长度单位 基准点为父节点字体的大小&#xff0c;如果自身定义了font-size按自身来计算&#xff08;浏览器默认字体是16px&#xff09;&#xff0c;整个页面内1em不是一个…