如何滚动docker中的nginx日志文件(dockernginxdaemonoff)

如何滚动docker中的nginx日志文件(dockernginxdaemonoff)

浏览次数:
信息来源: 用户投稿
更新日期: 2025-12-12
文章简介

docker使用1.dockerps查看运行中的容器2.dockerimages查看docker镜像3.dockerrmid(容器id)删除容器(容器id可以通过dockerps查看

2025阿里云双十一服务器活动

docker使用

  1.dockerps查看运行中的容器

  2.dockerimages查看docker镜像

  3.dockerrmid(容器id)删除容器(容器id可以通过dockerps查看,容器必须停止后才能删除)

    3.1删除全部的容器dockerrm`dockerps-a-q`

  4.dockerstopid(容器id)停止容器运行

  5.dockerrmiid(镜像id)删除镜像

  6.dockerpullubuntu:16.04(镜像名称:版本号)下载镜像

  7.dockerrun-itubuntu:16.04创建并运行容器容器

    -t表示在新容器内指定一个伪终端或终端

    -i表示允许我们对容器内的(stdin)进行交互

    -d在后台运行容器并打印容器id

    7.1dockerrun-ditubuntu:16.04创建并后台运行容器

    7.2dockerrun-ditp8080:8080(主机端口:容器端口)ubuntu:16.04创建并后台运行容器且映射容器的端口

  8.dockerattachid(容器id)进入正在运行中的容器环境

    9.1exit直接退出容器并终止容器运行

    9.2[ctrl+p]+[ctrl+q](快捷键)退出容器,但是不会终止容器运行

  10.dockercommit-m'版本标识'id(容器id)ubuntu:16.04(镜像与版本号)提交镜像且生成镜像(可以通过该命令把搭建好的容器打包成一个新的镜像或者覆盖原镜像(即是修改原镜像内容,生成的镜像名与版本号相同就可以直接覆盖))

nginx官方其实给出了如何滚动日志的说明:

rotatinglog-filesinordertorotatelogfiles,theyneedtoberenamedfirst.afterthatusr1signalshouldbesenttothemasterprocess.themasterprocesswillthenre-openallcurrentlyopenlogfilesandassignthemanunprivilegeduserunderwhichtheworkerprocessesarerunning,asanowner.aftersuccessfulre-opening,themasterprocessclosesallopenfilesandsendsthemessagetoworkerprocesstoaskthemtore-openfiles.workerprocessesalsoopennewfilesandcloseoldfilesrightaway.asaresult,oldfilesarealmostimmediatelyavailableforpostprocessing,suchascompression.

先把旧的日志文件重命名?然后给nginxmaster进程发送usr1信号?nginxmaster进程收到信号后会做一些处理,然后要求工作者进程重新打开日志文件?工作者进程打开新的日志文件并关闭旧的日志文件

其实真正需要我们做的工作只有前面两点!

假设你的系统中已经安装好了docker,这里我们直接运行一个nginx容器:

-v$(pwd)/logs/nginx:/var/log/nginx\

nginx:1.11.3如何滚动docker中的nginx日志文件,dockernginxdaemonoff

把下面的内容保存到test.sh文件中:

for((i=1;i<=100000;i++))

curlhttp://localhost>/dev/null

done

然后运行这个脚本,就可以模拟产生连续的日志记录。

创建rotatelog.sh文件,其内容如下:

tz='asia/chongqing'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命令向nginxmaster进程发送usr1信号。

通过下面的命令为rotatelog.sh文件添加可执行权限并复制到$(pwd)/logs/nginx目录下:

$sudocprotatelog.sh$(pwd)/logs/nginx

定时执行滚动操作

我们的nginx运行在容器中,所以需要在容器中给nginxmaster进程发送usr1信号。因此我们需要通过dockerexec命令在mynginx容器中执行rotatelog.sh脚本:

执行一次上面的命令,会如期产生一批新的日志文件:

下面我们把这个命令配置在定时任务中,让它每天早上1点钟执行一次。执行crontab-e命令,并在文件的末尾添加下面的行:

保存并退出就可以了。下图是笔者测试过程中每5分钟滚动一次的效果:

为什么不在宿主机中直接mv日志文件?

理论上这么做是可以的,因为通过绑定挂载的数据卷中的内容从宿主机上看和从容器中看都是一样的。但是真正这么做的时候你很可能碰到权限问题。在宿主机中,你一般使用的是普通用户,而在容器中产生的日志文件的所有者是会是特殊的用户,并且一般不会给其它用户写和执行的权限:

当然,如果你在宿主机中使用的是root用户就不会有问题。

能从宿主机中发送的信号吗?

其实这个问题的全称应该是:能从宿主机中给docker容器中的nginxmaster进程发送信号吗?

向容器中的1号进程(nginxmaster)发送usr1信号(这种方式只能向1号进程发送信号):

结合上面的两个问题,我们可以写出另外的一种方式来滚动docker中的nginx日志。这种方式不需要通过dockerexec命令在容器中执行命令,而完全在宿主机中完成所有的操作:

先重命名容器数据卷中的日志文件?给容器中的1号进程发送usr1信号

以上就是如何滚动docker中的nginx日志文件的详细内容,更多请关注主机测评网其它相关文章!

标签:
我的业务需要多少台服务器(一个企业需要多少服务器)
« 上一篇
返回列表
下一篇 »

如本文对您有帮助,就请抽根烟吧!