在以前的文章中咱们介绍过Docker相关的基础知识,同时在文章(使用Log4Net根据log level的不一样将log输出到不一样的文件中)中介绍了log4net的使用,本篇文章咱们将结合二者来介绍如何将docker容器中应用程序的log输出到docker主机中。说到docker中应用程序log的输出,咱们须要先来了解一下Docker的数据管理机制。linux
默认状况下,容器内建立的全部文件都存储在可写容器层上,这意味着: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), 提供相似以下特性:
咱们能够经过指令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的理解。
相关资料:
yeasy.gitbooks.io/docker_prac…