拿 Docker 跑服務紀錄檔過大的問題

| | 0 Comments| 10:23
Categories:

Heresy 這邊工作上有一些服務現在都是在 Ubuntu 上透過 Docker 來跑的,像是 GitLabWordPress 都是這樣搞的。

而 GitLab 這邊由於一開始是用 Hyper-V 自動建立的 VM,所以給個系統分割區很小、只有 16GB;由於這邊還需要放置 Docker 映像檔,所以其實滿吃緊的,之前就碰過沒辦法解開映像檔的問題。

雖然後來有調大到 32GB,但是後來還是偶爾會出現磁碟不知道為什麼滿了的問題?認真找了一下,這才發現原來是 Docker 容器執行的紀錄檔案過大造成的。

這些檔案預設會是在「/var/lib/docker/containers/」下,裡面每個子資料夾都是代表一個容器、名稱就是容器的 ID;而裡面會有一個 XXXX-json.log 這樣的檔案,它就是容器的輸出紀錄檔案。

他基本上是以 JSON 的格式來記錄容器的輸出,裡面還包含了包含時間在內的元資料;在透過 docker logs 來看容器的運作紀錄的時候,基本上就是從這邊來讀取的。

而由於它會記錄所有輸出,所以如果容器輸出到 console 的內容很多的時候,這個檔案就會變得很大;這對於一次性的容器算還好,畢竟當容器被刪除後,這個紀錄檔就會被一起刪除。

但是如果是持續跑的服務型容器的話…放得久一點下來、這個紀錄檔的大小可能就會變得很可觀了…像在 Heresy 這邊,這種檔案甚至吃了 15GB+ 的空間、把系統磁碟的剩下空間全部用掉了…


至於要怎麼避免這些紀錄檔把磁碟空間吃光呢?基本上就是要針對這些紀錄檔做一些限制了!

這部分 Docker 本身就有提供相關的設定可以做控制,這部分可以參考《Configure logging drivers》。

基本上,這部分的設定可以針對整個 Docker 做設定、也可以針對個別容器做設定。

修改整個 Docker

如果是要針對整個 Docker 來修改的話,就是去修改「/etc/docker/daemon.json」這個設定檔案,在裡面加入類似下面的設定:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

這個設定會讓單一紀錄檔案最大只會到 10MB、超過之後會進行切割、然後最多保留三個檔案;這樣一來,就會可以把紀錄檔案的總大小限制在 30MB,然後把比較舊的紀錄丟棄了。

而如果想要維持單一檔案的話,也可以把 max-file 拿掉。

不過這樣修改要注意的是,這樣設定修改後不會對既有的容器造成變更(紀錄是存在容器裡的),所以如果是既有的容器的話,比較簡單的做法大概就是重新建立了。

針對個別容器做設定

如果是要針對個別容器做設定的話,也可以在執行容器的時候,透過「--log-opt」來指定相關的參數。像是要和上面一樣的話,就是:

docker run -it --log-opt max-size=10m --log-opt max-file=3 ubuntu bash

這樣的形式。

而如果是 Docker Compose 的話,也有相關的設定可以使用(參考)。


基本的修改大概就是這樣了吧~至少這樣修改後,就不用擔心記錄檔把磁碟空間吃完了。

而如果要進一步看的話,實際上 Docker 在這邊也還有提供很多種不同的紀錄方式、可以透過「log-driver」來做設定;例如,如果直接把 log-driver 設定成 none 的話,就完全不會儲存紀錄!但是相對地,docker logs 就也看不到任何紀錄,對於非互動式的容器來說,可能就會變成相當難除錯了。

參考:Docker container logs taking all my disk space

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *