Docker 容器日志分析
查看容器日志
先使用 docker run -it --rm -d -p 80:80 nginx:1.15.8-alpine 命令啟動(dòng)一個(gè)nginx容器。如果沒有異常,會(huì)得到容器ID如 d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00 的長(zhǎng)串。再使用 curl -i http://127.0.0.1 訪問服務(wù),確認(rèn)nginx容器正常啟動(dòng)運(yùn)行。最后使用 docker logs -f d24 查看容器的日志輸出,大概如下:
172.17.0.1 - - [24/Mar/2019:03:51:21 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
一般來說使用容器ID的前3位即可
以上就是我們查看容器日志的日常方法了,非常簡(jiǎn)單實(shí)用。
容器日志文件存儲(chǔ)
容器的日志會(huì)以json文件方式存儲(chǔ)在本地磁盤,可以使用下面方式查看文件路徑 docker inspect d42 | grep Log 可以找到:
"LogPath": "/var/lib/docker/containers/d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00/d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00-json.log",
注意1:mac上沒有/var/lib/docker目錄 ,因?yàn)閐ocker for mac的運(yùn)作方式不一樣,最好使用linux系統(tǒng)練習(xí)。
注意2: 如果LogPath內(nèi)容為空,大概是因?yàn)閐ocker engine版本,升級(jí)docker版本能到docker-ce 18.09.3
查看 d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00-json.log 文件,可以看到:
{"log":"172.17.0.1 - - [24/Mar/2019:03:51:21 +0000] \"GET / HTTP/1.1\" 200 612 \"-\" \"curl/7.29.0\" \"-\"\r\n","stream":"stdout","time":"2019-03-24T03:51:21.982476951Z"}
這條信息的log字段內(nèi)容和之前通過 docker logs 命令查看的內(nèi)容一致。
容器日志會(huì)跟隨容器生命周期,容器銷毀后日志也會(huì)銷毀。使用 docker stop 24 關(guān)停測(cè)試的nginx服務(wù)。因?yàn)槿萜鲉?dòng)使用時(shí)候用了 --rm 參數(shù),關(guān)停后會(huì)自動(dòng)清理刪除,所以會(huì)發(fā)現(xiàn) /var/lib/docker/containers/d2408a7931c95a3a83ffeca2fba887763cf925a67890ef3be4d9ff838aa25b00 目錄不存在了,相應(yīng)的日志文件也就刪除了。
容器日志文件滾動(dòng)策略
docker容器日志默認(rèn)寫入json文件,在線上運(yùn)行時(shí)候會(huì)有磁盤寫滿的風(fēng)險(xiǎn)??梢哉{(diào)整策略,讓其進(jìn)行滾動(dòng)。修改/etc/docker/daemon.json(如果沒有就手工創(chuàng)建一個(gè)),增加下面內(nèi)容:
{
"log-opts": {
"max-size": "1m",
"max-file": "3"
}
}
修改完成后重啟docker服務(wù):
systemctl daemon-reload systemctl restart docker.service
測(cè)試一下新的日志策略,使用下面的命令創(chuàng)建一個(gè)容器:
docker run -d --rm alpine:3.6 sh -c "while true; do echo hello world; usleep 10; done"
這個(gè)alpine容器就是每隔10微秒輸出hello world,保持高頻度輸出,快速生產(chǎn)日志文件。
注:shell中的時(shí)間控制
1、sleep : 默認(rèn)為秒。
sleep 1s 表示延遲一秒
sleep 1m 表示延遲一分鐘
sleep 1h 表示延遲一小時(shí)
sleep 1d 表示延遲一天
2、usleep : 默認(rèn)以微秒。
1s = 1000ms = 1000000us
按照前文中查看日志文件的方法
# pwd /var/lib/docker/containers/aa3307f5b42770319129e126122be123cfd8e0ebe1c412371ad27e62faa007e3 # ls -lah total 2.6M drwx------ 4 root root 4.0K Mar 24 16:22 . drwx------ 3 root root 4.0K Mar 24 16:21 .. -rw-r----- 1 root root 647K Mar 24 16:22 aa3307f5b42770319129e126122be123cfd8e0ebe1c412371ad27e62faa007e3-json.log -rw-r----- 1 root root 977K Mar 24 16:22 aa3307f5b42770319129e126122be123cfd8e0ebe1c412371ad27e62faa007e3-json.log.1 -rw-r----- 1 root root 977K Mar 24 16:21 aa3307f5b42770319129e126122be123cfd8e0ebe1c412371ad27e62faa007e3-json.log.2
很容易發(fā)現(xiàn),日志文件的策略就是維持3個(gè)1m大小文件存在,和我們?cè)O(shè)置保持一致。
測(cè)試完成后,記得使用docker stop aa3 清理測(cè)試現(xiàn)場(chǎng),max-size也可以按照真實(shí)需求調(diào)整大小。
nginx容器日志
了解docker容器的日志策略后,再看看常用的容器是如何處理的。先看看nginx容器。
首先 docker run -it --rm -d -p 80:80 nginx:1.15.8-alpine 創(chuàng)建一個(gè)nginx容器,然后 docker exec -it b6d sh 進(jìn)入容器,查看/etc/nginx/nginx.conf可以看到下面內(nèi)容:
error_log /var/log/nginx/error.log warn; access_log /var/log/nginx/access.log main;
也就是nginx會(huì)將錯(cuò)誤日志和訪問日志寫入對(duì)應(yīng)的日志文件。繼續(xù)查看/var/log/nginx目錄:
/var/log/nginx # ls -lah total 0 drwxr-xr-x 2 root root 39 Mar 4 07:54 . drwxr-xr-x 3 root root 18 Mar 4 07:54 .. lrwxrwxrwx 1 root root 11 Jan 31 23:32 access.log -> /dev/stdout lrwxrwxrwx 1 root root 11 Jan 31 23:32 error.log -> /dev/stderr
這就發(fā)現(xiàn)奧秘了,access.log文件會(huì)通過軟鏈接重定向到標(biāo)準(zhǔn)輸出,而錯(cuò)誤日志error.log則會(huì)重定向標(biāo)準(zhǔn)錯(cuò)誤。這樣使用docker log命令就可以看到nginx的訪問日志了。
為了進(jìn)一步驗(yàn)證,查看nginx dockerfile文件,其中有:
# forward request and error logs to docker log collector && ln -sf /dev/stdout /var/log/nginx/access.log \ && ln -sf /dev/stderr /var/log/nginx/error.log
可見nginx鏡像創(chuàng)建時(shí)候就定義好了日志文件的輸出。
同樣使用docker stop 524清理現(xiàn)場(chǎng),以后就不再介紹清理這一步驟了。
mysql容器日志
啟動(dòng)一個(gè)mysql容器
docker run --rm -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
不難看到mysql容器日志輸出, 截取其中片段如下:
Initializing database
2019-03-24T08:48:19.102726Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-03-24T08:48:20.241459Z 0 [Warning] InnoDB: New log files created, LSN=45790
2019-03-24T08:48:20.414933Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2019-03-24T08:48:20.509897Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 935a6ee7-4e11-11e9-b135-0242ac110002.
2019-03-24T08:48:20.519148Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2019-03-24T08:48:20.519843Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
2019-03-24T08:48:24.066683Z 1 [Warning] 'user' entry 'root@localhost' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066730Z 1 [Warning] 'user' entry 'mysql.session@localhost' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066740Z 1 [Warning] 'user' entry 'mysql.sys@localhost' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066756Z 1 [Warning] 'db' entry 'performance_schema mysql.session@localhost' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066761Z 1 [Warning] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066772Z 1 [Warning] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066814Z 1 [Warning] 'tables_priv' entry 'user mysql.session@localhost' ignored in --skip-name-resolve mode.
2019-03-24T08:48:24.066822Z 1 [Warning] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode.
Database initialized
Initializing certificates
Generating a RSA private key
查看mysql Dockerfile 文件,可以知道m(xù)ysql鏡像啟動(dòng)入口在entrypoint.sh,從腳本中發(fā)現(xiàn):
echo 'Initializing database' "$@" --initialize-insecure echo 'Database initialized'
這樣就是mysql容器啟動(dòng)時(shí)候的輸出對(duì)應(yīng)起來了。entrypoint.sh比較復(fù)雜,主要功能就是啟動(dòng)mysqld,并將日志輸出,因?yàn)椴皇潜疚闹攸c(diǎn),就不詳細(xì)介紹了。
總結(jié)
- docker容器默認(rèn)輸出到本地json文件,并且可以對(duì)其進(jìn)行大小和數(shù)量控制。
- 應(yīng)用容器日志可以先生成日志文件,然后將應(yīng)用日志文件軟連接到標(biāo)準(zhǔn)輸出,比如nginx;也可以在啟動(dòng)時(shí)候直接將日志打印到標(biāo)準(zhǔn)輸出,比如mysql。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
docker中psql數(shù)據(jù)庫(kù)備份與恢復(fù)詳解
在本篇文章里小編給大家整理的是關(guān)于docker中psql數(shù)據(jù)庫(kù)基本操作內(nèi)容,需要的朋友們可以學(xué)習(xí)參考下。2020-02-02
使用腳本一鍵打包并上傳docker鏡像的實(shí)現(xiàn)代碼
這篇文章主要介紹了使用腳本一鍵打包并上傳docker鏡像的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
pipework docker無法使用ip netns命令解決辦法
這篇文章主要介紹了pipework docker無法使用ip netns命令解決辦法的相關(guān)資料,需要的朋友可以參考下2016-10-10
Docker容器實(shí)現(xiàn)SSH遠(yuǎn)程直連
在某些特殊需求下,我們想ssh直接遠(yuǎn)程連接docker 容器,本文主要介紹了Docker容器實(shí)現(xiàn)SSH遠(yuǎn)程直連,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08
用docker部署RabbitMQ環(huán)境的詳細(xì)介紹
這篇文章主要介紹了用docker部署RabbitMQ環(huán)境,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07
詳解Django+Vue+Docker搭建接口測(cè)試平臺(tái)實(shí)戰(zhàn)
這篇文章主要介紹了詳解Django+Vue+Docker搭建接口測(cè)試平臺(tái)實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
云原生使用Docker部署Firefox瀏覽器詳細(xì)圖文教程
下面這篇文章主要給大家介紹了關(guān)于云原生使用Docker部署Firefox瀏覽器的相關(guān)資料,這對(duì)于一些特殊的測(cè)試場(chǎng)景非常有用,例如需要在不同版本的瀏覽器中進(jìn)行測(cè)試,需要的朋友可以參考下2024-04-04
Docker部署Golang服務(wù)的實(shí)現(xiàn)步驟
不管是開發(fā)還是生產(chǎn)環(huán)境,通過docker方式部署服務(wù)都是一種不錯(cuò)的選擇,本文主要介紹了Docker部署Golang服務(wù)的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01

