Docker 日誌指南
- Docker
一、概述
Docker 是一個操作系統級別的虛擬化平台,它允許我們在容器中託管應用程序。此外,它促進了應用程序和基礎設施的分離,以實現快速的軟件交付。
Docker 容器生成的日誌文件包含各種有用的信息。每當發生事件時,Docker 容器都會創建日誌文件。
Docker 將日誌生成到 STDOUT 或 STDERR,包括日誌來源、輸出流數據和時間戳。可以使用日誌文件進行調試和查找問題的根本原因。
在本教程中,我們將研究以不同方式訪問 Docker 日誌。
2. 了解 Docker 日誌
在 Docker 中,主要有兩種類型的日誌文件。 Docker 守護程序日誌提供對 Docker 服務整體狀態的洞察。 Docker 容器日誌涵蓋了與特定容器相關的所有日誌。
我們將主要探索訪問 Docker 容器日誌的不同命令。我們將使用docker logs
命令並通過直接訪問系統上的日誌文件來檢查容器日誌。
日誌文件對於調試問題很有用,因為它們提供了有關發生情況的詳細信息。通過分析 Docker 日誌,我們可以更快地診斷和解決問題。
3. 使用docker logs
命令
在我們繼續之前,讓我們首先運行一個示例 Postgres Docker 容器:
$ docker run -itd -e POSTGRES_USER=baeldung -e POSTGRES_PASSWORD=baeldung -p 5432:5432 -v /data:/var/lib/postgresql/data --name postgresql-baedlung postgres
Unable to find image 'postgres:latest' locally
latest: Pulling from library/postgres
214ca5fb9032: Pull complete
...
95df4ec75c64: Pull complete
Digest: sha256:2c954f8c5d03da58f8b82645b783b56c1135df17e650b186b296fa1bb71f9cfd
Status: Downloaded newer image for postgres:latest
bce34bb3c6175fe92c50d6e5c8d2045062c2b502b9593a258ceb6cafc9a2356a
為了說明,讓我們查看postgresql-baedlung
containerId
的 containerId:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bce34bb3c617 postgres "docker-entrypoint.s…" 12 seconds ago Up 10 seconds 0.0.0.0:5432->5432/tcp postgresql-baedlung
從上述命令的輸出中我們可以看到, postgresql-baedlung
正在使用 containerId “bce34bb3c617” 運行。現在讓我們探索docker logs
命令來監控日誌:
$ docker logs bce34bb3c617
2022-05-16 18:13:58.868 UTC [1] LOG: starting PostgreSQL 14.2 (Debian 14.2-1.pgdg110+1)
on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
2022-05-16 18:13:58.869 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
2022-05-16 18:13:58.869 UTC [1] LOG: listening on IPv6 address "::", port 5432
這裡,日誌包含帶有時間戳的輸出流的數據。上面的命令不包含連續的日誌輸出。要查看容器的連續日誌輸出,我們需要在docker logs
命令中使用“–follow”
選項。
“–follow”
選項是最有用的 Docker 選項之一,因為它允許我們監控容器的實時日誌:
$ docker logs --follow bce34bb3c617
2022-05-16 18:13:58.868 UTC [1] LOG: starting PostgreSQL 14.2 (Debian 14.2-1.pgdg110+1)
on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
...
2022-05-16 18:13:59.018 UTC [1] LOG: database system is ready to accept connections
上述命令的缺點之一是它將包含從一開始的所有日誌。讓我們查看命令以查看帶有最近記錄的連續日誌輸出:
$ docker logs --follow --tail 1 bce34bb3c617
2022-05-16 18:13:59.018 UTC [1] LOG: database system is ready to accept connections
我們還可以在docker log
命令中使用“since”
選項來查看特定時間的文件:
$ docker logs --since 2022-05-16 bce34bb3c617
2022-05-16 18:13:58.868 UTC [1] LOG: starting PostgreSQL 14.2 (Debian 14.2-1.pgdg110+1)
on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
...
2022-05-16 18:13:59.018 UTC [1] LOG: database system is ready to accept connections
或者,我們也可以使用docker container logs
命令代替docker logs
命令:
$ docker container logs --since 2022-05-16 bce34bb3c617
2022-05-16 18:13:58.868 UTC [1] LOG: starting PostgreSQL 14.2 (Debian 14.2-1.pgdg110+1)
on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
...
2022-05-16 18:13:59.018 UTC [1] LOG: database system is ready to accept connections
在這裡,我們可以從上面的輸出中看到,這兩個命令的工作方式完全相同。 docker container logs
命令在較新的版本中已棄用。
4. 使用默認日誌文件
Docker 以 JSON 格式存儲所有 STDOUT 和 STDERR 輸出。此外,可以從主機監控所有實時 Docker 日誌。默認情況下,Docker 使用json-file
日誌驅動程序將日誌文件存儲在主機上的專用目錄中。日誌文件目錄是運行容器的主機上的 /var/lib/docker/containers/<container_id>。
為了演示,讓我們檢查一下我們的postgress-baeldung
容器的日誌文件:
$ cat /var/lib/docker/containers/bce34bb3c6175fe92c50d6e5c8d2045062c2b502b9593a258ceb6cafc9a2356a/
bce34bb3c6175fe92c50d6e5c8d2045062c2b502b9593a258ceb6cafc9a2356a-json.log
{"log":"\r\n","stream":"stdout","time":"2022-05-16T18:13:58.833312658Z"}
{"log":"PostgreSQL Database directory appears to contain a database; Skipping initialization\r\n","stream":"stdout","time":"2022-05-16T18:13:58.833360038Z"}
{"log":"\r\n","stream":"stdout","time":"2022-05-16T18:13:58.833368499Z"}
在上面的輸出中,我們可以看到數據是 JSON 格式的。
5. 清除日誌文件
有時我們系統上的磁盤空間不足,我們注意到 Docker 日誌文件佔用了大量空間。為此,我們首先需要找到日誌文件,然後刪除它們。此外,請確保清除日誌文件不會影響正在運行的容器的狀態。
以下是清除主機上存儲的所有日誌文件的命令:
$ truncate -s 0 /var/lib/docker/containers/*/*-json.log
請注意,上述命令不會刪除日誌文件。相反,它將刪除日誌文件中的所有內容。通過執行以下命令,我們可以刪除與特定容器關聯的日誌文件:
$ truncate -s 0 /var/lib/docker/containers/dd207f11ebf083f97355be1ae18420427dd2e80b061a7bf6fb0afc326ad04b10/*-json.log
在容器啟動時,我們還可以使用docker run
命令的“–log-opt max-size”
和“ –log-opt max-file”
選項從外部限制日誌文件的大小:
$ docker run --log-opt max-size=1k --log-opt max-file=5 -itd -e POSTGRES_USER=baeldung -e POSTGRES_PASSWORD=baeldung -p 5432:5432
-v /data:/var/lib/postgresql/data --name postgresql-baedlung postgres
3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32
現在,讓我們查看/var/lib/docker/containers/3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32
目錄中的日誌文件數量和日誌文件大小:
$ ls -la
total 68
drwx------. 4 root root 4096 May 17 02:06 .
drwx------. 5 root root 222 May 17 02:07 ..
drwx------. 2 root root 6 May 17 02:02 checkpoints
-rw-------. 1 root root 3144 May 17 02:02 config.v2.json
-rw-r-----. 1 root root 587 May 17 02:06 3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32-json.log
-rw-r-----. 1 root root 1022 May 17 02:06 3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32-json.log.1
-rw-r-----. 1 root root 1061 May 17 02:06 3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32-json.log.2
-rw-r-----. 1 root root 1056 May 17 02:06 3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32-json.log.3
-rw-r-----. 1 root root 1058 May 17 02:06 3eec82654fe6c6ffa579752cc9d1fa034dc34b5533b8672ebe7778449726da32-json.log.4
-rw-r--r--. 1 root root 1501 May 17 02:02 hostconfig.json
-rw-r--r--. 1 root root 13 May 17 02:02 hostname
-rw-r--r--. 1 root root 174 May 17 02:02 hosts
drwx------. 2 root root 6 May 17 02:02 mounts
-rw-r--r--. 1 root root 69 May 17 02:02 resolv.conf
-rw-r--r--. 1 root root 71 May 17 02:02 resolv.conf.hash
在這裡,我們可以看到創建了五個日誌文件,每個日誌文件的大小最大為 1 kb。如果我們刪除一些日誌文件,在這種情況下,我們將生成一個具有相同日誌文件名的新日誌。
我們也可以在/etc/docker/daemon.json
文件中提供 log max-size
和max-file
的配置。讓我們看看 daemon.json 文件的配置:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "1k",
"max-file": "5"
}
}
在這裡,我們在daemon.json,
中提供了相同的配置,重要的是,所有新容器都將使用此配置運行。更新daemon.json
文件後,我們需要重新啟動 Docker 服務。
6. 將 Docker 容器日誌重定向到單個文件
默認情況下,Docker 容器日誌文件存儲在/var/lib/docker/containers/<containerId>
目錄中。此外,我們還可以將 Docker 容器日誌重定向到其他文件。
為了說明,讓我們看看重定向容器日誌的命令:
$ docker logs -f containername &> baeldung-postgress.log &
在這裡,在上面的命令中,我們將所有實時日誌重定向到baeldung-postgress.log
文件。此外,我們使用&
在後台運行此命令,因此它將一直運行,直到它被明確停止。
7. 結論
在本教程中,我們學習了監控容器日誌的不同方法。首先,我們查看了docker logs,
以及docker container logs
命令來監控實時日誌。後來,我們使用默認的容器日誌文件監控日誌。
最後,我們研究了日誌文件的清除和重定向。簡而言之,我們研究了監控和截斷日誌文件。