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

时间:2017-06-13 09:55:33

标签: docker docker-volume docker-networking

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

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

我正在学习Docker并尝试“Dockerize”这个应用程序,我正在尝试找到一个装载/卷解决方案,为我实现以下目标:

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

我想知道Docker-land的标准程序是什么。阅读官方Docker文档以及this article on Docker Volumes后,我的暂定方法是:

  1. 创建数据卷容器并将其挂载到主机上的/opt/myapp
  2. 然后我可以配置我的嵌入式数据库来读取DB内容/将它们写入/opt/myapp/database,并且我相信(如果我理解我所读的正确),所有容器实例将共享相同的数据库
  3. 以某种方式将容器ID或其他唯一标识符注入每个容器实例,并重构我的日志记录和指标代码,以在生成日志或原始指标时包含该注入的ID,以便我可以拥有{{1} }文件,/opt/myapp/logs/containerX.log文件等等。但是我对Docker容器中日志聚合的标准做法非常感兴趣!
  4. 此外,更重要的是,我不确定这个解决方案是否适用于多宿主场景,我在多个主机上运行了数十个/opt/myapp/logs/containerY.log容器的Swarm /集群。我的Data Volume Container会在所有主机上神奇地同步myapp卷吗?如果没有,那么为容器安装共享卷的解决方案是什么,无论它们运行的​​是什么主机?提前谢谢!

1 个答案:

答案 0 :(得分: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日志默认包含容器ID,由记录驱动程序添加。我们可以使用日志选项(https://docs.docker.com/engine/admin/logging/log_tags/
  4. 对其进行自定义
  5. 为了在数据库之类的容器之间共享数据,如果容器在同一主机中,我们可以使用基于主机的卷。这不适用于节点,因为没有自动同步。为了跨节点共享容器数据,我们可以使用共享文件系统(如nfs,ceph,gluster)或Docker卷插件(ebs,gce)