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 }
如上代码所示。欢迎提问和指正