Docker-持久化数据库(数据卷)

每次启动容器时,前面添加的数据都会消失

启动getting-started容器镜像,浏览器访问,然后向其中添加几个item。我们刷新一下页面,或是换一个浏览器访问,上面添加的item都还在

image-20220617113200636

但如果将容器停掉,然后重新启动一个容器,再用浏览器访问,发现里面新增的item都不见了

容器的文件系统

当一个容器运行时,它使用镜像中的各个层作为其文件系统。每个容器还有自己的“暂存空间”来创建/更新/删除文件。任何更改都不会在另一个容器中看到,即使它们使用相同的镜像。

数据卷

每个容器每次启动都是从镜像定义开始的。虽然容器可以创建、更新和删除文件,但当容器被移除并且所有数据更改都与该容器隔离时,这些数据会丢失。

数据卷提供了将容器的特定文件系统路径连接回主机的能力。如果容器中的目录已挂载,则该目录中的更改也会在主机上看到。如果我们在容器重启时挂载相同的目录,我们会看到相同的文件。

数据卷有两种类型:命名卷named volumes、绑定挂载bind mounts

数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷 可以在容器之间共享和重用
  • 数据卷 的修改会立即生效
  • 数据卷 的修改,不会影响镜像
  • 数据卷 默认会一直存在,即使容器被删除

持久化数据

代办事项项目的数据是存储在容器文件系统中的SQLite 数据库中的,目录:/etc/todos/todo.db

由于数据库是单个文件,如果我们可以将该文件持久保存在主机上,并使其可用于下一个容器,它应该能够从最后一个停止的地方继续。通过创建一个数据卷并将其附加(通常称为“挂载”)到存储数据的目录,我们可以持久化数据。当我们的容器写入todo.db文件时,它将被持久化到数据卷中的主机。

1、创建数据卷。

$ docker volume create todo-db

2、再次停止并删除待办事项容器,因为它仍在运行而且没有使用数据卷

docker ps
docker rm -f <id>

3、启动待办事项项目容器,用-v指定数据卷挂载。我们将使用这个命名卷并将其挂载到/etc/todos,这将捕获在该路径创建的所有文件。

也可以在一次docker run命令中多次使用-v标识挂载多个数据卷

如果没有运行docker volume create命令,而是直接使用下面的命令,docker会为我们自动创建一个

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

4、容器启动后,打开应用程序并将一些item添加到待办事项列表中。

image-20220617115638971

5、停止并删除待办事项项目的容器。

docker ps
docker rm -f <id>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YGTtfRFI-1659341392848)(https://raw.githubusercontent.com/yuyun-21/uplod-images/hyh/images/Flowable/image-20220617115819573.png)]

6、使用上面的相同命令启动一个新容器。

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

7、打开浏览器访问,应该会在列表中看到前面添加的事项
image-20220617115819573

查看所有的 数据卷

docker volume ls

查看指定数据卷

docker volume inspect todo-db

image-20220617143547855

  • Mountpoint是存储数据的磁盘上的实际位置
  • 大多数设备需要具有 root 访问权限才能从主机访问此目录

猜你喜欢

转载自blog.csdn.net/hyh17808770899/article/details/126102452