Docker Volume Containers用于数据库,日志和指标
我有一个使用embedded式数据库的应用程序,并且还生成以下目录结构的日志和原始指标:
/opt/myapp/data/ database/ logs/ raw_metrics/
我正在学习Docker,并试图“Dockerize”这个应用程序,并试图find一个安装/容量解决scheme,为我完成以下目标:
- embedded式数据库存储在相同的安装卷中,而不pipe
myapp
运行的容器实例有多less个。 换句话说,所有容器实例都将其数据写入共享database/
卷; 和 - 我也更喜欢我的日志和原始指标(即:所有容器实例将日志/指标写入同一个共享卷)相同,除了这里我需要能够区分每个容器的日志和指标数据。 换句话说,我需要知道容器X产生了一个特定的日志消息,或者容器Y在7秒内响应了一个请求,等等。
我想知道Docker-land中的标准程序是什么。 在阅读官方的Docker文档以及Docker卷的这篇文章之后,我尝试的方法是:
- 创build一个Data Volume Container并将其挂载到主机上的
/opt/myapp
- 然后,我可以configuration我的embedded式数据库读取/写入到
/opt/myapp/database
,我相信 (如果我明白我读了正确),所有容器实例将共享相同的数据库 - 以某种方式将容器ID或其他唯一标识符注入到每个容器实例中,并在生成日志或原始度量标准时重构我的日志logging和度量标准代码以包含注入的ID,以便我可以拥有
/opt/myapp/logs/containerX.log
文件,//opt/myapp/logs/containerY.log
文件等等。 但是我非常感兴趣的是Docker容器中日志聚合的标准做法。
另外,可以说更重要的是,我不确定这个解决scheme是否可以在多主机场景下运行,在这个场景中,我有一个在多台主机上运行数十个myapp
容器的Swarm /集群。 我的数据卷容器会奇迹般地同步所有主机上的/opt/myapp
卷吗? 如果没有,无论主机在哪个主机上运行,装载容器的共享卷的解决scheme是什么? 提前致谢!
有好几个很好的问题。 以下是我的一些答案。
- Docker使用的默认日志logging驱动程序是json-file。 这将以json格式捕获stdout和stderr。 还有其他的日志驱动程序(如syslog,fluentd,LogEntries等)可以发送到中央日志服务器。 使用中央logging还可以避免我们自己维护卷的问题。 所有的Docker日志驱动程序都在这里捕获( https://docs.docker.com/engine/admin/logging/overview/#supported-logging-drivers )
- 如果您将Swarm模式与服务一起使用,则会有服务日志logging的概念,其中服务日志包含与与服务关联的所有容器的日志。 ( https://docs.docker.com/engine/reference/commandline/service_logs/ )
- 默认情况下,Docker日志包含由日志驱动程序添加的容器ID。 我们可以使用日志选项来定制它( https://docs.docker.com/engine/admin/logging/log_tags/ )
- 对于像数据库这样的容器共享数据,如果容器在同一个主机上,我们可以使用基于主机的卷。 由于没有自动同步,所以这不会在节点间工作。 为了跨节点共享容器数据,我们可以使用共享文件系统(如nfs,ceph,gluster)或者Docker卷插件(ebs,gce)