在以前的文章中咱們介紹過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…