【云原生】Docker数据卷学习

本文详细介绍了Docker数据卷的概念和作用,包括数据卷的持久化特性,如何通过命令挂载数据卷到宿主机目录,以及在nginx和mysql中的实践案例。数据卷使得容器数据在容器生命周期之外得以保存,支持多容器共享,方便数据管理。此外,还讲解了匿名挂载、具名挂载的区别和使用,并提到了数据卷容器的概念,用于实现容器间的文件共享。
摘要由CSDN通过智能技术生成

什么是数据卷

数据卷(Data Volumes)是宿主机中的一个目录或文件,数据卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。当容器目录和数据卷目录绑定后,对方的修改会立即同步,一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷。

  • 数据卷可以在容器之间共享和重用,本地与容器间传递数据更高
  • 对数据卷的修改会立马有效,在容器内部与本地目录均可对数据卷进行修改
  • 对数据卷的更新,不会影响镜像,对数据与应用进行了解耦操作
  • 卷会一直存在,直到没有容器使用

其实也不难理解和我们上一篇讲的端口映射很相似,因为容器与宿主机之间都是相互隔离的。而端口映射则是在两个互相隔离体之间构建通道,使其可以进行通讯共享。数据卷也是这种意思,但是数据卷不会因为容器的死亡而消失,只要还有一个容器或宿主机与其进行绑定,那么数据卷的内容就不会丢失。

数据卷

一. 直接命令挂载在宿主机目录
(1). 测试nginx

docker run -v 主机目录:容器内目录
docker run -d -v 主机目录地址:/usr/share/nginx/html -p 8080:80 --name nginx-music-volume nginx

当我们的两个目录进行挂载之后,就相当于共用一个目录,不管哪边发送改变目录的内容都会发生改变,这样的话我们只需在宿主机这边的目录进行操作,那么容器内的该目录也会发生相应的变化。就像我上篇文章所进行的cp操作就可以省去,并且当我需要更新版本时也只需在宿主机这边进行操作即可。下面我以nginx进行测试,挂载上自己自定义的网页。
在这里插入图片描述
这里我自己网页是放在/var/www/html里,接下来我需要挂载到nginx容器里的html文件夹下。
在这里插入图片描述
可以看到已经运行起来了访问也通了,让我们看看网页行不行
在这里插入图片描述
ok也是没问题了。这里我们还能通过docker inspect 容器id 查看详细信息。
在这里插入图片描述
这里可以看到确实是挂载成功了。可以看到当我们使用-v时很容易就将自己的本地目录网页放在了容器里,到这里其实就已经可以说明现在这两个目录实际上已经共用同一个目录了,并且就算我将这个容器删除,里面的内容也依旧是保留的。

以后修改或者发布新的版本就只需在服务器进行修改就行容器会自动同步,并且只有容器没删不管是停止状态还是运行状态都会自动同步。

(2). 测试mysql

我这用mysql:5.7版本演示,首先docker pull mysql:5.7 ,当然这里我先去官网看了一下。我这里还是建议大家直接先去官方进行查询学习。
在这里插入图片描述
但是为了挂载目录方便管理,这里我们需要对该命令进行修改。

docker run -d -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -p 3310:3306 --name mysql01 mysql:5.7 相信看完上一篇文章的你对于这个命令应该不难理解了。
-d 后台
-p 端口映射
-v 卷挂载
-e 环境配置
--name 命名

在这里插入图片描述
接下来我们去测试一下是否联通了。
在这里插入图片描述
在这里插入图片描述
可以看到已经成功了!我们在navicat加一个表看看服务器上是否会有。
在这里插入图片描述
在这里插入图片描述
这样我们就完成了MySQL容器的数据持久化。就算我们将容器进行删除,数据库中的数据也将获得保存

二. 匿名挂载和具名挂载

匿名挂载和具名挂载也很好理解,匿名就是没有给名字,具名就是给了具体的名字
docker run -d -v /usr/share/nginx/html -p 8080:80 --name nginx01 nginx (未指定名称,只写了容器内路径的为匿名挂载)
docker run -d -v Aasee:/usr/share/nginx/html -p 8080:80 --name nginx02 nginx(指定名称和容器内路径的为具名挂载)
docker run -d -v 主机路径:容器内路径 -p 8080:80 --name nginx-volume nginx(直接挂载在宿主机指定目录)

下面我来给大家逐一展示,这里我就用-P随机指定端口了因为我8080端口跑着

匿名

在这里插入图片描述

我们可以用docker volume ls 来查看数据卷列表,docker inspect [volumename] 来查看卷信息
更多使用参数可以 --help查看
在这里插入图片描述

docker inspect 容器id

具名

在这里插入图片描述
在这里插入图片描述

docker inspect 容器id查看
在这里插入图片描述

顺便补充一下

在这里插入图片描述
在这里插入图片描述
看到这这幅图就很好理解了。一般建议用具名挂载

设置只读:docker run -d -v 主机目录地址:/usr/share/nginx/html:ro -p 8080:80 --name nginx-music-volume nginx

三. 数据卷容器

正如容器与主机之间能够进行通讯,容器与容器之间也可以进行通信,而这个父容器就为数据卷容器,因为我们已经知道了容器与宿主机可以通过数据卷进行文件共享,所以自然容器与容器之间也是同样可以通过数据卷共享。

--volumes-from容器间数据共享命令。
docker run -it --name 子容器名 --volumes-from 父容器名 镜像名 /bin/bash

这里我以nginx进行演示,先启动一个带有数据卷的容器作为父容器,我这把它命令为docker01

docker run -d --name docker01 -P -v volume01:/home/volume01 nginx

在这里插入图片描述
在这里插入图片描述
好的第一个容器已经做好了,接下来做第二个

docker run -it --name docker02 --volumes-from docker01 nginx /bin/bash

在这里插入图片描述
我们可以去home目录验证一下是不是已经存在volume01文件夹
在这里插入图片描述
我们在这新建一个文件,touch helloDocker.py 然后去docker01看看是不是已经共享了。
在这里插入图片描述
可以看到成功了。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aasee.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值