Docker 容器数据:持久化

每当从镜像创建容器时,它都会创建一个新容器,除了镜像数据之外没有任何数据

  • 意味着如果在提交更改之前删除容器,我们将丢失数据
  • Docker 应该存在一种将数据的文件系统与容器的文件系统分开的技术
  • 每当创建容器时,也会创建一个文件系统【这是默认的 Linux 文件系统】
  • 尽管 Docker 共享操作系统的内核,但文件系统之间存在分离,不然 Docker 就失去了环境隔离的意义

在 Docker 中我们可以创建卷,并且可以挂载到容器的文件系统中

挂载

让我们来看一个简单的挂载:使用主机文件系统并使用带有运行命令的 -v 标志将其挂载到容器上

  • 语法 docker run -it -v <local-path>:<container-path>[:<flag>] <image>

    • flag 是可选的,比如使用 ro 标志可以实现只读效果
  • 我们使用镜像 python:3.6

#### 先在本地主机中创建一个用于挂载的目录,提示 pwd 可以显示当前路径,添加目录使用 mkdir ####
learn@debian10:~$ pwd
/home/learn
learn@debian10:~$ mkdir test
learn@debian10:~$ ls
apt-sources.sh learn.code-workspace packages.microsoft.gpg test work #### 创建挂载本地主机文件系统的容器 #### # 本地主机的 /home/learn/test 目录挂载到 容器的 /root/work 目录
docker run -it -v /home/learn/test:/root/work python:3.6 #### 结果:我们创建挂载的容器,并进入容器 python 的交互模式 ####
Python 3.6.15 (default, Dec 21 2021, 12:03:22)
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> # 判断容器中是否有 /root/work 目录
>>> import os
>>> os.path.isdir(r'/root/work')
True # 在 /root/work 目录,创建一个 test.txt 文件,写入 'test volume\n' 并退出容器
>>> with open(r'/root/work/test.txt', 'w', encoding='utf-8') as f:
... f.write('test volume\n')
...
11
>>> exit()

我们已经退出容器,容器也停止

# 查看 /home/learn/test 目录变化
learn@debian10:~$ ls /home/learn/test
test.txt
learn@debian10:~$ cat /home/learn/test/test.txt
test volume
  • 在容器中 /root/work 目录创建的 test.txt 以及其中数据被持久化在 /home/learn/test
  • 通过这种方式可以使容器中的数据得到保存,并且 /home/learn/test 挂载到不同容器中可以实现不同容器的数据共享
  • 毕竟 Docker 是对应用级的虚拟化,如果没有共享数据的方法,会导致大量重复数据,至于通信那是另一回事【通过端口映射可以实现不一定是挂载】,所有重复数据是主要问题【通过这种共享解决】
  • 挂载有一些限制,并且依赖于主机的文件系统,如果那个目录被删除,你能猜到后果

Volumes

接下来我们聊一聊 Volumes,上面我们知道主机文件系统绑定挂载存在的限制

  • Volumes 卷是 Docker 空间中创建的,这提供了对 Docker CLI 的更多控制
  • Docker Volumes 功能很明确:主要用于在不同容器内共享数据,而不是与主机和容器共享数据
  • 它的相关操作主要是通过 docker 的 volume 子命令

创建 volume 语法 docker volume create [<volume-name>] 其中卷名称是可选的,如果未指定会随机生成一个唯一 ID,最好指定方便记忆【指明含义,否则别起】

  • 在创建 Docker 卷后通过 docker volume inspect <volume-name> 可以查看卷的信息
learn@debian10:~$ docker volume create test-volume
test-volume
learn@debian10:~$ docker volume inspect test-volume
[
{
"CreatedAt": "2023-04-05T15:35:45+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/test-volume/_data",
"Name": "test-volume",
"Options": null,
"Scope": "local"
}
]

使用 test-volume 卷运行容器,语法:docker run -it -v <volume-name>:<container-path>[:<flag>] <image>

  • 创造一个负责数据写入的容器:将 test-volume 卷挂载到 /root/w 目录
