Skip to content

持久化数据库

原文:https://docs.docker.com/get-started/05_persisting_data/

如果你没有注意到的话,每次启动容器时,你的待办事项列表都是空的。这是为什么呢?在这部分中,你将深入了解容器是如何工作的。

容器的文件系统

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

实践中看到这一点

为了看到这一点,你将启动两个容器。在一个容器中,你将创建一个文件。在另一个容器中,你将验证文件是否存在。 你将看到的是,一个容器中创建的文件在另一个容器中不可用。

  1. 启动一个 Alpine 容器并访问其 shell。

    console
    docker run -ti --name=mytest alpine
  2. 在容器中,创建一个包含 hellogreeting.txt 文件。

    console
    / # echo "hello" > greeting.txt
  3. 退出容器。

    console
    / # exit
  4. 运行一个新的 Alpine 容器并使用 cat 命令验证该文件是否存在。

    console
    docker run alpine cat greeting.txt

    你应该会看到类似于以下的输出,表明新容器中不存在该文件。

    console
    cat: can't open 'greeting.txt': No such file or directory
  5. 使用 docker ps --all 获取容器 ID,然后使用 docker rm -f <container-id> 删除容器。

容器卷

通过之前的实验,你看到每个容器都是从镜像定义每次启动。虽然容器可以创建、更新和删除文件,但当你删除容器时,这些更改会丢失,Docker 会隔离该容器的所有更改。通过卷,你可以改变这一切。

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

有两种主要类型的卷。你最终会使用两者,但你将从卷挂载开始。

持久化待办数据

默认情况下,待办应用在容器的文件系统中的 /etc/todos/todo.db 位置存储其数据。如果你不熟悉 SQLite,不用担心!它只是一个关系数据库,将所有数据存储在一个文件中。虽然这不适合大规模应用,但对于小型演示来说是可行的。你将学习如何将此切换到不同的数据库引擎。

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

正如提到的,你将使用卷挂载。将卷挂载视为一个不透明的数据存储

桶。Docker 完全管理卷,包括磁盘上的存储位置。你只需要记住卷的名称。

创建卷并启动容器

你可以使用 CLI 或 Docker Desktop 的图形界面创建卷并启动容器。

  1. 使用 docker volume create 命令创建一个卷。

    console
    docker volume create todo-db
  2. 使用 docker rm -f <id> 再次停止并删除待办应用容器,因为它仍然在运行而没有使用持久卷。

  3. 启动待办应用容器,但添加 --mount 选项来指定卷挂载。给卷起一个名字,并将其挂载到容器中的 /etc/todos,这将捕获该路径下创建的所有文件。

    console
    docker run -dp 127.0.0.1:3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started

    注意

    如果你在使用 Git Bash,你必须使用不同的语法。

    console
    docker run -dp 127.0.0.1:3000:3000 --mount type=volume,src=todo-db,target=//etc/todos getting-started

    有关 Git Bash 语法差异的更多详情,请参见 使用 Git Bash 工作

验证数据是否持久化

  1. 容器启动后,打开应用并在你的待办列表中添加一些项目。

    添加到待办列表的项目

  2. 停止并删除待办应用的容器。使用 Docker Desktop 或 docker ps 获取 ID,然后使用 docker rm -f <id> 删除它。

  3. 使用之前的步骤启动一个新容器。

  4. 打开应用。你应该看到你的列表中仍有你的项目。

  5. 当你完成查看列表后,继续删除容器。

你现在已经学会了如何持久化数据。

深入了解卷

很多人经常问:“当我使用卷时,Docker 在哪里存储我的数据?”如果你想知道,你可以使用 docker volume inspect 命令。

console
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 是数据在磁盘上的实际位置。注意,在大多数机器上,你需要拥有根访问权限才能从主机访问此目录。

总结

在这一节中,你学习了如何持久化容器数据。

相关信息:

下一步

接下来,你将学习如何使用绑定挂载更有效地开发你的应用程序。