docker容器中nginx日志的分割

之前写过一篇在宿主机上的nginx日志分割,现在应为项目运行在docker容器里面,但是容器中并不像宿主机那样安装了crontab定时任务,虽然可以将crontab打包进镜像,但是应为项目没有打包进去,所以只能只能选择其他的解决方案了。

下面我来说明一下这边的解决方案:

在创建好镜像以后,还需要通过docker run 命令来运行生成的镜像文件。但是run就需要通过参数来设置容器的一系列配置。我这里选择的是容器的host网络模式:

什么是host网络模式:简单的来说就是使用宿主机的ip地址,但是使用不同的端口区分不同的容器。这样错的好处一个是可以通过lsof 工具操作,另一个不用修改太多次。

来说一下我的操作过程:

1:docker build -t imagesName . 创建镜像

2:docker run  imagesName -d --name=myname --net=host  -v $(pwd)/logs/nginx:/var1/log/nginx imagesName

来说明以下:-d 就是后台运行的意思。

--name就是运行名字的容器。

--net指定host网络模式

-v 把 nginx 的日志绑定挂载到了当前目录下的 logs 目录下,这是后会在当前路径下创建一个logs文件夹

 注意:/var/log/nginx/access.log是一样的。只不过是挂在的路径不一样

3:编写一个脚本

#!/bin/bash
mv /var/log/nginx/access.log /var/log/nginx/access.log
mv /var/log/nginx/error.log /var/log/nginx/error.log
kill -USR1 `cat /var/run/nginx.pid`

将脚本添加到当前路径的logs/nginx路径下。

4:docker exec 容器ID bash $(pwd)/logs/nginx/脚本命令执行后,或在当前路径logs/nginx目录下出现容器中的日志文件。

5:后续就可以使用宿主机的crontab定时任务了。

* * * * *  docker exec 容器ID bash $(pwd)/logs/nginx/脚本

 这份文档同样也适用于openresty,亲测有效。

如果要是使用其他微服务需要用户自己去解决

来补充一下lighttpd微服务的docker容器日志分割,基本和上面的操作是一致的,需要将分割脚本中的mv改成cp后然后使用echo将空值重新写道容器中的日志文件中,如果使用kill杀掉httpd进程的话,需要重启docker了,这样可以避免容器的重新启动。

docker_mount(){
        cp /usr/local/sunsi/third/lighttpd/log/access.log /var/log/lighttpd/access.${datestring}.log
        cp /usr/local/sunsi/third/lighttpd/log/error.log /var/log/lighttpd/error.${datestring}.log
        #kill -USR1 `cat /usr/local/si/th/ngi/logs/nginx.pid`
        echo >> /usr/local/sunsi/third/lighttpd/log/access.log
        echo >> /usr/local/sunsi/third/lighttpd/log/error.log
}

 如上代码所示。欢迎提问和指正

posted @ 2020-06-22 15:51  first_semon  阅读(3024)  评论(1编辑  收藏  举报