保留数据库
如果您没有注意到,每次启动容器时,您的待办事项列表都是空的。为什么是这样?在这一部分中,您将深入了解容器的工作原理。
当容器运行时,它会使用映像中的各个层作为其文件系统。每个容器还拥有自己的“临时空间”来创建/更新/删除文件。即使它们使用相同的图像,任何更改都不会在另一个容器中看到。
要查看其实际效果,您将启动两个容器。在一个容器中,您将创建一个文件。在另一个容器中,您将验证该文件是否存在。您将看到的是,在一个容器中创建的文件在另一个容器中不可用。
-
启动 Alpine 容器并访问其 shell。
$ docker run -ti --name=mytest alpine -
在容器中,创建一个
greeting.txt包含 inside 的文件hello。/ # echo "hello" > greeting.txt -
退出容器。
/ # exit -
运行一个新的 Alpine 容器并使用
cat命令验证该文件不存在。$ docker run alpine cat greeting.txt您应该看到类似于以下内容的输出,表明新容器中不存在该文件。
cat: can't open 'greeting.txt': No such file or directory -
继续使用
docker ps --all获取 ID 来删除容器,然后docker rm -f <container-id>删除容器。
通过之前的实验,您看到每个容器每次启动时都从图像定义开始。虽然容器可以创建、更新和删除文件,但当您删除容器时,这些更改将会丢失,并且 Docker 会隔离对该容器的所有更改。有了卷,你就可以改变这一切。
提供了将容器的特定文件系统路径连接回主机的能力。如果在容器中挂载目录,则该目录中的更改也会在主机上看到。如果您在容器重新启动时挂载相同的目录,您将看到相同的文件。
卷有两种主要类型。您最终将使用两者,但您将从卷安装开始。
默认情况下,todo 应用程序将其数据存储在 /etc/todos/todo.db容器文件系统的 SQLite 数据库中。如果您不熟悉 SQLite,不用担心!它只是一个将所有数据存储在单个文件中的关系数据库。虽然这对于大型应用程序来说不是最好的,但它适用于小型演示。稍后您将了解如何将其切换到不同的数据库引擎。
由于数据库是单个文件,如果您可以将该文件保留在主机上并将其可供下一个容器使用,那么它应该能够从上一个容器停止的地方继续。通过创建卷并将其附加(通常称为“安装”)到存储数据的目录,您可以保留数据。当容器写入文件时todo.db,它将数据保存到卷中的主机。
如前所述,您将使用卷安装。将卷挂载视为不透明的数据桶。 Docker 完全管理卷,包括磁盘上的存储位置。您只需要记住卷的名称即可。
您可以使用 CLI 或 Docker Desktop 的图形界面创建卷并启动容器。
命令行界面 Docker 桌面
-
使用命令创建卷
docker volume create。$ docker volume create todo-db -
使用 再次停止并删除待办事项应用程序容器
docker rm -f <id>,因为它仍在运行而不使用持久卷。 -
启动 todo 应用程序容器,但添加
--mount指定卷安装的选项。为卷命名,并将其安装到/etc/todos容器中,该容器捕获在该路径中创建的所有文件。$ docker run -dp 127.0.0.1:3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started笔记
如果您使用 Git Bash,则必须对此命令使用不同的语法。
$ docker run -dp 127.0.0.1:3000:3000 --mount type=volume,src=todo-db,target=//etc/todos getting-started有关 Git Bash 语法差异的更多详细信息,请参阅 。
创建卷:
- 在 Docker Desktop 中选择卷。
- 在卷中,选择创建。
- 指定
todo-db为卷名称,然后选择“创建”。
要停止并删除应用程序容器:
- 在 Docker Desktop 中选择容器。
- 在容器的操作列中选择删除。
要启动挂载卷的 todo 应用程序容器:
-
选择 Docker Desktop 顶部的搜索框。
-
在搜索窗口中,选择图像选项卡。
-
在搜索框中,指定容器名称
getting-started。提示
使用搜索过滤器过滤图像并仅显示本地图像。
-
选择您的图像,然后选择“运行”。
-
选择可选设置。
-
在主机端口中,指定端口,例如
3000。 -
在主机路径中,指定卷的名称
todo-db。 -
在容器路径中,指定
/etc/todos。 -
选择运行。
-
容器启动后,打开应用程序并将一些项目添加到您的待办事项列表中。
-
停止并删除待办事项应用程序的容器。使用 Docker Desktop 或
docker ps获取 ID,然后docker rm -f <id>将其删除。 -
使用前面的步骤启动一个新容器。
-
打开应用程序。您应该会看到您的项目仍在列表中。
-
检查完清单后,请继续移除容器。
您现在已经了解了如何保存数据。
很多人经常问“当我使用卷时,Docker 将我的数据存储在哪里?”如果你想知道,可以使用docker volume inspect命令。
$ docker volume inspect todo-db [ { "CreatedAt": "2019-09-26T02:18:36Z", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/todo-db/_data", "Name": "todo-db", "Options": {}, "Scope": "local" } ]
这Mountpoint是磁盘上数据的实际位置。请注意,在大多数计算机上,您需要具有 root 访问权限才能从主机访问此目录。
在本节中,您学习了如何保留容器数据。
相关信息:
接下来,您将了解如何使用绑定安装更有效地开发应用程序。
