Docker容器应用日志查看

首先了解下Docker中的日志类型,它分为两种:一种时Docker自身运行时产生的日志,另一种是Docker容器应用产生的日志。本文主要关注后者,即容器应用产生的日志如何查看。

docker日志内容类型

Docker Daemon的日志

即Docker自身运行产生的日志,根据你系统的不同,存放在不同的位置。就不一一赘述了,详情可以看Where is the Docker daemon log?

Docker Container的日志

即Docker容器应用产生的日志,Docker是将标准输出和标准错误以json格式存放在容器的日志文件中。它存放在/var/lib/docker/container目录下。如下图所示:
这里写图片描述
下面每个目录名是以容器的id来命名,通过docker ps查看你应用的id,找到后进入对应的日志目录。可以看到它的结构为:

|- d448947acaa453893ca0210590ab87048c326666c9ffc94f571e3b777342564d
    |- d448947acaa453893ca0210590ab87048c326666c9ffc94f571e3b777342564d.log
    |- hostname
    |- mounts
    |- resolv.conf.hash
    |- config.v2.json
    |- hostconfig.json
    |- hosts
    |- resolv.conf

Docker logs的实现原理

那么Docker是如何实现这些呢,从《Docker源码分析》中了解,Docker daemon是docker架构中一个常驻在后台的系统进程,它在后台启动了一个server,server负责接收Docker client发送的请求,接受请求后,server通过路由与分发调度,找到相应的Handler来执行请求。
当我们输入docker logs的时候会转化为docker client向Docker Daemon发起请求,Docker Daemon在运行容器时会去创建一个协程(goroutine),绑定了整个容器内所有进程的标准输出文件描述符。因此容器内应用的所有只要是标准输出日志,都会被goroutine接收,Docker Daemon会根据容器id和日志类型读取日志内容,最终会输出到用户终端。
这里写图片描述
从图中可以看出,Docker logs是和容器绑定的,它随着容器的产生而产生,随着容器的删除而删除。

Docker容器日志文件的查看

现在已经了解了Docker日志文件的位置,现在看看如何查看。用两个方法来查看docker的日志。

docker logs命令

Usage: docker logs [OPTIONS] CONTAINER
Fetch the logs of a container
Options:
     --details        Show extra details provided to logs
  -f, --follow         Follow log output
      --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
      --tail string    Number of lines to show from the end of the logs (default "all")
  -t, --timestamps     Show timestamps
      --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)

所以可以通过docker logs --tail -f [容器id]可以快速查看日志,但是这种方法并不能一直处于交互模式,每次查看时需要不停的输入命令。

docker exec命令

Usage:  docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Run a command in a running container

Options:
  -d, --detach               Detached mode: run command in the background
      --detach-keys string   Override the key sequence for detaching a container
  -e, --env list             Set environment variables
  -i, --interactive          Keep STDIN open even if not attached
      --privileged           Give extended privileges to the command
  -t, --tty                  Allocate a pseudo-TTY
  -u, --user string          Username or UID (format: <name|uid>[:<group|gid>])
  -w, --workdir string       Working directory inside the container

这种方式可以在运行的容器中执行命令。先通过docker exec -it [容器id] sh命令,进入到你想要查看的容器中,然后查看你工程中设置的日志文件。

参考文章:

  1. 从敲下docker logs开始理解docker日志原理
  2. 深扒GO日志 | (二)简析Docker日志-上
  3. 「Allen 谈 Docker 系列」之 docker logs 实现剖析

猜你喜欢

转载自blog.csdn.net/benben_2015/article/details/80708723