自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

看看程序員如何被 Docker 日志坑慘了

開源
Docker 是一個(gè)開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的鏡像中,然后發(fā)布到任何流行的 Linux或Windows 機(jī)器上,也可以實(shí)現(xiàn)虛擬化。

[[426544]]

最近在讀《計(jì)算機(jī)程序的構(gòu)造和解釋》,里面有一句話:代碼必須能夠被人閱讀,只是機(jī)器恰巧可以執(zhí)行。

我也想到了一句話:BUG 一定能夠被人寫出,只是恰好我寫的多而已。

說多了都是淚,來看看我最近遇到的一個(gè)問題。

問題

普通的一天,打開普通的電腦,登錄一臺(tái)普通的服務(wù)器,敲下一條普通的命令。

在我使用命令補(bǔ)全時(shí),出現(xiàn)了一條不普通的提示:

  1. -bash: cannot create temp file for here-document: No space left on device ls -bash 

怎么磁盤滿了?

使用 df -h 一看還真是。

什么原因呢?

解決

首先,查找一下系統(tǒng)里的大文件,看看是哪個(gè)小可愛搞的鬼。

  1. du -sh /* | grep G 

很快就定位到了這個(gè)目錄:/var/lib/docker/containers。

原來是 Docker 這家伙,這個(gè)目錄下存放的都是容器運(yùn)行過程中產(chǎn)生的日志。

使用下面命令來給這些文件按大小排個(gè)序:

  1. du -d1 -h /var/lib/docker/containers | sort -h 
  2.  
  3. 32K    /var/lib/docker/containers/d607c06e475191fff1abd0c2b4b672e7fe8a96cb197f4e8557b18600de2e60af 
  4. 36K    /var/lib/docker/containers/0d4321106721b9d26335fefef7b9e8e23629691684a4da2f953ac8223c8240c3 
  5. 36K    /var/lib/docker/containers/7525aab4aa917aa1016169114762261726ac7b9cc712bef35cdc7035b50d20ce 
  6. 36K    /var/lib/docker/containers/9252e1c373d59ef5613c2b6122eb6e43aa2bd822bd2c199aa67d6eb659c4adb7 
  7. 142M    /var/lib/docker/containers 
  8. 142M    /var/lib/docker/containers/15700ee92cd2831554b9a1e78127df0f07248c1498d35c17525407bc8a98bc1a 

文件名稱就是容器 ID,每個(gè)文件對(duì)應(yīng)一個(gè)容器,也就可以定位到,具體是哪個(gè)容器產(chǎn)生了大量的日志。

使用這個(gè)命令可以將大文件快速清空:

  1. sh -c "cat /dev/null > ${log_file_name}" 

但是清空了文件哪算解決問題,新的日志還在源源不斷往日志里打呢。看了看日志內(nèi)容,很熟悉。前兩天為了調(diào)試程序,剛加的一條 print。

編輯代碼,刪除 print,重啟容器。好了,日志不再瘋狂追加了。

為什么 print 語(yǔ)句將日志都輸出到文件里了呢?別著急,后面再來詳細(xì)介紹。

先處理一下眼前的問題,放任日志無限增長(zhǎng)是肯定不行的,需要有一個(gè)單個(gè)文件大小限制。否則,明天張三再加一條 print,磁盤又滿了。

這里有兩個(gè)方案:

  1. 單一容器配置
  2. 全局配置

單一容器配置

啟動(dòng)容器時(shí),通過參數(shù)來控制日志的文件個(gè)數(shù)和單個(gè)文件的大?。?/p>

  1. docker run -it --log-opt max-size=10m --log-opt max-file=3 redis 

但這樣做是比較麻煩的,更多的采用的是全局配置的方式。

全局配置

編輯 /etc/docker/daemon.json:

  1.     "log-driver":"json-file"
  2.     "log-opts":{ 
  3.         "max-size" :"50m"
  4.         "max-file":"3" 
  5.     } 

重啟 Docker 服務(wù):

  1. systemctl daemon-reload 
  2. systemctl restart docker 

注意: 已存在的容器不會(huì)生效,需要重建才可以。

接下來再說說上文提到的 print 問題。

Docker 日志

Docker 日志分為兩類:

  • Docker 引擎日志(也就是 dockerd 運(yùn)行時(shí)的日志)
  • 容器的日志,容器內(nèi)的服務(wù)產(chǎn)生的日志

引擎日志

Docker 引擎日志一般是交給了 Upstart(Ubuntu 14.04) 或者 systemd (CentOS 7, Ubuntu 16.04)。前者一般位于 /var/log/upstart/docker.log 下,后者一般通過 journalctl -u docker 進(jìn)行查看。

不同系統(tǒng)的位置都不一樣,網(wǎng)上有人總結(jié)了一份列表,我修正了一下,可以參考:

容器日志

使用下面命令可以顯示當(dāng)前運(yùn)行的容器的日志信息:

  1. docker logs CONTAINER 

UNIX 和 Linux 命令有三種輸入輸出,分別是 STDIN、STDOUT 和 STDERR。docker logs 顯示的內(nèi)容包含 STDOUT 和 STDERR。

在生產(chǎn)環(huán)境下,如果我們的應(yīng)用輸出到日志文件里,那么我們?cè)谑褂?docker logs 時(shí)一般收集不到太多重要的信息。

這里來看一下 nginx 和 httpd 是怎么做的:

  • nginx 官方鏡像,使用了一種方式,讓日志輸出到 STDOUT,也就是創(chuàng)建一個(gè)符號(hào)鏈接 /var/log/nginx/access.log 到 /dev/stdout。
  • httpd 使用的是讓其輸出到指定文件,正常日志輸出到 /proc/self/fd/1 (STDOUT) ,錯(cuò)誤日志輸出到 /proc/self/fd/2 (STDERR)。

當(dāng)日志量比較大的時(shí)候,使用 docker logs 來查看日志,會(huì)對(duì) docker daemon 造成比較大的壓力,容易導(dǎo)致容器創(chuàng)建慢等一系列問題。

只有使用了 local 、json-file、journald 日志驅(qū)動(dòng)的容器才可以使用 docker logs 捕獲日志,使用其他日志驅(qū)動(dòng)無法使用 docker logs。

Docker 默認(rèn)使用 json-file 作為日志驅(qū)動(dòng)。

除此之外,Docker 還提供了很多其他日志驅(qū)動(dòng),這里就不過多介紹。還有日志管理方案,我也不是很有經(jīng)驗(yàn),大家如果感興趣的話自己搜搜看吧。

 

責(zé)任編輯:姜華 來源: AlwaysBeta
相關(guān)推薦

2015-09-16 09:57:41

swoolePHP程序員

2021-07-16 07:57:35

SpringBootOpenFeign微服務(wù)

2025-04-22 03:00:00

模型SpringAI

2024-07-04 11:44:02

2015-03-18 09:51:45

2011-10-10 09:22:27

程序員

2018-10-10 15:52:48

程序員代碼編程

2024-08-21 08:22:33

2011-09-26 09:52:04

程序員

2020-03-20 08:00:32

代碼程序員追求

2015-04-03 09:38:32

程序員前人挖坑后人填坑

2018-02-06 08:36:02

簡(jiǎn)歷程序員面試

2018-11-01 15:20:17

前端程序員編程語(yǔ)言

2020-12-11 06:49:04

ELK程序員辭退!

2024-03-14 10:30:05

緩存場(chǎng)景DEMO

2018-03-14 13:32:53

程序員C++JAVA

2018-11-22 10:53:30

程序員技能開發(fā)者

2014-09-26 09:57:41

程序員讀書書籍

2014-08-15 11:07:09

程序員

2019-12-06 17:31:30

程序員人生第一份工作設(shè)計(jì)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)