2017-06-13 38 views
2

我有一个使用嵌入式数据库,并生成日志和原始指标到以下目录结构的应用程序:数据库,日志泊坞窗卷容器和指标

/opt/myapp/data/ 
    database/ 
    logs/ 
    raw_metrics/ 

我在学习泊坞窗的过程中,我试图“Dockerize”这个程序,我试图找到实现以下目标对我来说是安装/体积的解决方案:

  • 嵌入式数据库存储在相同的安装量,无论myapp多少容器实例我已经跑步了。换句话说,所有容器实例都将其数据写入共享的卷database/;和
  • 我也更喜欢我的日志和原始指标(即:所有容器实例将日志/指标写入同一个共享卷)相同,除了这里,我需要能够区分每个日志和指标数据容器。换句话说,我需要知道容器X生成了特定的日志消息,或者容器Y在7秒内响应了请求,等等。

我想知道标准过程在Docker-土地。阅读官方泊坞文档以及this article on Docker Volumes后我暂定做法是:

  1. 创建一个数据卷容器和主机
  2. 我可以再配置我的嵌入安装它,比方说,/opt/myapp数据库中读取从DB内容/他们写/opt/myapp/database,我相信(如果我明白我已经正确读取),所有容器实例将共享相同的DB
  3. 不知何故注入容器ID或其他一些独特标识符到每个容器实例中,并重构我的日志记录和度量代码,以便在生成日志或原始度量标准时包含该注入的ID,以便我可能拥有/opt/myapp/logs/containerX.log文件,/opt/myapp/logs/containerY.log文件等。但我对标准做法非常感兴趣这里用于Docker容器之间的日志聚合!

而且,可以说是更重要的,是事实,我不知道这种解决方案能够在多主机的场景在哪里工作我都运行在多个主机上几十myapp容器的群/群。我的数据卷容器是否会奇迹般地同步所有主机上的/opt/myapp卷?如果没有,无论主机在哪个主机上运行,​​装载容器共享卷的解决方案是什么?提前致谢!

回答

3

有好几个问题。以下是我的一些答案。

  1. Docker使用的默认日志记录驱动程序是json-file。这将以json格式捕获stdout和stderr。还有其他的日志驱动程序(如syslog,fluentd,LogEntries等)可以发送到中央日志服务器。使用中央记录还可以避免我们自己维护卷的问题。这里捕获所有Docker日志记录驱动程序(https://docs.docker.com/engine/admin/logging/overview/#supported-logging-drivers
  2. 如果将Swarm模式与服务一起使用,则存在服务日志记录的概念,其中服务日志包含与与服务关联的所有容器关联的日志。(https://docs.docker.com/engine/reference/commandline/service_logs/
  3. 默认情况下,Docker日志包含由日志驱动程序添加的容器标识。我们可以使用日志选项对其进行自定义(https://docs.docker.com/engine/admin/logging/log_tags/
  4. 对于跨数据库的容器共享数据,如果容器在同一主机中,我们可以使用基于主机的卷。由于没有自动同步,因此这不会在节点间工作。对于跨节点共享容器数据,我们可以使用共享文件系统(如nfs,ceph,gluster)或者Docker卷插件(ebs,gce)
+0

谢谢@Sreeni(+1) - 关于上面关于日志的第一个bulletpoint驱动程序:我想我可能会使用'syslog'驱动程序并在主机上配置'syslog'。但我**相信**(如果我错了,请纠正我),那将需要我更改我的应用程序以登录到STDOUT或STDERR,对吧?你如何配置Docker容器的'syslog',其内部的应用**必须**登录到文件?例如,如果我想要一个Docker化的FTP服务器[例如这个](https://github.com/fauria/docker-vsftpd/blob/master/vsftpd.conf),我没有发言权 - 那么FTP如何服务器日志。 – smeeb

+0

例如,在那个特定的Docker镜像中,日志记录[在这里配置](https://github.com/fauria/docker-vsftpd/blob/master/vsftpd.conf#L44),通过设置一个'xferlog_file'到指向一个日志文件。那么我如何使用Docker驱动程序从这些FTP服务器容器中收集日志呢?只是好奇!再次感谢! – smeeb

+2

你可以这样做一个符号链接:'/path/to/ftp.log - >/dev/stdout',你的ftp会认为它正在写入一个文件。或者直接告诉他写入'/ dev/stdout'“文件” – Robert