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的配置文件信息)

相關文章
相關標籤/搜索