Docker(五)进阶:Docker卷(volumes)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 数据卷:设计用来持久化数据的,它的生命周期独立于容器,不会因为容器被删除后自动删除,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷。

前言


学习本文需要一些了解Docker的概念以及一些名词。

个人网站:https://linzyblog.netlify.app/

一、在Docker中管理数据


1、为什么要挂载?


默认情况下,在容器内创建的所有文件都存储在可写容器层上。这意味着:


  • 当该容器被删除时,数据也会被同样删除,如果有另一个进程需要数据,就很难从容器中取出数据。
  • 容器的可写层与运行容器的宿主机紧密耦合,你无法将数据移动到其他地方。
  • 写入容器的可写层需要存储驱动程序来管理文件系统。存储驱动程序提供了一个联合文件系统,使用 Linux 内核。与使用直接写入主机文件系统的数据卷相比,这种额外的抽象会降低性能 。


Docker有两种方法:volumes 卷 和 bind mounts 绑定挂载 可以让容器在主机上存储文件,以便即使容器停止或删除后文件也能持久化保存。


Docker 还支持将文件存储在主机内存中的容器。此类文件不会持久保存。如果您在 Linux 上运行 Docker,则使用tmpfs 挂载将文件存储在主机的系统内存中。如果您在 Windows 上运行 Docker,命名管道用于将文件存储在主机的系统内存中。


2、选择正确的挂载方式


无论你选择那种挂载的方式,容器内的数据看起来都是一样的。数据以目录或文件系统中的单个文件的形式公开。


卷(volumes)、绑定挂载(bind mounts)和 tmpfs挂载(tmpfs mounts) 之间的差异就是数据在Docker主机上的位置不同。


dca996cbd06848dfaadd8e28e9ad9e90.png


  • 卷(volumes):存储在由 Docker(/var/lib/docker/volumes/在 Linux 上)管理的主机文件系统的一部分中。非 Docker 进程不应修改文件系统的这一部分。卷是在 Docker 中持久化数据的最佳方式。


  • 绑定挂载(bind mounts):可以存储在主机系统的任何位置。它们甚至可能是重要的系统文件或目录。Docker 主机或 Docker 容器上的非 Docker 进程可以随时修改它们。


  • tmpfs挂载(tmpfs mounts):仅存储在主机系统的内存中,永远不会写入主机系统的文件系统。


二、卷(volume)


1、卷的概述


卷(volume)提供了将容器的特定文件系统路径连接回主机的能力,简单来说就是将容器的目录映射到主机上。如果容器中的目录已挂载,则该目录中的更改也会在主机上看到。如果我们在容器重启时挂载相同的目录,我们会看到相同的文件,这就是容器的持久化和同步操作。


  • Docker Volume 命令能让容器从宿主机中读取文件,或从容器中持久化数据到宿主机中,让容器与容器产生的数据分离开来,一个容器可以挂载多个不同的目录。


  • Volume的生命周期是独立于容器的生命周期之外的,即使容器删除了,Volume也会被保留下来,Docker不会因为这个Volume没有被容器使用而自动回收。


  • 在容器中,添加或修改这个文件夹里的文件也不会影响到容器的联合文件系统。


2、卷的优点


卷是Docker容器生成和使用数据的首选保存机制。绑定挂载依赖于主机的目录结构和操作系统,但卷是完全由Docker管理。


  • 卷比绑定挂载更容易备份或迁移数据。
  • 卷可以直接使用Docker CLI 命令或 Docker API 管理。
  • 卷可以在 Linux 和 Windows 容器上运行。
  • 卷可以在多个容器之间更安全的共享。
  • 卷允许将卷挂载到远程主机或云服务器上,以加密卷的内容或添加其他功能。
  • 新卷的内容可以由容器预先填充。
  • Docker Desktop 上的卷比 来自Mac 和 Windows 主机的绑定挂载具有更高的性能。


此外,与将数据持久化到容器的可写层相比,卷通常是更好的选择,因为卷不会增加使用它的容器的大小,而且卷的内容存在于给定容器的生命周期之外


0764c64e581c40b1bbe4da9ec1c77ceb.png


注意:如果你的容器需要生成非持久化状态数据,优先选择tmpfs 挂载以避免将数据永久存储在任何地方,并且避免写入容器的可写层来提高容器性能。


3、卷的使用


  • 格式:


docker run -it -v 主机目录:容器内目录


  • 测试:


1.使用卷将容器内/home目录挂载绑定到主机的E:/home/test目录下,Docker会自动在主机创建目录


6efeb1cdbf524993a43860e3a9078ca1.png

8ee9a4227149489ea5d92af67a568f1b.png


2.用docker inspect 命令查看容器挂载数据,找到Mounts数据


