ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Docker 入门(5)保留数据库

2021-07-24 13:04:42  阅读:174  来源: 互联网

标签:容器 入门 data 数据库 我们 Docker todo docker


如果您没有注意到,每次启动容器时,我们的待办事项列表都会被清除。为什么是这样?让我们深入了解容器是如何工作的。

容器的文件系统

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

在实践中看到这一点

为了看到这一点,我们将启动两个容器并在每个容器中创建一个文件。您将看到在一个容器中创建的文件在另一个容器中不可用。

  1. 启动一个ubuntu容器,该容器将创建一个以/data.txt1 到 10000 之间的随机数命名的文件。

    <span style="color:#0c5176 !important"><span style="background-color:#f5f8fa !important"><code> docker run <span style="color:#8b008b">-d</span> ubuntu bash <span style="color:#8b008b">-c</span> <span style="color:#cd5555">"shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"</span>
    </code></span></span>

    如果您对命令感到好奇,我们将启动一个 bash shell 并调用两个命令(为什么我们有&&)。第一部分选择一个随机数并将其写入/data.txt. 第二个命令只是监视文件以保持容器运行。

  2. 验证我们可以通过execing 进入容器来查看输出。为此,请打开仪表板并单击运行ubuntu映像的容器的第一个操作。

    仪表板打开 CLI 进入 ubuntu 容器

    您将看到一个在 ubuntu 容器中运行 shell 的终端。运行以下命令查看/data.txt文件内容。之后再次关闭此终端。

    <span style="color:#0c5176 !important"><span style="background-color:#f5f8fa !important"><code> <span style="color:#658b00">cat</span> /data.txt
    </code></span></span>

    如果您更喜欢命令行,则可以使用该docker exec命令执行相同操作。您需要获取容器的 ID(用于docker ps获取它)并使用以下命令获取内容。

    <span style="color:#0c5176 !important"><span style="background-color:#f5f8fa !important"><code> docker <span style="color:#658b00">exec</span> <container-id> <span style="color:#658b00">cat</span> /data.txt
    </code></span></span>

    你应该看到一个随机数!

  3. 现在,让我们启动另一个ubuntu容器(相同的图像),我们会看到我们没有相同的文件。

    <span style="color:#0c5176 !important"><span style="background-color:#f5f8fa !important"><code> docker run <span style="color:#8b008b">-it</span> ubuntu <span style="color:#658b00">ls</span> /
    </code></span></span>

    看!那里没有data.txt文件!那是因为它仅被写入第一个容器的暂存空间。

  4. 继续使用docker rm -f <container-id>命令删除第一个容器。

容器体积

在前面的实验中,我们看到每个容器每次启动时都是从镜像定义开始的。虽然容器可以创建、更新和删除文件,但是当容器被移除并且所有更改都与该容器隔离时,这些更改将丢失。有了卷,我们可以改变这一切。

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

有两种主要类型的卷。我们最终将同时使用两者,但我们将从命名卷开始。

todo数据

默认情况下,todo 应用程序将其数据存储在SQLite 数据库中 /etc/todos/todo.db。如果您不熟悉 SQLite,不用担心!它只是一个关系数据库,其中所有数据都存储在一个文件中。虽然这对于大型应用程序来说不是最好的,但它适用于小型演示。稍后我们将讨论将其切换到不同的数据库引擎。

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

如前所述,我们将使用命名卷。将命名卷视为简单的数据桶。Docker 维护磁盘上的物理位置,您只需要记住卷的名称。每次使用该卷时,Docker 都会确保提供正确的数据。

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

    <span style="color:#0c5176 !important"><span style="background-color:#f5f8fa !important"><code> docker volume create todo-db
    </code></span></span>
  2. 在仪表板中(或使用docker rm -f <id>)再次停止并删除待办事项应用程序容器,因为它仍在运行而不使用持久卷。

  3. 启动 todo 应用程序容器,但添加-v标志以指定卷安装。我们将使用命名卷并将其挂载到/etc/todos,这将捕获在路径上创建的所有文件。

    <span style="color:#0c5176 !important"><span style="background-color:#f5f8fa !important"><code> docker run <span style="color:#8b008b">-dp</span> 3000:3000 <span style="color:#8b008b">-v</span> todo-db:/etc/todos getting-started
    </code></span></span>
  4. 容器启动后,打开应用程序并将一些项目添加到您的待办事项列表中。

    添加到待办事项列表的项目

  5. 停止并移除 todo 应用程序的容器。使用仪表板 或docker ps获取 ID,然后docker rm -f <id>将其删除。

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

  7. 打开应用程序。您应该会看到您的项目仍在您的列表中!

  8. 完成检查列表后,继续并移除容器。

万岁!您现在已经学会了如何持久化数据!

笔记

虽然命名卷和绑定挂载(我们将在稍后讨论)是默认 Docker 引擎安装支持的两种主要卷类型,但有许多卷驱动程序插件可用于支持 NFS、SFTP、NetApp 等!一旦您开始在具有 Swarm、Kubernetes 等的集群环境中的多个主机上运行容器,这将尤其重要。

潜入音量

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

<span style="color:#33444d"><span style="background-color:#ffffff"><span style="color:#0c5176 !important"><span style="background-color:#f5f8fa !important"><code>docker volume inspect todo-db
[
    {
        <span style="color:#cd5555">"CreatedAt"</span>: <span style="color:#cd5555">"2019-09-26T02:18:36Z"</span>,
        <span style="color:#cd5555">"Driver"</span>: <span style="color:#cd5555">"local"</span>,
        <span style="color:#cd5555">"Labels"</span>: {},
        <span style="color:#cd5555">"Mountpoint"</span>: <span style="color:#cd5555">"/var/lib/docker/volumes/todo-db/_data"</span>,
        <span style="color:#cd5555">"Name"</span>: <span style="color:#cd5555">"todo-db"</span>,
        <span style="color:#cd5555">"Options"</span>: {},
        <span style="color:#cd5555">"Scope"</span>: <span style="color:#cd5555">"local"</span>
    }
]
</code></span></span></span></span>

Mountpoint是数据存储在磁盘上的实际位置。请注意,在大多数机器上,您需要具有 root 访问权限才能从主机访问此目录。但是,原来是这样!

直接在 Docker 桌面上访问卷数据

在 Docker Desktop 中运行时,Docker 命令实际上是在您机器上的一个小型 VM 中运行的。如果您想查看 Mountpoint 目录的实际内容,您需要先进入 VM。

回顾

在这一点上,我们有一个可以在重启后继续运行的正常应用程序!我们可以向我们的投资者展示它,希望他们能理解我们的愿景!

但是,我们之前看到,为每个更改重建映像需要相当长的时间。必须有更好的方法来进行更改,对吗?使用绑定安装(我们之前暗示过),有更好的方法!现在让我们来看看吧!

 

标签:容器,入门,data,数据库,我们,Docker,todo,docker
来源: https://blog.csdn.net/daqiang012/article/details/119056566

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有