三點總結
- 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 日誌檔案並顯示在終端機上。

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) 設定檔案是最佳方法。
- 開啟或建立
/etc/docker/daemon.json檔案。(如果檔案不存在,請新建立一個。) - 寫入以下內容:
{
"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檔案。