learn@debian10:~$ docker run -it --name "write-container" -v test-volume:/root/w python:3.6
Python 3.6.15 (default, Dec 21 2021, 12:03:22)
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> with open(r'/root/w/test.txt', 'w', encoding='utf-8') as f:
... f.write('test volume')
...
11
>>> exit()
  • 创造一个负责只读的容器:将 test-volume 卷挂载到 /root/r 目录
# 这里判断方法比较粗浅,建议可以尝试读取 /root/r/test.txt
learn@debian10:~$ docker run -it --name "read-container" -v test-volume:/root/r:ro python:3.6
Python 3.6.15 (default, Dec 21 2021, 12:03:22)
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.path.exists(r'/root/r/test.txt')
True
>>> exit()
  • 说明一下:--name 项目是为容器命名,属于可选

对卷的管理:

  • docker volume ls 查看所有卷
  • docker volume rm <volume-name> 删除卷

其实最重要的命令是 docker volume --help

实际上还有种挂载形式 tmpfs

  • 这种方式具有临时性,因为保留在主机内存中,具体内容不大懂,推荐官方 https://docs.docker.com/storage/tmpfs/
  • 主要是应用于临时存储主机或容器可写层中的敏感文件,而且这种方法是不支持共享以及只有 Linux 上可以用

想了解更深,希望有知道的提点一下

mount 选项

这个选项基本统合了上面三种方式,而且这种方式在阅读上更严谨

  • 简单语法是 docker --mount 'type=[volume|bind|tmpfs], [src=<local-path|volume-name>] target=<container-path>', [volume-opt=<key=value>], [readonly|ro], ...

  • type 挂载类型在 volume、bind、tmpfs 中选

  • src 路径或卷【type=tmpfs 可以不指定】

  • target 挂载在容器中的路径

  • volume-opt 选项列表功能比较复杂,可选的

  • readonly 或 ro 可读属性,可选

  • ... 表示的是其他属性,建议去官网查看,或者使用 help

使用 docker inspect <container-name|container-id> 可以查看容器挂载内容,这个只是简单说明,毕竟不熟悉在后面学习再细化

