当前位置: 首页 > news >正文

【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

相关文章:

【Docker】Docker数据的存储

默认情况下,在运行中的容器里创建的文件,被保存在一个可写的容器层里,如果容器被删除了,则对应的数据也随之删除了。 这个可写的容器层是和特定的容器绑定的,也就是这些数据无法方便的和其它容器共享。 Docker主要提…...

hive字段关键字问题处理

最近在xxl_job部署shell调度任务时,发现在编写Hql时,对一些使用关键字命名的字段无法解析,按开发规范,字段命名不应该有关键字,但是数据来源是第三方,无法修改,需要通过flume对从kafka的数据到hdfs上,数据是json格式,所以需要对关…...

指定顺序输出

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…...

(Java)中的数据类型和变量

文章目录 一、字面常量二、数据类型三、变量1.变量的概念2.语法的格式3.整型变量4.长整型变量5.短整型变量6.字节型变量 四、浮点型变量1.双精度浮点数2.单精度浮点数 五、字符型常量六、布尔型变量七、类型转换1.自动类型转换(隐式)2.强制类型转换(显式…...

SHELL脚本编程基础,bilibili王晓春老师课程个人笔记(写比较简单,仅供参考)

文章目录 一、第一天(Shell脚本编程基础)作者视频ppt部分作者视频操作编写一个hello.sh可执行文件使hello.sh可以到处运行没有执行权限的执行方式下载httpd(web服务器)curl字符界面浏览器 命令列表凌乱笔记 作业重点: …...

VS code运行vue项目

要在VS Code中启动Vue项目,您可以按照以下步骤进行操作: 1.打开VS Code,并确保已安装Vue.js插件(如Vetur)。 2.在VS Code的侧边栏中,选择您的Vue项目文件夹,或者使用菜单中的“文件”->“打…...

matlab中narginchk函数用法及其举例

matlab中narginchk函数用法及其举例 narginchk在编写子函数程序时候,在验证输入参数数目方面具有重要作用,本博文讲一讲该函数的用法。 一、narginchk功能 narginchk的作用是验证输入参数数目。 二、语法 narginchk(minArgs,maxArgs)narginchk(minA…...

k8s集群镜像下载加gradana监控加elk日志收集加devops加秒杀项目

展示 1.配套资料2.devops 3.elk日志收集 4.grafana监控 5.dashboard![在这里插入图片描述](https://img-blog.csdnimg.cn/bf294f9fd98e4c038858a6bf5c34dbdc.png 目的 学习k8s来来回回折腾很久了,光搭个环境就能折腾几天。这次工作需要终于静下心来好好学习了一…...

waf绕过

1.市场Waf分类 硬件Waf:绿盟、安恒、启明、知道创宇等 需要选择模式 透明模式 反向代理分为反向代理(代理模式)与反向代理(牵引模式) 反向代理又分为两种模式,反向代理…...

在 MyBatis-Plus 中,如果你想通过其他字段进行修改操作,可以使用条件构造器(Wrapper)来指定修改的条件。

在 MyBatis-Plus 中,如果你想通过其他字段进行修改操作,可以使用条件构造器(Wrapper)来指定修改的条件。 对不起,我在之前的回答中犯了一个错误。在条件构造器中,eq 方法的第一个参数应该是数据库表中的列…...

Python Opencv实践 - 入门使用Tesseract识别图片中的文字

做车牌识别项目前试一试tesseract识别中文。tesseract的安装使用请参考: Python OCR工具pytesseract详解 - 知乎pytesseract是基于Python的OCR工具, 底层使用的是Google的Tesseract-OCR 引擎,支持识别图片中的文字,支持jpeg, png…...

TCP通信实战案例-即时通信

即时通信是什么含义,要实现怎么样的设计? 即时通信,是指一个客户端的消息发出去,其他客户端可以接收到。 即时通信需要进行端口转发的设计思想。 服务端需要把在线的Socket管道存储起来。 一旦收到一个消息要推送给其他管道。…...

【数据结构初阶】算法的时间复杂度和空间复杂度

算法的时间复杂度和空间复杂度 1.算法效率1.1 如何衡量一个算法的好坏1.2 算法的复杂度 2.时间复杂度2.1 时间复杂度的概念2.2 大O的渐进表示法2.3常见时间复杂度计算举例 3.空间复杂度4. 常见复杂度对比 1.算法效率 1.1 如何衡量一个算法的好坏 如何衡量一个算法的好坏呢&am…...

git log 命令详解

测试仓库 asdf 常用参数 查询指定目录 git -C /Users/yanlp/workspace/asdf log 限制显示提交数量 git log -n 3 限制提交人|邮箱 git log --authorEdwin Kofler | git log --authoredwinkofler.dev 限制一个月内的提交git log --since1.month.ago | git log --since2023-0…...

docker运行elastic和kibana,并使用密码连接

1. elasticsearch 运行容器 docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" elasticsearch:7.7.0 进入容器 docker exec -it elasticsearch bash修改配置开启密码校验 vi ./conf/elasticsearch.yml添加以下内容 …...

前端html生成PDF

需要用到的组件 1、html2canvas 地址:http://html2canvas.hertzen.com/ 安装:npm install --save html2canvas 2、jsPDF 地址:https://github.com/parallax/jsPDF 安装:npm install jspdf --save 代码 // 导出页面为PDF格式 im…...

通信算法之190: 频谱频移fftshift

...

强化学习代码实战(3) --- 寻找真我

前言 本文内容来自于南京大学郭宪老师在博文视点学院录制的视频,课程仅9元地址,配套书籍为深入浅出强化学习 编程实战 郭宪地址。 正文 我们发现多臂赌博机执行一个动作之后,无论是选择摇臂1,摇臂2,还是摇臂3之后都会返…...

SA+ST表维护height+单调队列维护:CF1073G

https://www.luogu.com.cn/problem/CF1073G lcp相关的,先跑个sa,然后height建个ST表 现在考虑询问,我们按A和B按 r k rk rk 排序。现在考虑B->A,反过来同理。 我们可以用单调队列维护,满足height是单增的。因为…...

Java中JVM、JRE和JDK三者有什么区别和联系?

任何语言或者软件的运行都需要环境。就像人要生活在空气中,鱼要活在水中,喜阴植物就不能放在阳光下暴晒一样,任何对象个体的存在都离不开其所需要的环境,编程语言亦是一样的。 java 语言的开发运行,也离不开 Java 语言…...

数据库SQLite基础

SQLite的存储结构 --->B树 大型数据库 :Oracle 中型数据库 :Server是微软开发的数据库产品,主要支持windows平台 小型数据库 : MySQL是一个小型关系型数据库管理系统。开放源码 (嵌入式不需要存储太多数据) 一、SQLite基础 SQLite的源代码…...

32单片机——窗口看门狗

1、WWDG的简介 WWDG:Window watchdog,即窗口看门狗 窗口看门狗本质上是能产生系统复位信号和提前唤醒中断的递减计数器 WWDG产生复位信号的条件: (1)当递减计数器值从0x40减到0x3F时复位(即T6位跳变到0&a…...

深入理解数字音频:采样率、位深与量化

在当今数字时代,音频技术已经渗透到我们生活的方方面面——从流媒体音乐到视频会议,从播客到智能家居。但你是否曾好奇过,这些美妙的声音是如何被捕捉、存储并在数字世界中重现的?本文将带你深入了解数字音频的核心概念&#xff0…...

【iSAQB软件架构】软件架构中构建块的视图:黑箱、灰箱和白箱及其交互机制

在软件架构描述中,黑箱视图(Black-box)、灰箱视图(Gray-box)和白箱视图(White-box) 是不同抽象层级的构建模块表示方式,用于满足不同受众和设计阶段的需求。以下是基于ISAQB标准的清…...

短视频矩阵SaaS系统:开源部署与核心功能架构指南

一、系统架构概述 短视频矩阵系统是基于SaaS(软件即服务)模式的多平台内容管理解决方案,通过开源技术实现账号聚合、智能创作、跨平台分发及数据闭环。系统采用微服务架构,支持高并发场景下的弹性扩展。 二、核心功能模块开发逻辑…...

ProfiNet 分布式 IO 在某污水处理厂的应用

随着城市化进程的加速,污水处理厂的规模和复杂性不断增加,对自动化控制系统的要求也越来越高。PROfinet 分布式 IO 作为一种先进的工业通信技术,以其高速、可靠、灵活的特性,为污水处理厂的自动化升级提供了有力支持。本文将结合某…...

AWS 亚马逊 S3存储桶直传 前端demo 复制即可使用

自己踩过坑不想别人也踩坑了 亚马逊S3存储桶直传前端demo复制即可使用 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0…...

DAY 15 复习日

浙大疏锦行 数据使用爬虫爬取weibo数据&#xff0c;下面是代码 import datetime import os import csv import timeimport numpy as np import random import re import urllib.parse import requests from fake_useragent import UserAgentdef init():if not os.path.exists…...

Elasticsearch中的语义搜索(Semantic Search)介绍

Elasticsearch中的**语义搜索(Semantic Search)**是一种基于文本语义理解的搜索技术,它能够超越传统的关键词匹配,识别查询与文档之间的语义相关性,从而提供更精准、更符合用户意图的搜索结果。这种技术通过捕捉文本背后的含义、上下文和概念关联,解决了传统搜索中常见的…...

StoreView SQL,让数据分析不受地域限制

作者&#xff1a;章建&#xff08;处知&#xff09; 引言 日志服务 SLS 是云原生观测和分析平台&#xff0c;为 Log、Metric、Trace 等数据提供大规模、低成本、实时的平台化服务。SLS 提供了多地域支持【1】&#xff0c;方便用户可以根据数据源就近接入 SLS 服务&#xff0c…...