iT邦幫忙

2022 iThome 鐵人賽

DAY 26
0

讓我們回到 Log 這個主題,在 D24 - Log 已經說明了 Log 的重要性,

然而,我也還對 Docker Log 不夠熟悉,因此我們來搜尋看看其他人是怎麼說的,

我使用的 Google 關鍵字是 docker log best practice,並主觀地選了第三個搜尋結果:
Docker Logging: 101 Guide to Logs, Best Practices & More,來介紹一下其中的兩個段落。


How Is Docker Logging Different

這篇文章的一開始,先簡介了關於 Docker、Container、與 Log,接著的段落就說明「Docker Logging 與一般的 Logging 哪裡不同」,
作者總結成了兩點:

  1. Container (容器) 是短暫的
  2. Container 會分成多個層次

為什麼說是短暫的呢?並不是說一個 Docker 真的只會存在很短的時間,而是 Container 本身是很容易被移除的,
被移除後,附屬在 container 下的資源也都會消失,例如沒有綁定 volume 的檔案、Log 紀錄,

Docker log 的內容是由 Docker Container 的 stdout、stderr 組成的,會被存放在 /var/lib/docker/containers/ 這個路徑下,除了 Log 會影響到 Server 的硬碟容量以外,在 container 移除後也會被清空,

第二點說的多個層次,則是指 Container 在執行時的關聯性,
即使是最簡化的情況下,Container 跟執行 Docker 的主機本身,就已經有兩個層次了,如果服務是由一組 Container 所組成的,還會讓狀況更加複雜。


Strategies

作者在文章中,整理了五種處理 Docker Log 的方法:

  1. 由應用程式自己處理
  2. 使用 Volume
  3. 預設或自訂的 Logging Driver
  4. 由獨立的 container 專責處理
  5. 側車模式的 container

1. 由應用程式自己處理

不同的語言、框架對於 Log 的處理方式可能都不同,於是最簡易的方式就是讓程式自己處理 Log,例如把 Log 都集中送到雲端平台上。

2. 使用 Volume

跟第一個方法很類似,不同的是會把 Log 寫入檔案中,並把檔案用 Docker Volume 的方式綁定 (或說掛載) 到指定的路徑去,同樣也能把 Log 保存下來,

這個方法的缺點,是如果我們需要把 Container 移植到其他 Server 上時,已存在的 Log 就需要另外搬遷,可能會造成移植的時間變長、或是 Log 會被直接捨棄。

3. 預設或自訂的 Logging Driver

Docker Log 預設會被寫入到 Server 的指定路徑上,
而 Docker 也提供能用自定義的 Driver,意思是 Container 的 stdout、stderr 不會寫入到預設路徑,而是改成執行自定義的行為,但相對的,有些功能會被限制。

4. 由獨立的 container 專責處理

這是作者最推薦的方式,
啟動一個專責的 Container 來處理、收集 Log,這也比較符合 Docker 的設計 — 把各個需要的服務拆細後分開來,類似 關注點分離 的概念。

5. 側車模式的 container

側車 (Sidecar) 用來加裝在機車旁,增加一位乘坐人數,

這個模式的作法,跟專責的 Container 很像,都會啟動獨立的 container,
不一樣的是,在原本每一個服務中的 container,都附帶上一個額外 logging container,讓各自的 logging container 專責處理單一 container 的 log。


關於 Docker Log,就像其他各種設計一樣,也有很多種處理方式,各有優缺點,
就盡可能地選擇當下最適中的方法吧。


上一篇
D25 - Docker Compose 深不入淺不出
下一篇
D27 - Fluentd
系列文
其實沒有那麼難 — Docker30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言