首頁 > 運維 > Nginx > 主體

怎麼滾動docker中的nginx日誌

WBOY
發布: 2023-05-29 21:40:04
轉載
1182 人瀏覽過

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 自己沒有處理日誌的滾動問題,它把這個球踢給了使用者。一般情況下,你可以使用 logrotate 工具來完成這個任務,或者如果你願意,你可以寫各式各樣的腳本完成同樣的任務。本文筆者介紹如何滾動運行在 docker 中的 nginx 日誌檔案(下圖來自互聯網)。 怎麼滾動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 stm and master process will then re-open all currently open logm , as unsign user under which the worker processes 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 old files right away. as 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 向容器中進程發送訊號的 kill 指令。我們可以透過指令:

$ 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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!