手摸手教学 - Docker(四) 超级爽!持久化数据库-named volumes!

若有疑问参考前面几篇Docker文章,循序渐进
不懂算我输,话不多说,实战为主!

作者变优秀的小白

Github关注YX-XiaoBai

爱好Americano More Ice !

QQ学习交流群(new): 811792998

目录

持久化Docker的数据库

你可能没有注意到,每一次我们连接容器我们之前的数据及操作都会被删除。为什么会这样呢?让我们更加深入容器(Container)是怎么运作的!

容器的文件系统

当一个容器运行时,为它的文件系统filesystem从镜像中使用多变的图层。针对每一个容器都会获得完全属于自己的scratch space(暂存空间)以便于创建、更新、移除文件。各个容器之间是互不影响的,即使它们使用同一个镜像

让练习加深我们的理解

我们准备启动两个容器并为每个容器创建一个文件,你会发现一个容器创建的文件另一个容器的看不到、获取不到的

  1. 启动一个ubuntu容器会创建一个名称为/data.txt(文件带一个1-10000的随机数)

docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"

在这里插入图片描述

  1. docker Dashboard中运行它
    在这里插入图片描述

  2. 随后我们会看到一个终端,我们输入cat /data.txt即可获取我们当时放入的随机数
    在这里插入图片描述

  3. 现在我们启动另一个ubuntu容器,可以看到是没有一样的文件的

docker run -it ubuntu ls /
在这里插入图片描述

  1. 最后我们移除第一个容器(docker rm -f <container-id>)

容器Volumes

通过上面的实验我们发现当容器被移除后所有改动都会清除,所有操作都是与容器相关联的。通过使用volumes我们可以改变这个现状

Volumnes提供了连接容器的特定文件系统路径和主机能力。如果一个目录装入了容器container中,目录的改变可以在本地主机看到。如果在容器重启时我们装入一样的目录,我们会看到相同的文件

Volumes总共有两种主要类型,我们会同时使用两者,我们会从named volunmes开始

持久化我们的数据

我们应用的数据是存储在SQLiteDB中的。由于数据库是单个文件,因此如果我们可以将该文件持久保存在主机上并使其可用于下一个容器,则它应该能够从上一个停止的地方开始。

通过创建一个卷并将其附加(通常称为“安装”)到存储数据的目录中,我们可以保留数据。当我们的容器写入todo.db文件时,它将被持久保存到卷中的主机上

如前所述,我们将使用named volume,可以认为它是简单的数据桶。Docker维护磁盘上的物理位置,您只需要记住volume的名称即可。每次使用该卷时,Docker将确保提供正确的数据

  1. 通过docker volume create创建一个volume

docker volume create todo-db

在这里插入图片描述

  1. 停止运行的容器,因为它还是以没有使用持久化volumen在运行

docker rm -f <container-id>

在这里插入图片描述
可以通过docker ps查询是否删除成功

  1. 启动todo app容器,注意使用-v参数装入一个特定的volume。我们将使用这个named volumne并且装它进/etc/todos,它将捕获所有创建文件的路径

docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started

$ docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
2f097bda1285fee852ce6a2c38f2bb55c4bf7a689f3934139f68dc7b77417f0a
  1. 一旦容器启动,打开我们app和添加一些todo(即添加数据)

这里需要参考前面两篇文章

在这里插入图片描述

  1. 接着移除app的容器。用Dashboard或者docker rm -f <id>都可以

  2. 使用之前的命令启动一个新的容器

docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
在这里插入图片描述

  1. 再次打开app,你发现你的数据依然存在!

  2. 搞定完我们继续删除掉我们的容器~

深入了解我们的Volume

你可能会有大大的疑问当我使用volume时Docker将我的数据存储在了哪里?。下面就来介绍docker自带的inspect命令

$ docker volume inspect todo-db
[
    {
        "CreatedAt": "2021-01-29T03:06:28Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
        "Name": "todo-db",
        "Options": {},
        "Scope": "local"
    }
]

Mountpoint就是咋们数据存储的地方。

Tips: Docker命令通常在我们机器的小VM内运行。如果你你先看mountpoint的实际内容,你得先进入VM

总结

现在我们可以使用named volume去存储我们的数据,以便于重启容器时数据不会丢失。

但是我们还可以有更好的方法,就是bind mounts

结束语:不懂算我输,当然~如果遇到什么疑问或者建议的,可直接留言评论!作者看到会马上一一回复!

如果觉得小白此文章不错或对你有所帮助,期待你的一键三连💫!❤️ni!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值