三點總結

  • Docker 容器的控制台日誌不是儲存在系統記憶體中,而是以檔案形式儲存在主機的磁碟上
  • docker logs 指令的作用是讀取這些儲存的日誌檔案並顯示出來。
  • 為了防止日誌檔案無限增大,設定日誌輪替選項(max-size, max-file至關重要。

1. 日誌儲存在哪裡?如何儲存?

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

  • 儲存位置:容器的日誌會以 JSON 格式的檔案儲存在主機系統的特定路徑。通常路徑如下:
    • /var/lib/docker/containers/[컨테이너_ID]/[컨테이너_ID]-json.log
  • docker logs 指令:這個指令實際上並不是顯示記憶體中的內容,而是讀取上述的 JSON 日誌檔案並顯示在終端機上。

ChatGPT 圖片 2026年 5月 12日 下午 12_37_29.png

2. 日誌持續累積會導致磁碟空間不足嗎?

是的,沒錯。如果不採取任何措施,日誌檔案會不斷增大,最終可能佔滿主機的磁碟空間。為了防止這種情況發生,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 個) 的磁碟空間。


3. 在 docker-compose.yml 檔案中設定

在 Docker Compose 中,您可以在 docker-compose.yml 檔案中輕鬆地為每個服務設定日誌選項。

您可以將其視為 docker run 指令的 --log-opt 旗標以 YAML 格式呈現。

以下是在名為 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 個) 的磁碟空間。

4. 為所有容器設定預設值

如果您覺得為每個容器逐一設定選項很麻煩,並希望為整個系統應用預設策略,那麼修改 Docker 守護程序 (Daemon) 設定檔案是最佳方法。

  1. 開啟或建立 /etc/docker/daemon.json 檔案。(如果檔案不存在,請新建立一個。)
  2. 寫入以下內容:
{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "10m",
        "max-file": "3"
    }
}

3. 重新啟動 Docker 守護程序。

sudo systemctl restart docker

這樣設定後,未來建立的所有容器,除非有額外的日誌設定,否則都會自動遵循此策略。當然,如果在 docker-compose.yml 檔案或 docker run 指令中為特定容器指定了不同的日誌選項,那麼個別設定將優先於守護程序設定

  • 個別服務設定:在 docker-compose.yml 檔案的 logging 區塊中進行設定是最常見且方便的方法。
  • 全域預設設定:若要為伺服器上的所有容器應用統一策略,請修改 /etc/docker/daemon.json 檔案。