logspout 收集docker宿主机上所有运行的容器的log,并将其路由到log收集系统
使用场景:在Docker宿主机上运行logspout容器,然后将log路由到ELK的Logstash,Logstash在整理log并将其发送给ES
使用的命令:
docker run -d --name=logspout --env DEBUG=1 --publish=127.0.0.1:8000:80 --volume=/var/run/docker.sock:/var/run/docker.sock gliderlabs/logspout syslog+udp://192.168.56.101:55555
docker run -d --name logstash -p 55555:55555/udp 55555:55555/tcp logstash
发现问题:在同一台机器上运行上述两个容器的时候发现 logspout始终无法连接 Logstash
ping可以ping通,但是始终无法连接
问题原因: Logstash使用iptables的port转发来接收所有发送给55555的数据包,但是这个iptable是宿主机的配置,这时在 logspout容器内是无法直接访问 宿主机IP:55555 的。
问题解决:参考docker的--link 参数,将两个容器连接起来,将被连接的容器的IP加入到连接容器的host中这个特性,将启动 logspout的命令转换为如下问题就完美解决了。
docker run -d --name=logspout --link logstash --env DEBUG=1 --publish=127.0.0.1:8000:80 --volume=/var/run/docker.sock:/var/run/docker.sock gliderlabs/logspout syslog+udp://logstash:55555
收获:更加深入的理解了--link的用法和机制