我刚刚开始使用 Docker 和 richt,现在我正在尝试弄清楚如何设置我的第一个 dockerized Apache 2 / PHP 环境。到目前为止,我一直在使用完整的 Linux VM,其中我使用写入 /var/log/apache2 的日志文件,然后每天使用“logrotate”跳转到新文件。
日志文件主要用于即时错误检测(即登录到服务器并使用less打开当前的access.log和error.log文件)和fail2ban。
如果我没记错的话,这在 Docker 环境中是不可行的 - 主要是因为你通常无法登录容器来查看日志。而且如果删除容器,日志也会丢失。
那么:在这种情况下,处理/模拟/替换 access.log/error.log 的最常用方法是什么?生产和开发环境的常见解决方案是什么?
到目前为止,我的想法包括使用 NFS 共享(速度很慢,如果不小心可能会导致文件名冲突),以及日志存储(不确定它是否值得付出努力并且对于较小的站点甚至开发环境是否可行?)但我相信聪明人已经想出了更好的解决方案?
不确定这是否有区别,但目前我的 Docker 镜像基于php:5.6-apache。
答案1
您仍然可以使用docker exec -it <your container name> /bin/bash
命令进入容器并执行常规工作。或者您可以更改/bin/bash
为命令或.sh
命令脚本来执行它。
要将文件从容器中取出,请使用docker cp <container name:/path/to/file> </your local machine/path/>
对于日常工作,您可以使用cron
cronjob 来执行这些命令。我强烈建议您为常用的 docker 命令设置别名。这样我就可以用几个键愉快地使用 docker。
该docker logs <container name/id>
命令用于查看 docker 镜像执行的日志。它显示重定向输出到 stdout。
答案2
在Apache HTTPd的配置文件中,可以添加:
CustomLog /dev/stdout combined
ErrorLog /dev/stderr
要查看日志,请使用以下命令:
docker logs CONTAINER_ID
答案3
如何将访问和错误日志写入 stderr 和 stdout?
https://gist.github.com/afolarin/a2ac14231d9079920864
运行 ln -sf /dev/stdout /var/log/nginx/access.log
运行 ln -sf /dev/stderr /var/log/nginx/error.log
集中记录麋鹿可以实现更主动的监控。不过你自己已经想到了这一点。
答案4
也许在提出问题时此功能尚不存在,但使用 run 的 -v 参数,您可以将主机上的目录挂载到容器中的目录中。
docker run -v [host_dir]:[container_dir]
这样,当容器被删除时,日志(或其他)文件将保留下来,并且您可以访问这些文件,就好像 apache 安装在主机上而不是容器中一样。
或者,您可以以某种方式将修改后的日志文件推送到中央位置。Kibana 堆栈使用 filebeat 来实现这一点,但如果您不关心堆栈的其余部分,应该可以独立运行 filebeat。