Docker 数据库、日志和指标的卷容器
Docker Volume Containers for database, logs and metrics
我有一个使用嵌入式数据库的应用程序,它还会为以下目录结构生成日志和原始指标:
/opt/myapp/data/
database/
logs/
raw_metrics/
我正在学习 Docker 并且正在尝试 "Dockerize" 这个应用程序,并且正在尝试找到一个 mounting/volume 解决方案来为我实现以下目标:
- 无论我有多少个 运行 的
myapp
容器实例,嵌入式数据库都存储在相同的装载卷中。换句话说,所有容器实例都将它们的数据写入共享 database/
卷;和
- 我也更喜欢我的日志和原始指标(即:所有容器实例将 logs/metrics 写入同一共享卷),除了这里我需要能够区分日志和指标每个容器的数据。换句话说,我需要知道容器 X 生成了特定的日志消息,或者容器 Y 在 7 秒内响应了请求,等等。
我想知道 Docker-land 中的标准程序是什么。在阅读了官方 Docker 文档以及 this article on Docker Volumes 之后,我的 暂定 方法是:
- 创建一个数据卷容器并将其安装到主机上,比如说
/opt/myapp
- 然后我可以配置我的嵌入式数据库以读取数据库内容 from/write 到
/opt/myapp/database
,我 相信 (如果我明白我所知道的正确读取),所有容器实例将共享同一个数据库
- 以某种方式将容器 ID 或其他一些唯一标识符注入到每个容器实例中,并重构我的日志记录和指标代码以在生成日志或原始指标时包含注入的 ID,这样我就可以有一个
/opt/myapp/logs/containerX.log
文件、/opt/myapp/logs/containerY.log
文件等。但我对 Docker 容器之间日志聚合的标准做法很感兴趣!
此外,可以说更重要的是,我不确定这个解决方案是否适用于我有 Swarm/cluster 运行 数十个 myapp
多个主机上的容器。我的数据卷容器会神奇地同步所有主机上的 /opt/myapp
卷吗?如果不是,那么无论它们 运行 在哪个主机上,为容器安装共享卷的解决方案是什么?提前致谢!
有多个好问题。以下是我的一些回答。
- Docker 使用的默认日志记录驱动程序是 json-file。这将以 json 格式捕获标准输出和标准错误。还有其他日志记录驱动程序(如 syslog、fluentd、LogEntries 等)可以发送到中央日志服务器。使用中央日志也避免了我们自己维护卷的问题。所有 Docker 日志记录驱动程序都在此处捕获(https://docs.docker.com/engine/admin/logging/overview/#supported-logging-drivers)
- 如果您将 Swarm 模式与服务一起使用,则存在服务日志记录的概念,其中服务日志包含与该服务关联的所有容器相关联的日志。 (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)
我有一个使用嵌入式数据库的应用程序,它还会为以下目录结构生成日志和原始指标:
/opt/myapp/data/
database/
logs/
raw_metrics/
我正在学习 Docker 并且正在尝试 "Dockerize" 这个应用程序,并且正在尝试找到一个 mounting/volume 解决方案来为我实现以下目标:
- 无论我有多少个 运行 的
myapp
容器实例,嵌入式数据库都存储在相同的装载卷中。换句话说,所有容器实例都将它们的数据写入共享database/
卷;和 - 我也更喜欢我的日志和原始指标(即:所有容器实例将 logs/metrics 写入同一共享卷),除了这里我需要能够区分日志和指标每个容器的数据。换句话说,我需要知道容器 X 生成了特定的日志消息,或者容器 Y 在 7 秒内响应了请求,等等。
我想知道 Docker-land 中的标准程序是什么。在阅读了官方 Docker 文档以及 this article on Docker Volumes 之后,我的 暂定 方法是:
- 创建一个数据卷容器并将其安装到主机上,比如说
/opt/myapp
- 然后我可以配置我的嵌入式数据库以读取数据库内容 from/write 到
/opt/myapp/database
,我 相信 (如果我明白我所知道的正确读取),所有容器实例将共享同一个数据库 - 以某种方式将容器 ID 或其他一些唯一标识符注入到每个容器实例中,并重构我的日志记录和指标代码以在生成日志或原始指标时包含注入的 ID,这样我就可以有一个
/opt/myapp/logs/containerX.log
文件、/opt/myapp/logs/containerY.log
文件等。但我对 Docker 容器之间日志聚合的标准做法很感兴趣!
此外,可以说更重要的是,我不确定这个解决方案是否适用于我有 Swarm/cluster 运行 数十个 myapp
多个主机上的容器。我的数据卷容器会神奇地同步所有主机上的 /opt/myapp
卷吗?如果不是,那么无论它们 运行 在哪个主机上,为容器安装共享卷的解决方案是什么?提前致谢!
有多个好问题。以下是我的一些回答。
- Docker 使用的默认日志记录驱动程序是 json-file。这将以 json 格式捕获标准输出和标准错误。还有其他日志记录驱动程序(如 syslog、fluentd、LogEntries 等)可以发送到中央日志服务器。使用中央日志也避免了我们自己维护卷的问题。所有 Docker 日志记录驱动程序都在此处捕获(https://docs.docker.com/engine/admin/logging/overview/#supported-logging-drivers)
- 如果您将 Swarm 模式与服务一起使用,则存在服务日志记录的概念,其中服务日志包含与该服务关联的所有容器相关联的日志。 (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)