Docker 容器日志管理最佳实践

作者:微信小助手

发布时间:2020-03-31T10:21:52

点击蓝色“架构文摘”关注我哟

加个“星标”,每天上午 09:25,干货推送!

本文所有内容基于:

Docker-CE
Server Version: 18.09.6
Storage Driver: overlay2
Kernel Version: 3.10.0-862.el7.x86_64
Operating System: CentOS Linux 7 (Core)

Docker  日志分为两类:

  • Docker 引擎日志(也就是 dockerd 运行时的日志),

  • 容器的日志,容器内的服务产生的日志。

一 、Docker 引擎日志

Docker 引擎日志一般是交给了 Upstart(Ubuntu 14.04) 或者 systemd (CentOS 7, Ubuntu 16.04)。前者一般位于 /var/log/upstart/docker.log 下,后者我们一般 通过  journalctl -u docker  来进行查看。

| 系统                   | 日志位置                                                     |
|
 ---------------------- | ------------------------------------------------------------ |
| Ubuntu(14.04)          | `/var/log/upstart/docker.log`                                |
|
 Ubuntu(16.04)          | `journalctl -u docker.service`                               |
| CentOS 7/RHEL 7/Fedora | `journalctl -u docker.service`                               |
|
 CoreOS                 | `journalctl -u docker.service`                               |
| OpenSuSE               | `journalctl -u docker.service`                               |
|
 OSX                    | `~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/log/d‌ocker.log` |
| Debian GNU/Linux 7     | `/var/log/daemon.log`                                        |
|
 Debian GNU/Linux 8     | `journalctl -u docker.service`                               |
| Boot2Docker            | `/var/log/docker.log`                                        |

以上内容来自:https://blog.lab99.org/post/docker-2016-07-14-faq.html

二、容器日志

2.1、常用查看日志命令——docker logs

docker logs CONTAINER 显示当前运行的容器的日志信息, UNIX 和 Linux 的命令有三种 输入输出,分别是 STDIN(标准输入)、STDOUT(标准输出)、STDERR(标准错误输出),docker logs  显示的内容包含 STOUT 和 STDERR。在生产环境,如果我们的应用输出到我们的日志文件里,所以我们在使用  docker  logs 一般收集不到太多重要的日志信息。

  • nginx 官方镜像,使用了一种方式,让日志输出到 STDOUT,也就是 创建一个符号链接 /var/log/nginx/access.log/dev/stdout

  • httpd 使用的是 让其输出到指定文件 ,正常日志输出到 /proc/self/fd/1 (STDOUT) ,错误日志输出到 /proc/self/fd/2 (STDERR)。

  • 当日志量比较大的时候,我们使用 docker logs   来查看日志,会对 docker daemon 造成比较大的压力,容器导致容器创建慢等一系列问题。

  • 只有使用了 `local 、json-file、journald`  的日志驱动的容器才可以使用 docker logs 捕获日志,使用其他日志驱动无法使用 `docker logs`

2.2 、Docker 日志 驱动

Docker 提供了两种模式用于将消息从容器到日志驱动。

  • (默认)拒绝,阻塞从容器到容器驱动

  • 非阻塞传递,日志将储存在容器的缓冲区。

当缓冲区满,旧的日志将被丢弃。

在 mode 日志选项控制使用 blocking(默认) 或者 non-blocking, 当设置为 non-blocking 需要设置 max-buffer-size 参数(默认为 1MB)。

支持的驱动

|                                                              | 描述                                                         |
| :----------------------------------------------------------- | :----------------------------------------------------------- |
`none`                                                       | 运行的容器没有日志,`docker logs`也不返回任何输出。          |
| [`local`](https://docs.docker.com/config/containers/logging/local/) | 日志以自定义格式存储,旨在实现最小开销。                     |
| [`json-file`](https://docs.docker.com/config/containers/logging/json-file/) | 日志格式为JSON。Docker的默认日志记录驱动程序。               |
| [`syslog`](https://docs.docker.com/config/containers/logging/syslog/) | 将日志消息写入`syslog`。该`syslog`守护程序必须在主机上运行。 |
| [`journald`](https://docs.docker.com/config/containers/logging/journald/) | 将日志消息写入`jou