看到这篇关于docker daemon调试的官方文档,觉得对从事docker的同学很有帮助。于是捡起丢了好几年的大学英语翻译,以便中文的同学方便。如有不准确的地方请不吝指出。
原版英文地址:https://docs.docker.com/engine/admin/#force-a-stack-trace-to-be-logged
摘要:
通常我们可以打开docker daemon的debug选项来获docker的运行动态,以对可能出现的问题进行调试。如果daemon已经没有了反应,可以给docker daemon发送 SIGUSR 信号来“force a full stack trace ” docker daemom的堆栈。一、Out Of memroy Exceptions (OOME)
如果容器申请使用超过自己可用内存的大小,那么就可能引发OOME。这会导致内核杀掉一个容器或者docker daemon。因此我们需要为容器分配适量的内存,以防止这种情况发生,想要了解OOME的厉害,请看:https://docs.docker.com/engine/admin/resource_constraints/#memory二、日志
Docker daemom的日志可以帮助我们诊断问题。不同的系统docker daemom的日志也存放在不同的地方,通常日志存放位置为:
Operating system | Location |
RHEL, Oracle Linux | /var/log/messages |
Debian | /var/log/daemon.log |
Ubuntu 16.04+, CentOS | Use the command journalctl -u docker.service |
Ubuntu 14.10- | /var/log/upstart/docker.log |
macOS | ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/console-ring |
Windows | AppData\Local |
三、Debug
有两种方式来使能debugging。3.1 在daemon.json文件中设置debug=true
这种方法适用于各种平台系统,同时也是推荐的方法。1.编辑daemon.json文件。通常情况下daemon.json放在/etc/docker目录下,如果没有这个文件,可以手动创建一个。
2.如果daemon文件没有内容,则在文件中添加如下内容:
{
"debug": true
}
如果文件中已经包含JSON格式的“key/value”内容,则在里面添加一项"debug":true。添加时需要注意,如果添加的这行不是最后一行,需要在添加的这行行末加一个逗号","。
同时,如果有“log-level”这个key存在则检查它的value是否是"info"或者"debug"。其中“info"是默认的调试级别,其他可选的级别有debug, info, warn, error, fatal。
3.给daemon发送HUP信号以重新加载配置。linux下的操作如下:
$ sudo kill -SIGHUP $(pidof dockerd)
如果是Windows系统,则重启docker。
3.2 使用“-D”选项
除了上面的方法打开daemon的调试选项,还可以stop docker daemon,然后使用 -D选项重启。linux中如下:$ sudo dockerd -D
然而,停掉daemon再重启很可能会造成前后两次的运行环境发生改变,这就会增加调试的准备性和难度。
四、Force a stack trace to be logged
如果daemo没有了响应,可以发送 SIGUSR1信号来获取daemon的堆栈回溯信息。Linux系统:
$ sudo kill -SIGUSR1 $(pidof dockerd)
Windows Server:
下载 docker-signal(https://github.com/jhowardmsft/docker-signal).
使用--pid=<PID of daemon>标志运行下载的程序。
这种方法可以在不停止daemon的情况下获取到堆栈回溯信息,它在接收SIGUSR1信号并打印出堆栈回溯日志后继续处理它的事情。
堆栈回溯信息可以方便我们观察函数调用流程和线程信息。
五、Check whether Docker is running
有多种检查docker运行状态的方法:
1.与系统无关的检查方式是使用命令"docker info";
2.使用系统相关的接口来查看,如:
$ sudo systemctl is-active docker
or
$ sudo status docker
or
$ sudo service docker status
or
使用Windows 提供的接口来检查服务状态。
3.直接查看daemon相关的进程情况
使用ps或者top命令查看docker daemon进程是否存在。