amptail—f/dev/null"
如果您没有注意到,每次我们启动容器时,我们的待办事项列表都会被清除干净为什么是这样让我们深入了解容器是如何工作的
容器的文件系统
当一个容器运行时,它使用图像中的各个层作为其文件系统每个容器还有自己的暂存空间来创建/更新/删除文件任何更改都不会在另一个容器中看到,即使它们使用相同的图像
为了看到这一点,我们将启动两个容器并在每个容器中创建一个文件您将看到在一个容器中创建的文件在另一个容器中不可用
1.启动一个ubuntu容器,该容器将创建一个以/data.txt1 到 10000 之间的随机数命名的文件。
docker run —d ubuntu bash —c "shuf —i 1—10000 —n 1 —o /data.txt amp,amp, tail —f /dev/null"
如果您对该命令感到好奇,我们将启动一个 bash shell 并调用两个命令第一部分选择一个随机数并将其写入/data.txt. 第二个命令只是监视一个文件以保持容器运行
2.验证我们可以通过execing 到容器中看到输出为此,请打开仪表板并单击运行ubuntu映像的容器的第一个操作
您将看到一个终端在 ubuntu 容器中运行 shell运行以下命令以查看/data.txt文件的内容之后再次关闭此终端
$ cat /data.txt
如果您更喜欢命令行,您可以使用该docker exec命令来执行相同的操作您需要获取容器的ID并使用以下命令获取内容
$ docker exec lt,container—idgt, cat /data.txt
你应该看到一个随机数!
3.现在,让我们启动另一个ubuntu容器,我们会看到我们没有相同的文件。
$ docker run —it ubuntu ls /
看!那里没有data.txt文件!那是因为它仅被写入第一个容器的暂存空间。。
4.继续并使用docker rm —f lt,container—idgt,命令删除第一个容器。
通过前面的实验,我们看到每个容器每次启动都是从镜像定义开始的虽然容器可以创建,更新和删除文件,但当容器被移除并且所有更改都与该容器隔离时,这些更改会丢失有了卷,我们可以改变这一切
卷提供了将容器的特定文件系统路径连接回主机的能力如果容器中的目录已挂载,则该目录中的更改也会在主机上看到如果我们在容器重启时挂载相同的目录,我们会看到相同的文件
卷有两种主要类型我们最终将同时使用两者,但我们将从命名卷开始
持久化数据
默认情况下,待办事项应用程序将其数据存储在容器文件系统中的SQLite 数据库中/etc/todos/todo.db如果你不熟悉 SQLite,不用担心!它只是一个关系数据库,其中所有数据都存储在一个文件中虽然这对于大型应用程序来说不是最好的,但它适用于小型演示稍后我们将讨论将其切换到不同的数据库引擎
由于数据库是单个文件,如果我们可以将该文件保存在主机上并使其可用于下一个容器,它应该能够从最后一个停止的地方继续通过创建一个卷并将其附加到存储数据的目录,我们可以持久化数据当我们的容器写入todo.db文件时,它将被持久化到卷中的主机
如前所述,我们将使用命名卷将命名卷视为简单的数据桶Docker 维护磁盘上的物理位置,您只需要记住卷的名称每次使用卷时,Docker 都会确保提供正确的数据
1.使用docker volume create命令创建卷。对于个人用户,Docker桌面则仍旧可以免费使用,只是Docker把它的订阅名称从“Free”换成了“Personal”。
$ docker volume create todo—db
2.在仪表板中再次停止并删除待办事项应用程序容器docker rm —f lt,idgt,,因为它仍在运行而不使用持久卷。
3.启动 todo 应用程序容器,但添加—v标志以指定卷安装我们将使用命名卷并将其挂载到/etc/todos,这将捕获在该路径创建的所有文件
$ docker run —dp 3000:3000 —v todo—db:/etc/todos getting—started
4.容器启动后,打开应用程序并将一些项目添加到您的待办事项列表中。
5.停止并删除 todo 应用程序的容器使用仪表板或docker ps获取 ID,然后docker rm —f lt,idgt,将其删除
6.使用上面的相同命令启动一个新容器。
7.打开应用程序。您应该会看到您的项目仍在您的列表中!
8.完成检查列表后,继续删除容器。
。郑重声明:此文内容为本网站转载企业宣传资讯,目的在于传播更多信息,与本站立场无关。仅供读者参考,并请自行核实相关内容。