docker日志
首先我們先日常運行一個nginx容器,日志會在終端輸出訪問日志以及錯誤日志
[root@localhost ~]# docker run -it -p 80:80 nginx
現在我們打開網站訪問一下nginx
因為我們在啟動日志的時候沒有使用-d參數,httpd容器以前台方式啟動,日志會直接打印到當前的終端窗口。 加-d參數以后后台方式運行容器,我們就看不到輸出的日志了
這種情況下如果要查看容器的日志,有兩種方法 attach到該容器
[root@localhost ~]# docker attach 2ecf757 192.168.172.1 - - [20/Jun/2020:06:34:03 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36" "-" 192.168.172.1 - - [20/Jun/2020:06:34:03 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36" "-" 192.168.172.1 - - [20/Jun/2020:06:34:04 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36" "-"
用docker logs 命令查看日志
attach 的方法在實際使用中不太方便,因為:
1.只能看到attach之后的日志,以前的日志不可見
2.退出attach狀態比較麻煩ctrl+p+q 一不小心很榕溪將容器殺掉,查看容器推薦的方法是 docker logs命令
[root@localhost ~]# docker logs -f 22fbc207a41a6d /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf 10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh /docker-entrypoint.sh: Configuration complete; ready for start up 192.168.172.1 - - [20/Jun/2020:06:39:55 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36" "-" 192.168.172.1 - - [20/Jun/2020:06:39:55 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36" "-" 192.168.172.1 - - [20/Jun/2020:06:39:55 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36" "-"
docker logs能夠打印出容器啟動以來完整的日志,並且 -f參數可以繼續打印出新產生的日志效果上和linux tail -f一樣
docker支持多種日志方案
將容器日志發送到stdout 和stderr是docker的默認日志行為,實際上 docker提供了多種日志機制幫助用戶從運行的容器中提取日志信息,這些機制被稱作logging driver
docker默認的logging driver是json-file
[root@localhost ~]# docker info |grep 'Logging Driver' Logging Driver: json-file
如果容器在啟動時沒有特別指明,就會使用這個默認的json-file 會將容器的日志保存在json文件中,docker 負責格式化其內容 並輸出到stdout和stderr 我們可有再host 的容器目錄中找到這個文件容器路徑為
[root@localhost ~]# docker container inspect 22fbc207a41a |grep 'LogPath' "LogPath": "/var/lib/docker/containers/22fbc207a41a6dc8227dd705768a635a729fd778b57da7632f7cf92a6e8c091e/22fbc207a41a6dc8227dd705768a635a729fd778b57da7632f7cf92a6e8c091e-json.log",
none是disable容器日志功能
syslog和journald 是linux上的兩種日志管理服務
awslogs splunk和gcplogs是第三方日志托管服務
gelf和fluentd是兩種開源的日志管理方案
容器啟動時可以通過 --log driver 指定使用的logging driver 如果要設置docker默認的 logging driver 需要修改 docker daemon的啟動腳本,指定 --log-driver參數
[root@localhost ~]# docker info |grep 'Logging Driver' Logging Driver: none