Docker Volume Containers用于数据库,日志和指标

我有一个使用embedded式数据库的应用程序,并且还生成以下目录结构的日志和原始指标:

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

我正在学习Docker,并试图“Dockerize”这个应用程序,并试图find一个安装/容量解决scheme,为我完成以下目标:

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

我想知道Docker-land中的标准程序是什么。 在阅读官方的Docker文档以及Docker卷的这篇文章之后,我尝试的方法是:

  1. 创build一个Data Volume Container并将其挂载到主机上的/opt/myapp
  2. 然后,我可以configuration我的embedded式数据库读取/写入到/opt/myapp/database ,我相信 (如果我明白我读了正确),所有容器实例将共享相同的数据库
  3. 以某种方式将容器ID或其他唯一标识符注入到每个容器实例中,并在生成日志或原始度量标准时重构我的日志logging和度量标准代码以包含注入的ID,以便我可以拥有/opt/myapp/logs/containerX.log文件,/ /opt/myapp/logs/containerY.log文件等等。 但是我非常感兴趣的是Docker容器中日志聚合的标准做法。

另外,可以说更重要的是,我不确定这个解决scheme是否可以在多主机场景下运行,在这个场景中,我有一个在多台主机上运行数十个myapp容器的Swarm /集群。 我的数据卷容器会奇迹般地同步所有主机上的/opt/myapp卷吗? 如果没有,无论主机在哪个主机上运行,​​装载容器的共享卷的解决scheme是什么? 提前致谢!

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

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