运行在容器内部的应用会在运行期间产生大量的日志,这些日志将作为我们 Debug,分析应用行为的重要依据。本文将带大家了解一下 Docker 面对的和「容器日志」有关的问题以及它的解决方案。
回想一下 Docker 的实现原理,无非是「多进程」+「隔离机制」。其中所有容器(子进程)都是由 dockerdaemon(父进程)来创建的。父进程可以收集子进程 PID Namespace 内 PID=1 进程的和标准输出的内容。因为只有 PID = 1的进程才是父进程创建的。如果该 PID = 1的子进程再创建孙子进程的话,父进程是无法收集到孙子进程内的标准输出的内容的。
父进程是通过 Pipe 来获取子进程的和标准输出的。所以,在容器进程被创建的时候,会通过一个 Pipe 将输出到标准输出的日志信息传递给父进程。而这一切对容器内部应用都是透明的。
当 dockerdaemon 进程从 Pipe 中拿到日志信息之后,会将它交给一个特殊的模块来进行处理—— Docker Log Driver。Log Driver 的职责也很简单,既然收集到了日志信息,那肯定需要将它写入到一个位置,这个位置可以是一个 JSON 格式的文件(默认行为),也可以是一个有特殊含义的文件,如 syslog,甚至是一个第三方日志的收集服务。