docker logs 顯示的日誌不會持續地堆積在系統內存中。相反,預設情況下 會以文件的形式儲存在主機的磁碟上


日誌是如何以及存放在哪裡? ⚙️



Docker 捕獲容器的標準輸出(stdout)和標準錯誤(stderr)流,並通過 日誌驅動程式(Logging Driver) 來處理。如果沒有特別的設置,Docker 預設使用 json-file 日誌驅動程式。

  • 儲存位置: 容器的日誌以 JSON 格式的文件存儲在主機系統的特定路徑。通常路徑如下:

    • /var/lib/docker/containers/[容器_ID]/[容器_ID]-json.log
  • docker logs 命令: 該命令實際上不是顯示內存中的內容,而是讀取上述提到的 JSON 日誌文件並顯示在終端上。


日誌不斷增長會不會導致磁碟空間不足? 🤔

是的,沒錯。如果不採取任何措施,日誌文件會一直增大,佔滿主機的磁碟空間。為了防止這種情況,Docker 提供了 日誌輪替(Log Rotation) 選項,用於限制日誌文件的大小和數量。

例如,在執行 docker run 命令時,可以添加以下選項。

docker run -d \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  nginx
  • --log-opt max-size=10m: 限制單個日誌文件的最大大小為 10MB

  • --log-opt max-file=3: 限制日誌文件的最大數量為 3個。超過3個時會刪除最舊的文件。

這樣設置後,該容器的日誌最多將只佔用 30MB(10MB * 3個)的磁碟空間。


結論 📝



  • Docker 容器的控制台日誌是儲存在主機的磁碟上,而非系統內存中的文件。

  • docker logs 命令的作用是讀取這些儲存的文件來顯示。

  • 為了防止日誌文件無限制增長,設定日誌輪替選項(max-size, max-file)非常重要。

在 Docker Compose 中,可以非常輕鬆地在 docker-compose.yml 文件中為每個服務設定日誌選項。

可以把 docker run 命令中的 --log-opt 標誌想像成 YAML 格式。


docker-compose.yml 文件中設定 📝

下面是一個在 my-app 服務中應用日誌輪替的範例。

services:
  my-app:
    image: your-app-image
    # ... 其他設定 ...
    deploy:
      resources:
        limits:
          memory: 512M

    # 👇 這部分是日誌設定。
    logging:
      driver: "json-file"  # 使用的日誌驅動 (因為是預設可以省略)
      options:
        max-size: "10m"    # 每個文件的最大大小: 10MB
        max-file: "3"      # 最大文件數量: 3個
  • logging: 開始該服務的日誌設定的鍵。

  • driver: 指定使用的日誌驅動。 json-file 是預設值。

  • options: 設定傳遞給驅動的選項。

    • max-size: 與 docker run--log-opt max-size 相同。

    • max-file: 與 docker run--log-opt max-file 相同。

現在若通過 docker-compose up 啟動這個服務,my-app 容器的日誌將自動輪轉,只使用最多 30MB(10MB * 3個)的磁碟空間。


為所有容器設置默認值 🌍

如果你覺得每個容器逐一設置選項很麻煩,並且想對整個系統應用基本策略,那麼修改 Docker daemon 的設置 文件是最好的方法。

  1. 打開或創建 /etc/docker/daemon.json 文件。(如果沒有文件則新建一個。)

  2. 按如下所示編寫內容。

{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "10m",
        "max-file": "3"
    }
}
  1. 重新啟動 Docker daemon。
sudo systemctl restart docker

這樣設置後,未來創建的所有容器將自動遵循該策略,除非特別做其他日誌設定。當然,在 docker-compose.yml 文件或 docker run 命令中為特定容器指定其他日誌選項時,個別設置比 daemon 設置優先適用

總結

  • 個別服務設定: 在 docker-compose.yml 文件中的 logging 區域設定是最普遍且方便的做法。

  • 全局預設設置: 若要對伺服器上的所有容器施行統一政策,請修改 /etc/docker/daemon.json 文件。