详解Docker——你需要知道的Docker进阶知识三

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解Docker——你需要知道的Docker进阶知识三相关的知识,希望对你有一定的参考价值。

参考技术A

我们可以将数据保存在容器中,但是这样存在一些缺点:

针对上述的缺点,有些数据,例如数据库文件,我们不应该将其保存在镜像或者容器的可写层中。Docker 提供三种不同的方式将数据从 Docker 主机挂载到容器中,分别为卷( volumes ),绑定挂载( bind mounts ),临时文件系统( tmpfs )。很多时候, volumes 总是正确的选择。

无论使用上述的哪一种方式,数据在容器内看上去都是一样的。它被认为是容器文件系统的目录或文件。

对于三种不同的存储数据的方式来说,卷是唯一完全由 Docker 管理的。它更容易备份或迁移,并且我们可以使用 DockerCLI 命令来管理卷。

列出本地可用的卷列表:

这种由系统随机生成名称的卷称为 匿名卷 ,匿名卷名称不具备可读性,使用起来不太方便,所以创建卷时一般会指定其 name 。例如我们创建一个名为 volume1 的卷。

创建好卷之后,我们可以用卷来启动一个容器,这里首先需要学习 docker container run 命令的两个参数:

对于前面创建的卷 volume1 ,可使用如下命令来在容器中使用:

使用 --mount 的命令如下:

上述操作,我们运行了两个容器,并分别挂载了一个卷。对于这两个容器来说,由于挂载的是同一个卷,所以它们将共享该数据卷。多个容器共享数据卷时,需要注意并发读写问题。可以分别连接到两个容器中,操作数据来验证数据是同步的。

绑定挂载( bind-mounts )通过将主机上的目录挂载到容器中,使得容器可以操作和修改主机上的文件。

例如,我们将 /home/hellodocker 目录挂载到容器中的 /home/hellodocker 目录下,使用的命令如下:

而如果使用 --mount ,相应的语句如下:

上述两个操作针对的是目录,而对于挂载文件来说,可能会出现一些特殊情况,涉及到绑定挂载和使用卷的区别。下面我们重现这一操作:

首先在当前目录,即 /home/hellodocker 目录下,创建一个 test.txt 文件。并向其中写入文本内容 "test1":

接着创建一个容器 hellodocker6 ,将 test.txt 文件挂载到容器中的 /test.txt 路径,并查看容器中 /test.txt 文件的内容:

这时新打开一个终端,通过 echo 命令向 /home/hellodocker/test.txt 文件追加内容 "test2",并在容器中查看 /test.txt 文件的内容:

这时无论是在容器中还是主机上都能查看到该文件的最新内容。接下来在主机上查看 test.txt 的 inode 号,并使用 vim 编辑该文件,添加 "test3",并查看该文件的内容:

在主机上使用 vim 编辑后,通过 vim 做出的修改并不能在容器中查看到

这是因为 vim 编辑文件的时候,会将文件内容暂存到一个临时文件中,退出保存后会删除原来的文件,并将临时文件重命名为原文件。但是我们标识文件是通过 inode ,因此 Docker 绑定的依然是旧的主机文件,所以容器中看到的依然是旧的内容。

对于数据卷来说,由 docker 完全管理,而绑定挂载需要我们自己去维护。我们需要自己手动去处理这些问题,这些问题并不仅仅是上面演示的这些,还有用户权限, SELINUX 等。

tmpfs 只存储在主机的内存中。当容器停止时,相应的数据就会被移除。

以上是关于详解Docker——你需要知道的Docker进阶知识三的主要内容,如果未能解决你的问题,请参考以下文章

详解Docker——你需要知道的Docker进阶知识三

Docker 持续进阶

Linux进阶 | 万字详解Docker镜像的制作,手把手学会!

Docker 进阶之 Dockerfile 详解

Docker 进阶之镜像分层详解

Docker 进阶之镜像分层详解