默认情况下,service docker start或docker -d,docker后台进程默认会在当前终端输出日志,回车几下又可以获得shell,继续执行其他命令,然而当docker有日志需要输出到屏幕时,会再次进入到日志输出,很不方便。
使用docker -d > /path/to/log/file,把docker的日志输出重定向到文件。
同时你应该修改 /etc/init.d/docker 的代码,把 start-stop-daemon 的输出也重定向。
当你运行一个容器,容器的状态存活在 /var/lib/docker/containers/<id>下,例如
root@precise64:/var/lib/docker/containers/fe38c4124f36d0a5b2a38ea7dd58fe88ac92980286f1f6a7b7ed3ced7c994374# ls -la
total 44
drwx------ 3 root root 4096 Mar 14 19:56 .
drwx------ 83 root root 12288 Mar 14 21:53 ..
-rw-r--r-- 1 root root 106 Mar 14 19:56 config.env
-rw-r--r-- 1 root root 1522 Mar 14 19:56 config.json
-rw------- 1 root root 241 Mar 14 19:56 fe38c4124f36d0a5b2a38ea7dd58fe88ac92980286f1f6a7b7ed3ced7c994374-json.log
-rw-r--r-- 1 root root 126 Mar 14 19:56 hostconfig.json
-rw-r--r-- 1 root root 13 Mar 14 19:56 hostname
-rw-r--r-- 1 root root 181 Mar 14 19:56 hosts
drwxr-xr-x 2 root root 4096 Mar 14 19:56 root
文件 e38c4124f36d0a5b2a38ea7dd58fe88ac92980286f1f6a7b7ed3ced7c994374-json.log 是容器的日志文件。每一行是一个 JSON 对象并且对于容器输入和输出的每一行这有一个界限。
{"log":"root@c835298de6dd:/# ls\r\n","stream":"stdout","time":"2014-03-14T22:15:15.155863426Z"}
{"log":"bin boot dev\u0009etc home lib\u0009lib64 media mnt opt\u0009proc root run sbin selinux\u0009srv sys tmp usr var\r\n","stream":"stdout","time":"2014-03-14T22:15:15.194869963Z"}
可通过编写或使用数据收集器,解析日志文件的json对象,并把数据收集到特定的地方。在一个在线环境,实际的日志内容可以被发送到一个 elasticsearch 集群,并使用 kibana 或 graylog2 查看。二选一,这也有使用 JSON 工作的主机服务。
这个方法提供了一下好处:
主机可以使用一个单独的收集 agent 转发任何容器的日志到一个中央日志服务器.
不需要要求应用程序使用 syslog 或是写日志到特定的卷。
主机可以访问容器日志以及任何在容器文件系统上的日志文件。
主机可以为容器轮转日志。
这个方法的一个缺点就是它直接访问 docker 文件系统而没有使用 API,这意味着它在未来可能出现问题,因为如果未来 docker 版本改变了它怎样在主机文件系统存储容器日志的话。
使用docker -d > /path/to/log/file,把docker的日志输出重定向到文件。
同时你应该修改 /etc/init.d/docker 的代码,把 start-stop-daemon 的输出也重定向。
当你运行一个容器,容器的状态存活在 /var/lib/docker/containers/<id>下,例如
root@precise64:/var/lib/docker/containers/fe38c4124f36d0a5b2a38ea7dd58fe88ac92980286f1f6a7b7ed3ced7c994374# ls -la
total 44
drwx------ 3 root root 4096 Mar 14 19:56 .
drwx------ 83 root root 12288 Mar 14 21:53 ..
-rw-r--r-- 1 root root 106 Mar 14 19:56 config.env
-rw-r--r-- 1 root root 1522 Mar 14 19:56 config.json
-rw------- 1 root root 241 Mar 14 19:56 fe38c4124f36d0a5b2a38ea7dd58fe88ac92980286f1f6a7b7ed3ced7c994374-json.log
-rw-r--r-- 1 root root 126 Mar 14 19:56 hostconfig.json
-rw-r--r-- 1 root root 13 Mar 14 19:56 hostname
-rw-r--r-- 1 root root 181 Mar 14 19:56 hosts
drwxr-xr-x 2 root root 4096 Mar 14 19:56 root
文件 e38c4124f36d0a5b2a38ea7dd58fe88ac92980286f1f6a7b7ed3ced7c994374-json.log 是容器的日志文件。每一行是一个 JSON 对象并且对于容器输入和输出的每一行这有一个界限。
{"log":"root@c835298de6dd:/# ls\r\n","stream":"stdout","time":"2014-03-14T22:15:15.155863426Z"}
{"log":"bin boot dev\u0009etc home lib\u0009lib64 media mnt opt\u0009proc root run sbin selinux\u0009srv sys tmp usr var\r\n","stream":"stdout","time":"2014-03-14T22:15:15.194869963Z"}
可通过编写或使用数据收集器,解析日志文件的json对象,并把数据收集到特定的地方。在一个在线环境,实际的日志内容可以被发送到一个 elasticsearch 集群,并使用 kibana 或 graylog2 查看。二选一,这也有使用 JSON 工作的主机服务。
这个方法提供了一下好处:
主机可以使用一个单独的收集 agent 转发任何容器的日志到一个中央日志服务器.
不需要要求应用程序使用 syslog 或是写日志到特定的卷。
主机可以访问容器日志以及任何在容器文件系统上的日志文件。
主机可以为容器轮转日志。
这个方法的一个缺点就是它直接访问 docker 文件系统而没有使用 API,这意味着它在未来可能出现问题,因为如果未来 docker 版本改变了它怎样在主机文件系统存储容器日志的话。