首先了解下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
命令,进入到你想要查看的容器中,然后查看你工程中设置的日志文件。