Docker容器中应用程序的log输出管理

栏目: 编程工具 · 发布时间: 5年前

内容简介:在之前的文章中我们介绍过Docker相关的基础知识,同时在文章(默认情况下,容器内创建的所有文件都存储在可写容器层上,这意味着:当该容器不再存在时,数据不会持久,并且如果另一个进程需要数据,则很难将数据从容器中取出。容器的可写层与运行容器的主机紧密耦合,我们不能轻易地将数据移动到其他地方。

在之前的文章中我们介绍过 Docker 相关的基础知识,同时在文章( 使用Log4Net根据log level的不同将log输出到不同的文件中 )中介绍了log4net的使用,本篇文章我们将结合两者来介绍如何将docker容器中应用程序的log输出到docker主机中。说到docker中应用程序log的输出,我们需要先来了解一下Docker的数据管理机制。

Docker数据管理

默认情况下,容器内创建的所有文件都存储在可写容器层上,这意味着:

当该容器不再存在时,数据不会持久,并且如果另一个进程需要数据,则很难将数据从容器中取出。容器的可写层与运行容器的主机紧密耦合,我们不能轻易地将数据移动到其他地方。

幸运的是Docker为容器提供了两个选择来在主机中存储文件,这样即使在容器停止或者删除之后,这些文件也会被持久化。这两种方式就是:Volume和Bind Mounts, 当然如果你是在 linux 上运行Docker,还可以使用tmpfs mount。

volume(数据卷): volume存储在由Docker管理的主机文件系统的一部分中。非docker

进程不应该修改文件系统的这一部分。Volume是在Docker中持久化数据的最佳方案。

bind mounts(挂载主机目录): bind mounts可以存储在主机系统的任何位置。它们甚至可能是非常重要的系统文件或目录。Docker主机或Docker容器上的非Docker进程可以随时修改它们。

tmpfs mount:  只存储在主机系统的内存中,并且从不写入主机系统的文件系统中。

下图展示了三种数据持久化中container与Docker主机的关系:

Docker容器中应用程序的log输出管理

对于volume的简单理解就是,在docker主机中创建一个volume,该volume存储在Docker管理的主机文件系统中,如上图中所示的Docker area,通过将该volume与container中的某个文件或目录进行挂载(我个人更喜欢将挂载叫为映射)来实现对相应的目录或文件的数据进行持久化。

本篇文章我们主要介绍基于volume来实现容器内应用程序log的输出。Volume是一个可供一个或多个容器使用的特殊目录,它绕过UFS(Union File System), 提供类似如下特性:

  • volume可以在容器之间共享和重用
  • 对volume的修改会立马生效
  • 对volume的更新,不会影响镜像
  • volume默认会一直存在,即使容器被删除

Volume的创建

我们可以通过指令 docker volume create volume-name 在docker主机中创建一个volume,如 docker volume create demo-log ,通过这个指令我们在docker主机中创建一个名为demo-log的volume,如下图所示:

Docker容器中应用程序的log输出管理

可以通过指令docker volume ls来查看当前docker主机中创建的volume,如下图所示:

Docker容器中应用程序的log输出管理

通过指令 docker volume inspect demo-log 来查看创建的demo-log volume的信息,如图所示:

Docker容器中应用程序的log输出管理

通过上图我们可以看到该volume所在的主机路为"C:\ProgramData\Docker\volumes\common-log\_data"

接下来我们通过docker run指令在创建容器的时候将demo-log volume挂载到容器中的某个路径上,我们将( 使用Log4Net根据log level的不同将log输出到不同的文件中 )中讲解的例子进行容器化,为其添加一个dockerfile文件,文件内容如下所示:

Docker容器中应用程序的log输出管理

通过 docker build -t logdemo:v1 . 指令创建一个名为logdemo:v1的image,然后通过指令

docker run -d -p 5001:80 --name logdemocontainer --mount source=demo-log,target=c:/app/logs logdemo:v1 

来创建一个名为logdemocontainer的容器,并将demo-log volume挂载到容器中的logs文件夹,这样logs文件夹中的log就会同时映射到docker主机的demo-log中,大家可能会有疑问:我是怎么知道container中有c:/app/logs目录的,这个在dockerfile中已经设置了workdir为app,所以app目录是一定在container中存在的,至于是存在于哪个盘中我们可以通过指令docker inspect logdemo:v1 来进行查看,如下图所示:

Docker容器中应用程序的log输出管理

需要注意logs folder是我们的应用程序在写入log的时候创建的,即log在container中的输出路径。

当有log输出的时候我们就可以在docker主机的volume目录中看到输出的log了,如图所示:

Docker容器中应用程序的log输出管理

通过指令 docker inspect containername 我们可以查看当前container的信息,其中包含了Mounts信息,如图所示:

Docker容器中应用程序的log输出管理

除了上述方式之外,我们还有另外一种方式进行volume的挂载,即在dockerfile中定义好挂载信息,我们可以在dockerfile中添加 VOLUME demo-log:c:/app/logs 指令来定义挂载信息,这样在创建image的时候,挂载信息就会被添加到image中,同时在创建container的时候会对volume进行创建,这样我们就不需要预先创建volume了,修改之后的dockerfile如图所示:

Docker容器中应用程序的log输出管理

以上就是该篇文章的全部内容,希望通过该篇文章的介绍能加强大家对Volume的理解。


以上所述就是小编给大家介绍的《Docker容器中应用程序的log输出管理》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机网络

计算机网络

Andrew S. Tanenbaum / 潘爱民 / 清华大学出版社 / 2004-8-1 / 60.00元

《计算机网络(第4版)》全书按照网络协议模型(物理层、数据链路层、介质访问控制子层、网络层、传输层和应用层),自下而上系统地介绍了计算机网络的基本原理,并给出了大量实例。在讲述各网络层的同时,还融合进了近年来迅速发展起来的各种网络技术,如Internet、SONET、A DSL、CDMA、WLAN和蓝牙等。另外,针对当前计算机网络的发展现状以及计算机安全的重要性,本书用了一整章的篇幅对计算机安全进......一起来看看 《计算机网络》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具