首頁 >運維 >Nginx >如何滾動docker中的nginx日誌文件

如何滾動docker中的nginx日誌文件

WBOY
WBOY轉載
2023-05-28 20:22:041107瀏覽

docker使用

  1.docker ps 查看運行中的容器

  2. docker images 查看docker映像

  3. docker rm id 查看docker映像

  3. (容器id)  刪除容器(容器id可以透過docker ps查看,容器必須停止後才能刪除)

    3.1 刪除全部的容器docker rm `docker ps -a -q`

  444444444444 。

  7. docker run -it ubuntu:16.04 建立並執行容器容器

    -t 表示在新容器內指定一個偽終端或終端機

  -t 表示在新容器內指定一個偽終端或終端機

 -i對容器內的(stdin) 進行互動

    -p 指定映射埠

    -d 在後台運行容器並列印容器id

     7.建立並後台運行容器

    7.2 docker run -ditp 8080:8080(主機連接埠:容器連接埠) ubuntu:16.04 建立並後台運行容器且映射容器的連接埠

 ach8. (容器id) 進入正在運作中的容器環境

  9.退出容器

    9.1 exit 直接退出容器並終止容器運作

    9.2 [ctrl p] [

rlC.2 [ctrl p] [ct ](快捷鍵) 退出容器,但不會終止容器運行

  10. docker commit -m'版本標識' id(容器id) ubuntu:16.04(鏡像與版本號)   提交鏡像且產生鏡像(可以透過這個指令把搭建好的容器打包成一個新的鏡像或覆寫原始鏡像(即是修改原始鏡像內容,產生的鏡像名稱與版本號相同就可以直接覆寫))

如何滾動docker中的nginx日誌文件

思路


##nginx 官方其實給如何捲動日誌的說明:


rotating log-files
in order to rotate log files, they need to be renamed first. after that usr1 signal should be sent to the master process. the master process will then re-open all currently open log files and assign themleg y re-open all currently open log files and assign themleg unna are running, as an owner. after successful re-opening, the master process closes all open files and sends the message to worker process to ask them to re-open files. worker processes also open new files andclose older processes also a result, old files are almost immediately available for post processing, such as compression.


這段說明的大意是:


•先把舊的日誌檔案重命名
•然後給nginx master 程序發送usr1 信號
•nginx master 程序收到信號後會做一些處理,然後要求工作者程序重新打開日誌文件

•工作者進程打開新的日誌文件並關閉舊的日誌檔案

其實真正需要我們做的工作只有前面兩點!

建立測試環境

假設你的系統中已經安裝好了docker,這裡我們直接執行一個nginx 容器:

$ docker run -d \
 -p 80:80 \
 -v $(pwd)/logs/nginx:/var/log/nginx \
 --restart=always \
 --name=mynginx \
 nginx:1.11.3

注意,我們把nginx 的日誌綁定掛載到了目前目錄下的logs 目錄下。

把下面的內容儲存到 test.sh 檔案中:

#!/bin/bash
for ((i=1;i<=100000;i++))
do
 curl http://localhost > /dev/null
 sleep 1
done

然後執行這個腳本,就可以模擬產生連續的日誌記錄。

建立滾動日誌的腳本

建立rotatelog.sh 文件,其內容如下:

#!/bin/bash
getdatestring()
{
 tz=&#39;asia/chongqing&#39; date "+%y%m%d%h%m"
}
datestring=$(getdatestring)
mv /var/log/nginx/access.log /var/log/nginx/access.${datestring}.log
mv /var/log/nginx/error.log /var/log/nginx/error.${datestring}.log
kill -usr1 `cat /var/run/nginx.pid`

getdatestring 函數取當前的時間並格式化為字串,例如"201807241310 ",筆者比較喜歡用日期和時間來命名文件。注意這裡透過 tz='asia/chongqing' 指定了時區,因為預設格式化的是 utc 時間,用起來怪怪的(要實時腦補 8 小時)。下面的兩個 mv 指令用來重新命名日誌檔。最後透過 kill 指令向 nginx master 程序發送 usr1 訊號。

透過下面的命令為rotatelog.sh 檔案新增可執行權限並複製到$(pwd)/logs/nginx 目錄下:

$ chmod +x rotatelog.sh
$ sudo cp rotatelog.sh $(pwd)/logs/nginx
定時執行滾動操作

我們的nginx 運行在容器中,所以需要在容器中給nginx master 程序發送usr1 訊號。因此我們需要透過docker exec 指令在mynginx 容器中執行rotatelog.sh 腳本:

$ docker exec mynginx bash /var/log/nginx/rotatelog.sh

執行一次上面的指令,會如期產生一批新的日誌檔:

如何滾動docker中的nginx日誌文件

#下面我們把這個指令配置在定時任務中,讓它每天早上1 點鐘執行一次。執行crontab -e 指令,並在檔案的末端加入下面的行:

* 1 * * * docker exec mynginx bash /var/log/nginx/rotatelog.sh

如何滾動docker中的nginx日誌文件

#####

儲存並退出就可以了。下圖是筆者測試過程中每 5 分鐘滾動一次的效果:

如何滾動docker中的nginx日誌文件

#為什麼不在宿主機中直接 mv 日誌檔案?

理論上這麼做是可以的,因為透過綁定掛載的資料卷中的內容從宿主機上看和從容器中看都是一樣的。但是真正這麼做的時候你很可能碰到權限問題。在宿主機中,你一般使用的是普通用戶,而在容器中產生的日誌檔案的擁有者是會是特殊的用戶,並且一般不會給其它用戶寫和執行的權限:


如何滾動docker中的nginx日誌文件

#當然,如果你在宿主機中使用的是root 使用者就不會有問題。

能從宿主機發送的訊號嗎?

其實這個問題的全名應該是:能從宿主機中傳送訊號給 docker 容器中的 nginx master 程序嗎?

答案是,可以的。

我們可以透過指令:

$ docker container kill mynginx -s usr

#到容器中的1 號行程(nginx master )發送usr1 訊號(這種方式只能傳送訊號給1 號程序):

如何滾動docker中的nginx日誌文件

結合上面的兩個問題,我們可以寫出另外的一種方式來滾動docker 中的nginx 日誌。這種方式不需要透過docker exec 指令在容器中執行指令,而完全在宿主機中完成所有的操作:

•先重新命名容器資料卷中的日誌檔案
•給容器中的1 號程序發送usr1 訊號

以上是如何滾動docker中的nginx日誌文件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除