Docker 容器数据:持久化的更多相关文章

  1. Docker 容器数据 持久化(系统学习Docker05)

    写在前面 本来是可以将数据存储在 容器内部 的.但是存在容器内部,一旦容器被删除掉或者容器毁坏(我亲身经历的痛,当时我们的大数据平台就是运行在docker容器内,有次停电后,不管怎样容器都起不来.以前 ...

  2. Docker自学纪实(三)Docker容器数据持久化

    谈起数据卷 我一直觉得是个枯燥无聊的话题 但是通过今天的实操和阅读 我发现其实并不是 其实就像走夜路 没有光明,第一次都是恐惧 但是如果走的次数多了 或者静下心来去克制恐惧 也许就会驾轻就熟或者等到黎 ...

  3. 4.云原生之Docker容器数据持久化介绍与实践

    转载自:https://www.bilibili.com/read/cv15182308/?from=readlist #### 创建一个web容器并创建一个数据卷挂载到容器的/webapp目录下(默 ...

  4. docker容器数据持久化

    将数据从宿主机挂载到容器中的三种方式 1.Volume 2.Bind Mounts 3.tmpfs Volumes:docker管理宿主机文件系统的一部分(/var/lib/docker/volume ...

  5. Docker深入浅出系列 | 容器数据持久化

    Docker深入浅出系列 | 容器数据持久化 Docker已经上市很多年,不是什么新鲜事物了,很多企业或者开发同学以前也不多不少有所接触,但是有实操经验的人不多,本系列教程主要偏重实战,尽量讲干货,会 ...

  6. docker mysql 数据持久化到本地、设置不区别表名大小写-清风柳絮-51CTO博客

    原文:docker mysql 数据持久化到本地.设置不区别表名大小写-清风柳絮-51CTO博客 Docker MySQL 把数据存储在本地目录,很简单,只需要映射本地目录到容器即可 1.加上-v参数 ...

  7. Docker容器数据卷-Volume详解

    Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume).数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享.数据 ...

  8. 『现学现忘』Docker基础 — 28、Docker容器数据卷介绍

    目录 1.什么是Docker容器数据卷 2.数据卷的作用 3.数据卷的使用 1.什么是Docker容器数据卷 Docker容器数据卷,即Docker Volume(卷). 当Docker容器运行的时候 ...

  9. docker容器的持久化存储:Volume

    独立于docker容器的持久化存储: 法(1):自动将服务器文件夹挂载到容器内部文件夹/usr/share/nginx/html,这样只修改服务器文件夹下的内容即可对应修改容器内部文件夹的内容 将服务 ...

  10. docker容器数据卷的使用

    什么是容器数据卷 docker的理念回顾 将应用和运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对于数据的要求,是希望能够持久化的! 就好比,你安装一个MySQL,结果你把容器删了,就相当于 ...

随机推荐

  1. Angular等了三年,那个她已经来了

    Angular生态丰富,功能强大,支撑了许多大型项目的开发.而且一直在前方等待着其他框架跟上.但是不得不直面的一个问题就是:"在等待其他框架跟上的这三年",Angular在陆陆续续 ...

  2. 云原生时代的"应用级"多云管理

    作者:张齐 当前云计算有多种形态公有云.私有云.边缘云.虚拟机等,如何高效管理多云是当前面临的问题,在云原生时代,又该如何利用云原生技术实现多云管理?本文将讲解通过 Rainbond实现"应 ...

  3. Canny边缘检测实现(Opencv C++)

    Canny边缘检测是Canny在1986年提出来的,目前仍是图像边缘检测算法中最经典.先进的算法之一.canny方法基于如下三个基本目标: 1. 低错误率:所有边缘都应被找到,并且不应有虚假响应. 2 ...

  4. C++笔记(7)成员初始化列表

    成员初始化列表由逗号分隔的初始化列表组成(前面带冒号),它位于参数列调的右括号之后,函数体左括号之前.如果数据成员的名称为mdata,并需要将它初始化为val,则初始化器为mdata(val). Cl ...

  5. Java常用的三个方法 `wait ` `notify` `notifyAll`

    常用的三个方法 wait notify notifyAll wait();方法使当前线程进入等待状态,直到另一个线程调用该对象的notify()或notifyAll()方法来唤醒它 notify(); ...

  6. Ansible-playbook剧本进阶

    剧本高级特性篇 循环 在写 playbook 的时候发现了很多 task 都要重复引用某个相同的模块,比如一次启动10个服务,或者一次拷贝10个文件,如果按照传统的写法最少要写10次,这样会显得 pl ...

  7. element el-input 去掉边框

    element样式还是蛮好的,只是有时候我们需要做一些调整,比如,el-input 的边框,官网是这样子的 我们需要去掉这个边框 试了常用的:border: none:  以及:outline:non ...

  8. url编码和解码分析URLEncoder.encode和URLDecoder.decode

    url编码和解码分析 1.Get请求会将参数做默认的url解码操作,接口接收到的值是Get解码后的值.2.可以将Get操作修改成Post操作,这样不会url解码.可以在接口中做url解码.3.在多次传 ...

  9. 解决git 区分文件名大小写

    问题:两人协作开发同一分支时,由于一方将组件文件名小写开头,并且推送到远程分支,导致我每次拉取代码会将我本地文件名改成小写,并且我手动改成大写后推送到远端仓库,远端仓库文件名无变化,还是小写. 查证后 ...

  10. Kubernetes(二)资源管理

    1. 资源管理介绍 在kubernetes中,所有内容都抽象为资源,用户需要操作资源来管理kubernetes. Kubernetes本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服 ...