前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[YoYoMooc]Docker 中的数据卷(Volume)和网络(NetWork)介绍

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

作者头像
角落的白板报
发布2020-06-18 16:34:30
8480
发布2020-06-18 16:34:30
举报
文章被收录于专栏:角落的白板报角落的白板报
  1. 发布 Docker 镜像到 Azure 容器仓库[1]|Youtube(需科学上网)[2]|图文[3]
  2. 创建一个 Windows 容器[4]|Youtube(需科学上网)[5]|图文[6]

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

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

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

准备工作

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

代码语言:javascript
复制
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的文件。添加以下代码:

代码语言:javascript
复制

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根目录下,运行如下命令:

代码语言:javascript
复制

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

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

代码语言:javascript
复制

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

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

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

代码语言:javascript
复制
docker start -a vtest

将会输入以下消息:

代码语言:javascript
复制
文件已存在
你好, Docker 时间: 05:38:35

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

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

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

代码语言:javascript
复制
docker rm -f vtest


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

代码语言:javascript
复制
docker run --name vtest apress/vtest

得到的输出内容为:

代码语言:javascript
复制
创建文件中...
你好, Docker 时间: 05:58:00

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

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

参考资料

[1]

发布Docker镜像到Azure容器仓库: https://www.bilibili.com/video/BV1zt4y117tg/

[2]

Youtube(需科学上网): https://youtu.be/y_LUq2SKJMY

[3]

图文: 12-Publish-the-image-to--Azure-Docker.md

[4]

创建一个Windows容器: https://www.bilibili.com/video/BV1yp4y1Q7iM/

[5]

Youtube(需科学上网): https://youtu.be/eIpfEnzQWmM

[6]

图文: 13.create-windows-Containers.md

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 角落的白板报 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备工作
  • Docker 数据卷的重要性
  • 最后
  • 验证 Docker 卷的存在
    • 参考资料
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档