用于数据库、日志和度量的Docker卷容器

用于数据库、日志和度量的Docker卷容器,docker,docker-volume,docker-networking,Docker,Docker Volume,Docker Networking,我有一个应用程序,该应用程序使用嵌入式数据库,并生成日志和原始指标,以用于以下目录结构: /opt/myapp/data/ database/ logs/ raw_metrics/ 我正在学习Docker,并尝试将此应用程序“Dockerize”,并试图找到一个安装/音量解决方案,以实现以下目标: 无论运行了多少个myapp的容器实例,嵌入式数据库都存储在相同的装入卷中。换句话说,所有容器实例都将其数据写入共享的数据库/卷;及 对于我的日志和原始度量(即:所有容器实例都将日志/度

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

/opt/myapp/data/
  database/
  logs/
  raw_metrics/
我正在学习Docker,并尝试将此应用程序“Dockerize”,并试图找到一个安装/音量解决方案,以实现以下目标:

  • 无论运行了多少个
    myapp
    的容器实例,嵌入式数据库都存储在相同的装入卷中。换句话说,所有容器实例都将其数据写入共享的
    数据库/
    卷;及
  • 对于我的日志和原始度量(即:所有容器实例都将日志/度量写入同一个共享卷),我也希望使用相同的方法,但这里我需要能够区分每个容器的日志和度量数据。换句话说,我需要知道容器X生成了一个特定的日志消息,或者容器Y在7秒内响应了一个请求,等等
我想知道Docker land的标准程序是什么。在阅读了Docker官方文件以及我的暂定方法后,我将:

  • 创建一个数据卷容器并将其装载到主机上的,例如,
    /opt/myapp
  • 然后,我可以将嵌入式数据库配置为从
    /opt/myapp/database
    读取/写入DB内容,我相信(如果我正确理解所读取的内容),所有容器实例都将共享相同的DB
  • 以某种方式将容器ID或某些其他唯一标识符注入到每个容器实例中,并在生成日志或原始度量时重构我的日志和度量代码,以包括注入的ID,这样我可能有一个
    /opt/myapp/logs/containerX.log
    文件,一个
    /opt/myapp/logs/containerY.log
    文件,等等,但我对Docker容器中日志聚合的标准实践非常感兴趣

  • 此外,可以说更重要的是,我不确定这种解决方案是否适用于多主机场景,在这种场景中,我的群集/集群在多台主机上运行几十个
    myapp
    容器。我的数据卷容器会在所有主机上神奇地同步
    /opt/myapp
    卷吗?如果不是,那么无论容器运行在哪台主机上,为容器装载共享卷的解决方案是什么?提前谢谢

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

  • Docker使用的默认日志驱动程序是json文件。这将以json格式捕获stdout和stderr。还有其他日志驱动程序(如syslog、fluentd、LogEntries等)可以发送到中央日志服务器。使用中心日志还可以避免自己维护卷的问题。这里捕获了所有Docker日志驱动程序()
  • 如果在服务中使用Swarm模式,则有一个服务日志的概念,其中服务日志包含与服务关联的所有容器相关联的日志。()
  • Docker日志默认包含由日志驱动程序添加的容器id。我们可以使用log options()对其进行自定义
  • 对于跨容器(如数据库)共享数据,如果容器位于同一主机中,我们可以使用基于主机的卷。由于没有自动同步,这将无法跨节点工作。为了跨节点共享容器数据,我们可以使用共享文件系统(如nfs、ceph、gluster)或Docker卷插件(ebs、gce)

  • 感谢@Sreeni(+1)-关于您上面关于日志驱动程序的第一个要点:我想我可能要做的是使用
    syslog
    驱动程序并在主机上配置
    syslog
    。但我相信(如果我错了,请纠正我!),这需要我将我的应用程序更改为登录到STDOUT或STDERR,对吗?如何为内部应用程序必须登录到文件的Docker容器配置
    syslog
    ?例如,如果我想要一个停靠的FTP服务器,我对该FTP服务器如何记录没有发言权。例如,在特定的Docker映像中,记录是通过设置一个
    xferlog\u文件来指向一个日志文件。那么,如何使用Docker驱动程序从这些FTP服务器容器中收集日志呢?只是好奇!再次感谢!您可以创建如下符号链接:
    /path/to/ftp.log->/dev/stdout
    ,您的ftp会认为这是在写入文件。或者直接告诉他写信给
    /dev/stdout
    “文件”同意@Robert。如果你看这里(),那也是建议的官方方法。实际上,像nginx和httpd这样的容器已经通过在Dockerfile中合并链接或自定义位置实现了这一点,如link中所述。