e9051a6b30254e53910143474a2b2a49.png

6485fc32389e4bfc95d4dcd72a88be70.png


  • Type:挂载的类型,可以是bind、volume或 tmpfs。
  • Source:主机内目录路径地址。
  • Destination:Docker容器内目录的路径地址。


3.在容器的/home目录下进行操作


2e4c152a55b54047a44a2256e66ad3a9.png

13ed0f8655484fb39b8f4964879fd311.png


在主机目录也会同时创建一个test.go。


这是同步的过程,双方目录挂载后,双方各自的操作是双向绑定的。


4.停止Docker 容器后,修改主机目录内的文件内容,启动容器后,数据是否还是会同步到容器


cb67f818c03546dc93c60bf1effdd1c7.png

6adc0840ea0f4f71b9ca20b2e677b659.png

6ca0019b10f74ecabf0f424e40d9087a.png


是可以的,挂载目录是双向绑定的,以后只需在本地修改即可,容器内也会自动同步


4、实战:持久化数据


1)MySQL容器为什么挂载数据卷?


我们每次启动一个MySQL容器,数据库都是空的。删除容器后,数据也同样丢失,如果有其他进程也在访问这个数据库,就会取不出数据。


数据卷:设计用来持久化数据的,它的生命周期独立于容器,不会因为容器被删除后自动删除,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷。


2)MySQL容器挂载数据卷


1.拉取MySQL镜像,运行容器的时候做挂载数据卷,启动MySQL容器需要配置密码


docker run -d -p 3310:3306 -v E:/home/mysql/conf:/etc/mysql/conf.d -v E:/home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysqltest mysql:5.7


可选项名称 说明
-d 在后台运行容器并打印容器 ID
-p -p xxxx:yyyy:宿主机上xxxx端口对应容器中yyyy端口,在外部访问时用的是宿主机上的端口
-v 卷挂载
-e 环境配置
–name 容器名称


4fb002ff21dc495f9b080ffc633155d3.png


2.启动容器成功之后,本地用navicat连接数据库测试一下


14050c5be614427f90d1ed449c2b2369.png

b60b7566fe9c487295486e8b0feb1e63.png



3. 新建一个test数据库,建立test数据表,并插入几条数据。


af1c1fb1a4014668b1d15923d3dbaf8e.png


4.删除MySQL容器,在重新运行后,测试一下数据是否还存在,数据是否是持久化的。


f07f920cd3634b5a9eb932ef1693e05d.png

e8366dac03914b428e65878cc45a45df.png


我们可以看到数据依旧存在,我们挂载在本地的数据并没有随着容器的删除而丢失,它的生命周期已经独立于容器,这就实现了容器数据持久化。


5、Volume命令


1)docker volume create


  • 作用:创建数据卷
  • 格式:


docker volume create [OPTIONS] [卷名]


  • 说明


创建容器可以使用和存储数据的新卷。如果未指定名称,Docker 会生成一个随机名称。


  • 可选项:


名称,简写 默认 描述
–driver,-d local 指定卷驱动程序名称
–label 为卷设置元数据
–name 指定卷名
–opt,-o 设置驱动程序特定选项


  • 例子:


9143ca2159d04d689d2c07d961f88edc.png


2)docker volume inspect


  • 作用:显示一个或多个卷的详细信息
  • 格式:


docker volume inspect [OPTIONS] 卷名 [卷名...]


  • 说明:


返回有关卷的信息。默认情况下,此命令将所有结果呈现在 JSON 数组中。您可以指定替代格式来为每个结果执行给定的模板。Go 的 text/template包描述了该格式的所有细节。


  • 可选项:


名称,简写 默认 描述
–format,-f 使用给定的 Go 模板格式化输出


  • 例子:


c8cb9150090840f5a00aefe7b18ccfb7.png


  • 当你创建一个Volume,Docker都会默认在宿主机的/var/lib/docker/volumes目录下自动创建一个子目录,默认情况下都是目录名都是一串UUID。


  • 如果指定了名称,则目录名是Volume名称。Volume里的数据都存储在这个子目录的_data目录下。


3)docker volume ls


  • 作用:查看本地数据卷列表
  • 格式:


docker volume ls [OPTIONS]


  • 说明:


列出 Docker 已知的所有卷。可以使用 -f or --filter标志进行过滤。


  • 可选项:


名称,简写 默认 描述
–filter,-f 提供过滤器值(例如 ‘dangling=true’)
–format 使用 Go 模板格式化打印卷
–quiet,-q 只显示卷名


  • 例子:


0c69ac1c5d584be2805490da5d3070e1.png


4)docker volume prune


  • 作用:删除所有未使用的本地卷
  • 格式:


docker volume prune [OPTIONS]


  • 说明:


