Heresy 這邊工作上有一些服務現在都是在 Ubuntu 上透過 Docker 來跑的,像是 GitLab 和 WordPress 都是這樣搞的。
而 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
就也看不到任何紀錄,對於非互動式的容器來說,可能就會變成相當難除錯了。