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 的設置 文件是最好的方法。
-
打開或創建
/etc/docker/daemon.json文件。(如果沒有文件則新建一個。) -
按如下所示編寫內容。
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
- 重新啟動 Docker daemon。
sudo systemctl restart docker
這樣設置後,未來創建的所有容器將自動遵循該策略,除非特別做其他日誌設定。當然,在 docker-compose.yml 文件或 docker run 命令中為特定容器指定其他日誌選項時,個別設置比 daemon 設置優先適用。
總結
-
個別服務設定: 在
docker-compose.yml文件中的logging區域設定是最普遍且方便的做法。 -
全局預設設置: 若要對伺服器上的所有容器施行統一政策,請修改
/etc/docker/daemon.json文件。
目前沒有評論。