Docker中的数据卷(Volume)和网络(NetWork)介绍

Author Image
admin Monday, June 8, 2020 阅读数: 28

[YoYoMooc]Docker中的数据卷(Volume)和网络(NetWork)介绍

在后面的几篇文章中,我会介绍Docker的两个功能,它们是为了处理更复杂的应用而设计的,特别是由多个容器组成的应用程序。

第一个功能是,它将应用程序与应用程序产生的数据文件分离出来,也可以说是将容器的运行环境和产生的数据库分离了到了其他存储中,这使得更换或升级容器更加方便。

第二个功能是网络,允许容器之间进行通信,这使得应用程序得以扩展,可以很容易的处理更大的工作负载。

准备工作

在我们开始正式的网络和卷的学习之前,保证我们的环境一致性是很重要的事情。 首先,切换我们的容器环境为Linux平台。 然后删除当前所有的容器,后面我们会重新创建它们。

docker rm -f $(docker ps -aq)

Docker数据卷的重要性

在Docker中,容器中的应用程序与两种文件相关联,一种是本身所需的运行文件。另外一种是用户操作生成的如日志、数据库。而在Docker的世界中,这两种文件的处理方式不同。

与应用程序相关联的文件有两种:运行应用程序所需的文件和应用程序运行时生成的数据文件,这些文件通常是由于用户操作而生成的。

在Docker世界中,这两种文件的处理方式不同。

我们当前的ASP.NET Core 示例应用程序创建的容器,里面包含了.NET Core运行时及编译后的ASP.NET Core文件和其他配置信息和静态文件。

如果没有这些文件,容器化的MVC应用程序将无法运行。

使用容器的主要好处之一是它们很容易创造和摧毁,而数据的存储文件不包含在容器中。

毕竟销毁容器时,其文件系统中的文件也会被删除,如果把数据文件一并删除了,那将是灾难级的,因为它们将永远丢失。

所以Docker提供了的功能来管理应用程序数据,在接下来的文章中,我将解释卷是如何工作的,以及如何使用卷来存放数据库这种常见类型的应用文件。

最后

为了让我们保存好之前用过的Dockerfile文件,我们在YoYoMooc.ExampleApp根目录中创建一个名为Dockerfile.volumes的文件。

验证Docker卷的存在

通过实践来验证卷的存在是最好的方式, 我们在YoYoMooc.ExampleApp根目录中创建一个名为Dockerfile.volumes的文件。 添加以下代码:


FROM alpine:3.11
WORKDIR /data
ENTRYPOINT (test -e message.txt && echo "文件已存在" \
    || (echo "创建文件中..." \
    && echo 你好, Docker 时间: $(date '+%X') > message.txt)) && cat message.txt

Docker文件中的alpine是一个最小可执行的Linux发行版版本。我们采用它作为基础镜像,来模拟一个小的虚拟系统。

当我们的运行镜像的时候,ENTRYPOINT命令会创建一个名为/data/message.txt的文件,该文件内容包括,里面包含一个消息和时间戳。

这个文件我们可以称为数据文件,数据文件在容器启动前不会创建,它也不会生成的镜像的一部分。

YoYoMooc.ExampleApp根目录下,运行如下命令:


docker build . -t yoyomooc/vtest -f Dockerfile.volumes
docker run --name vtest yoyomooc/vtest

执行后,可以会看到如下结果,当然时间戳的值是不一样的:


创建文件中...
你好, Docker 时间: 05:38:35

以上信息是容器创建后,继续创建message.txt文件,然后读取/data/message.txt的中的数据,然后显示出来,可以看到它的时间戳的值:05:38:35

因为我没有为这个数据文件指定卷,所以它成为了容器内系统文件的一部分。而容器的文件系统是持久化的,我们可以通过命令来进行验证:

docker start -a vtest

将会输入以下消息:

文件已存在
你好, Docker 时间: 05:38:35

可以看到输出的消息提示为/data/message.txt已经存在,并且时间戳都是相同的。

如果我们把容器删除后,这个数据文件便会出现问题,我们会在后面的章节中详细解释它。Docker 容器经常被创建和销毁,大多数时候是为了自动响应请求的负载均衡,当然也有可能是为了部署一个新版本的应用程序。

现在删除容器,命令如下:

docker rm -f vtest

 

Docker 会删除容器,同时 /data/message.txt 文件也会被删除。 现在验证下,请输入以下命令:

docker run --name vtest apress/vtest

得到的输出内容为:

创建文件中...
你好, Docker 时间: 05:58:00

因为我们把数据文件保存在了容器中,所以容器会删除后,数据文件也就丢失了。而在实际生产环境中,删除数据文件会造成严重的后果,所以需要避免。

那么如何避免呢?我们在下节课中给大家讲解。。