為 Docker 容器設置日誌輪替

我們都需要日誌!

有時候使用 Docker 給我的感覺像是在使用黑盒,特別是在使用 Docker 社區中的映像時,有時會不像預期的那樣順利。在很多情況下,我們都需要使用很多時間去閱讀日誌來除錯。

這篇文章是關於如何為 Docker 容器設定日誌輪替。

默認的日誌驅動程式

我們可以為容器配置不同的日誌記錄驅動程式,默認情況下容器的 stdoutstderr 會被寫入到 /var/lib/docker/containers/[container-id]/[container-id]-json.log 的 json 文件。如果一直無人理會,這個文件最終會佔用大量的磁盤空間,如下圖所示:

一個非常大的 json 日誌文件

一個非常大的 json 日誌文件

手動清除日誌

若果這個 json 日誌文件佔用了大量的磁盤空間,我們可以使用下面的命令清除它。

1
truncate -s 0 <logfile>

或者我們可以考慮設置一個 cronjob 來定期清除這些 json 日誌文件,但從長遠來看,最好還是設置日誌輪替。

設置日誌輪替

配置默認的日誌驅動程式

默認的日誌驅動程式可以通過在 /etc/docker/daemon.json 中定義。如果該文件不存在,可以建立該文件。

1
2
3
4
5
6
7
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "10"
  }
}

json-file 作日誌記錄驅動程式還有幾個其它選項,我們甚至可以更改為其他日誌記錄驅動程式,如 syslog 。有關更多信息,請參閱 Docker Docs - Configure logging drivers

執行以下命令來重新加載更新後的 daemon.js 。新的配置將在重新啟動後適用於所有新建立的容器。

1
2
3
$ systemctl daemon-reload

$ systemctl restart docker

為個別容器配置日誌驅動程式

如果您不想作全局配置,也可以在個別容器級作日誌驅動程式改動。

使用 docker run 命令

我們可以在 docker run 命令中指定日誌記錄驅動程式與其選項。例如:

1
2
3
4
5
$ docker run \
    --log-driver json-file \
    --log-opt max-size=10m \
    --log-opt max-file=10 \
    alpine echo hello world

使用 docker-compose

日誌記錄驅動程式與其選項也可以使用 docker-compose 進行配置。例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
version: '3.2'
services:
  nginx:
    image: 'nginx:latest'
    ports:
      - '80:80'
    logging:
      driver: "json-file"
      options:
        max-size: "1k"
        max-file: "3"

來看看配置是否成功。

日誌被分成多個 1k 文件

日誌被分成多個 1k 文件

總結

儘管默認的日誌驅動程式設定不會影響 Docker 正常運作,也不會產生很大問題,但總有一天容器的日誌會佔用所有磁盤空間,通過上述幾個步驟將可以避免發生磁盤空間不足。除此之外,日誌是重要的資產,不僅在出現問題時有用,而且內裡還包含很多隱藏的信息,所以不要看輕日誌的重要性。

如果您正在尋找日誌管理的軟體即服務方案,不妨考慮使用 Boatswain 來幫助您管理所有日誌以及監控 Docker 伺服器的狀態。💫

危險通常伴隨一知半解而來

危險通常伴隨一知半解而來