君は春の中にいる、かけがえのない春の中にいる.

你驻足于春色中,于那独一无二的春色之中.

再探Docker-日志收集

一次Docker项目需求构架的尝试

0x01 方法选择

当我们的Docker部署完成后,为了能够掌握Docker的状态,除了使用logs、event、diff等实时运维命令查看外,我们还存在需要对Docker产生的日志进行收集整理分析的必要。

网上能找到的日志收集系统有很多,例如Flume、Fluentd、Logstash等等。经过一段时间的摸索搭建,个人最容易搭建成功的是Logstash,而且整个ELK体系也提供一套完整的日志收集、存储、查找、可视化流程,可以省去很多编写中间件的精力。

0x02 调试

所以最终我的整体架构如下:

docker1\
        \
docker2——————>docker-logstash————>任意机器(可以不是宿主机)
        /
docker3/

ELK一整套工具可以很方便的从Elastic的官网上下到,在这里就不在赘述。在任意一台主机上安装Elasticsearch和Kibana,在宿主机上安装不同的Docker以及一个Logstash的Docker。这里我使用我在上一篇博客中编译好的Wordpress的Docker。不同的是我需要将WP中记录日志的文件夹挂载到logstash-docker上。命令如下:

1
docker run -d -v /var/log/nginx/ --name wordpress -p 0.0.0.0:80:80 long/wordpress

简单解释一下这条命令,我们运行了之前编译好的Wordpress,将其中的Nginx下的日志挂载出来。

接下来,我们再从官网仓库中pull下Docker版的Logstash,使用如下命令开启:

1
docker run -it --rm --volumes-from wordpress -v "$PWD":/home  logstash logstash -f /home/test.conf

这里有几个坑要事先声明一下,一个是这里我使用了Logstash的配置文件,而这个配置文件我是从宿主机挂载到容器的home文件夹下,另一个点就是Logstash容器从Wordpress中接手之前挂载的文件夹,从里面实时增量读取日志,但是两个容器的权限不对应,所以要注意在Wordpress容器对相应的文件夹做权限变更。

Logstash的配置文件我写法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
input {
file {
path => "xxxx"
start_position => beginning
}
}
filter {

}

output {
stdout { }
}

从日志中读取信息,打印在标准输出中。

这一步调试成功后,我们接着调试Elastic的部分,Elastic+Kibana我是运行在一台Windows的主机上的,运行前调整Elastic的配置文件中的,使得宿主机可以访问到它,当然这里的访问是没有任何认证的,但是作为测试,我们先不讨论安全问题。

通过windows主机访问宿主机上的Wordpress-docker,然后访问

此时,宿主机中容器的日志已经显示在了Windows的主机中。

0x03 总结

利用这种方式,我们实现了容器日志传输到任意主机上存储的目的,而日志传输则是通过在多个容器之间挂载目录实现。这样做,可以很好的实现应用、日志(或数据)之间的解耦合,将重要日志存储在更安全的实体主机上,便于实现中心对应分布的日志分析。