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

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

Docker数据管理

默认状况下,容器内建立的全部文件都存储在可写容器层上,这意味着:git

当该容器再也不存在时,数据不会持久,而且若是另外一个进程须要数据,则很难将数据从容器中取出。容器的可写层与运行容器的主机紧密耦合,咱们不能轻易地将数据移动到其余地方。docker

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

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

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

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

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

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


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

本篇文章咱们主要介绍基于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 volume ls来查看当前docker主机中建立的volume,以下图所示:


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


经过上图咱们能够看到该volume所在的主机路为"C:\ProgramData\Docker\volumes\common-log\_data"

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


经过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 来进行查看,以下图所示:


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

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


经过指令docker inspect containername咱们能够查看当前container的信息,其中包含了Mounts信息,如图所示:



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


以上就是该篇文章的所有内容,但愿经过该篇文章的介绍能增强你们对Volume的理解。


相关资料:

docs.docker.com/storage/

yeasy.gitbooks.io/docker_prac…


上一篇(Docker实践过程当中遇到的问题总结)

下一篇(灵活设置Docker容器内.net core app的配置文件信息)

相关文章
相关标签/搜索