删除所有未使用的本地卷。未使用的本地卷是那些未被任何容器引用的本地卷


  • 可选项:


名称,简写 默认  描述
–filter   提供过滤器值(例如 ‘label=’)
–force,-f   不提示确认


  • 例子:


4651ad1be8bb434e960f42f407033610.png


5)docker volume rm


  • 作用:删除一个或多个卷
  • 格式:


docker volume rm [OPTIONS] 卷名[卷名...]


  • 说明:


删除一个或多个卷。您不能删除容器正在使用的卷。


  • 可选项:


名称,简写 默认 描述
–force,-f 强制删除一个或多个卷


  • 例子:


cacf5316b59e4406961005d35df11adb.png


6、匿名挂载和具名挂载


1)匿名挂载


没有给数据卷名字的挂载。


81570cf7f21e4184aee4b4403a37cadf.png


除了最后一条由具体名字的挂载,其他都是匿名挂载的


格式:


docker run -d -P -v 容器内路径 镜像名:tag1

dbc2c53cc6114c1bbd7fa0bda507b78f.png


2)具名挂载


给数据卷指定名字的挂载。


2bbfb4ec88bc4d17b510636be386c651.png


最后一条是具名挂载的数据卷


格式:


docker run -d -P --name 容器名称 -v 卷名称:容器内路径 镜像名:tag

30269d15bddc4443a3fd0f70348c3f6b.png


3)如何区分挂载?


如何区分匿名挂载、具名挂载还是指定路径挂载呢?


1.匿名挂载:-v 容器内路径

2.具名挂载 :-v 卷名:容器内路径

3.指定路径挂载:-v /宿主机路径:容器内路径

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
安全 关系型数据库 MySQL
Docker 进阶 发布自己的Docker镜像 将镜像上传到阿里云和Docker Hub
上传自己制作的docker镜像的方法,将docker镜像上传到Docker Hub,阿里云的两种方法,以及上传镜像时可能遇见的问题和解决办法,每一步的详解和上传镜像时的规范。
3751 0
Docker 进阶 发布自己的Docker镜像 将镜像上传到阿里云和Docker Hub
|
数据可视化 网络安全 数据安全/隐私保护
Dokcer进阶 Docker配置可视化面板 Portainer可视化面板安装
容器可视化界面安装配置,以及可视化界面的一些基础操作,以及命令详解
1442 0
Dokcer进阶 Docker配置可视化面板 Portainer可视化面板安装
|
4月前
|
关系型数据库 MySQL 应用服务中间件
docker的使用与进阶
docker的使用与进阶
78 0
|
缓存 网络协议 Linux
Docker(六)进阶:Dockerfile概述与用法(两万字入门到精通)
EXPOSE指令告诉Docker容器在运行时监听指定的网口。可以指定端口侦听的协议类型是TCP还是UDP,如果不指定协议类型,默认为TCP。
292 0
Docker(六)进阶:Dockerfile概述与用法(两万字入门到精通)
|
存储 Ubuntu Linux
Docker(四)进阶:Docker镜像概述和分层原理
镜像是一个只读模板,带有创建Docker容器的说明。通常,一个镜像基于另一个镜像,并带有一些额外的定制。例如,您可以构建一个基于ubuntu镜像的镜像,但是要安装Apache web服务器和您的应用程序,以及运行应用程序所需的配置细节。
663 0
Docker(四)进阶:Docker镜像概述和分层原理
|
存储 Ubuntu 关系型数据库
Docker进阶-Dockerfile建立一个自定义的镜像执行自定义进程
Docker进阶-Dockerfile建立一个自定义的镜像执行自定义进程
240 0
Docker进阶-Dockerfile建立一个自定义的镜像执行自定义进程
|
Shell Linux 网络安全
【靶机】xss盗取cookie-sqlmap进阶-通配符提权-docker逃逸-The Marketplace
靶机难度中等,对小白不太友好,建议边打边看,学习一下思路。
258 0
|
Kubernetes Cloud Native 算法
【Docker】企业进阶实战【Docker-Compose/Stack/Secret/Swarm/Config】
【Docker】企业进阶实战【Docker-Compose/Stack/Secret/Swarm/Config】
154 0
【Docker】企业进阶实战【Docker-Compose/Stack/Secret/Swarm/Config】
|
网络协议 安全 应用服务中间件
【Docker】企业进阶实战Docker网络【太神奇啦】
【Docker】企业进阶实战Docker网络【太神奇啦】
88 0
【Docker】企业进阶实战Docker网络【太神奇啦】
|
数据可视化 关系型数据库 MySQL
企业应用交付Docker镜像进阶实战笔记(下
企业应用交付Docker镜像进阶实战笔记(下
124 0
企业应用交付Docker镜像进阶实战笔记(下