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

这篇具有很好参考价值的文章主要介绍了Docker(五)进阶:Docker卷(volumes)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

学习本文需要一些了解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主机上的位置不同。

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

  • 卷(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 主机的绑定挂载具有更高的性能。

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

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

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

3、卷的使用

  • 格式:
docker run -it -v 主机目录:容器内目录
  • 测试:
  1. 使用卷将容器内/home目录挂载绑定到主机的E:/home/test目录下,Docker会自动在主机创建目录
    Docker(五)进阶:Docker卷(volumes)
    Docker(五)进阶:Docker卷(volumes)
  2. 用docker inspect 命令查看容器挂载数据,找到Mounts数据
    Docker(五)进阶:Docker卷(volumes)
    Docker(五)进阶:Docker卷(volumes)
  • Type:挂载的类型,可以是bind、volume或 tmpfs。
  • Source:主机内目录路径地址。
  • Destination:Docker容器内目录的路径地址。
  1. 在容器的/home目录下进行操作

Docker(五)进阶:Docker卷(volumes)
Docker(五)进阶:Docker卷(volumes)
在主机目录也会同时创建一个test.go。

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

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

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

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

Docker(五)进阶:Docker卷(volumes)
是可以的,挂载目录是双向绑定的,以后只需在本地修改即可,容器内也会自动同步

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 容器名称

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

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

Docker(五)进阶:Docker卷(volumes)
Docker(五)进阶:Docker卷(volumes)
3. 新建一个test数据库,建立test数据表,并插入几条数据。

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

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

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

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

5、Volume命令

1)docker volume create

  • 作用:创建数据卷
  • 格式:
docker volume create [OPTIONS] [卷名]
  • 说明

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

  • 可选项:
名称,简写 默认 描述
–driver,-d local 指定卷驱动程序名称
–label 为卷设置元数据
–name 指定卷名
–opt,-o 设置驱动程序特定选项
  • 例子:
    Docker(五)进阶:Docker卷(volumes)

2)docker volume inspect

  • 作用:显示一个或多个卷的详细信息
  • 格式:
docker volume inspect [OPTIONS] 卷名 [卷名...]
  • 说明:

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

  • 可选项:
名称,简写 默认 描述
–format,-f 使用给定的 Go 模板格式化输出
  • 例子:

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

  • 当你创建一个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 只显示卷名
  • 例子:

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

4)docker volume prune

  • 作用:删除所有未使用的本地卷
  • 格式:
docker volume prune [OPTIONS]
  • 说明:

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

  • 可选项:
名称,简写 默认 描述
–filter 提供过滤器值(例如 ‘label=
–force,-f 不提示确认
  • 例子:

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

5)docker volume rm

  • 作用:删除一个或多个卷
  • 格式:
docker volume rm [OPTIONS] 卷名[卷名...]
  • 说明:

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

  • 可选项:
名称,简写 默认 描述
–force,-f 强制删除一个或多个卷
  • 例子:

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

6、匿名挂载和具名挂载

1)匿名挂载

没有给数据卷名字的挂载。
Docker(五)进阶:Docker卷(volumes)
除了最后一条由具体名字的挂载,其他都是匿名挂载的

格式:

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

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

2)具名挂载

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

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

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

格式:

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

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

3)如何区分挂载?

如何区分匿名挂载、具名挂载还是指定路径挂载呢?文章来源地址https://www.toymoban.com/news/detail-511623.html

  1. 匿名挂载:-v 容器内路径
  2. 具名挂载 :-v 卷名:容器内路径
  3. 指定路径挂载:-v /宿主机路径:容器内路径

到了这里,关于Docker(五)进阶:Docker卷(volumes)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学习网安需要了解的一些基础知识

    1.POC/EXP POC(proof of concept)常指一段漏洞验证代码;EXP(exploit)指利用系统漏洞进行攻击的动作 PoC是证明 漏洞 存在的,而  Exp  是利用这个 漏洞 进一步进行攻击,先有POC,才有EXP         2.Payload/shellcode payload(有效攻击负载) 指的是漏洞利用载荷利用管道,我们在漏洞利用成

    2024年02月11日
    浏览(37)
  • Docker数据卷(Volume)

    一、数据卷概念 数据卷是宿主机中的一个 目录或者文件 ,当容器目录和数据卷目录绑定后,对方的修改会立即同步。 一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷。 简单来说,数据卷本质其实是共享文件夹,是 宿主机与容器之间 数据共享的桥梁

    2024年02月08日
    浏览(33)
  • 【Docker】什么是Docker呢?本文带你洞悉

    🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,目前专攻C/C++、Python、Java等方向,一个正在慢慢前行的普通人。 🏀系列专栏:陈童学的日记 💡其他专栏:C++STL、蓝桥杯,喜欢OJ的小伙伴可以看一手 🎁希望各位→点赞👍 + 收藏⭐️ + 留言📝 ​ ⛱️学习应使你快乐!望与诸君

    2024年02月12日
    浏览(69)
  • linux:docker采用volume时,如果是代码,volume里的内容改变时代码不会生效

    问题:         如描述 解决办法:         必须手动重启一次容器 docker restart xxx

    2024年02月11日
    浏览(35)
  • Docker Volume - 目录挂载以及文件共享

    Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)。数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享。数据卷呈现给Docker容器的形式就是一个目录,支持多个容器间共享,修改也不会影响镜像。使用Docker的数

    2024年02月20日
    浏览(41)
  • docker 的volume 是个什么概念

    在Docker中,Volume(卷)是一种用于在容器和主机之间共享和持久化数据的机制。Volumes允许在容器之间或容器与主机之间共享文件,并且数据在容器的生命周期中是持久的。这是因为容器的文件系统是临时的,容器被删除后文件系统中的数据也会被清除,而Volume提供了一种解决

    2024年02月22日
    浏览(37)
  • 《Docker极简教程》--前言--Docker的简介

    Docker 是一种用于构建、部署和运行应用程序的开源平台,它使用容器技术来实现轻量级、可移植和自包含的应用程序环境。Docker 的核心思想是将应用程序及其依赖项打包到一个称为容器的封闭单元中,从而消除了在不同环境中运行应用程序时可能出现的许多兼容性和依赖性

    2024年02月21日
    浏览(43)
  • Docker Volume 看这一篇就够了

    默认情况下,在容器内创建的所有文件都存储在可写容器层上。这意味着: 当该容器不再存在时,数据不会持续存在,并且如果另一个进程需要数据,则可能很难将数据从容器中取出。 容器的可写层与运行容器的主机紧密耦合。您无法轻松地将数据移动到其他地方。 写入容

    2024年02月02日
    浏览(89)
  • 【DevOps系列】Docker数据卷(volume)详解

    Docker的镜像是由多个只读的文件系统叠加在一起形成。启动一个容器的时候,docker会加载只读层并在只读层的上面(栈顶)增加一个读写层。如果需要修改只读层的文件,那么这个文件层需要复制到读写层。该文件的只读版本还在,只是被上面写层的文件副本隐藏。当删除

    2024年02月07日
    浏览(35)
  • docker——数据卷(volume)概念及使用案例

    Docker的镜像是有⼀系列的只读层组合⽽来,当启动⼀个容器时,Docker加载镜像的所有只读层,并在最上层加⼊⼀个读写层。这个设计使得Docker可以提⾼镜像构建、存储和分发的效率,节省了时间和存储空间,然⽽也存在⼀些问题: 容器中的⽂件在宿主机上存在形式复杂,不能

    2024年02月03日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包