使用docker compose扩展服务时,如何在卷路径中指定迭代器?

使用docker compose扩展服务时,如何在卷路径中指定迭代器?,docker,scale,docker-compose,volume,docker-swarm,Docker,Scale,Docker Compose,Volume,Docker Swarm,背景:我正在使用docker compose将tomcat服务放入docker swarm集群,但我目前正在努力解决如何接近日志目录的问题,因为我想扩大服务规模,同时保留日志目录的唯一性 考虑一下(显然)由docker compose组成的docker compose,它只是启动tomcat并挂载一个日志文件系统来捕获日志 版本:“2” 服务: tomcat: 图片:“tomcat:最新” 主机名:tomcat示例 命令:/start.sh 卷数: -“/data/container/tomca

背景:我正在使用docker compose将tomcat服务放入docker swarm集群,但我目前正在努力解决如何接近日志目录的问题,因为我想扩大服务规模,同时保留日志目录的唯一性

考虑一下(显然)由docker compose组成的docker compose,它只是启动tomcat并挂载一个日志文件系统来捕获日志

版本:“2”
服务:
tomcat:
图片:“tomcat:最新”
主机名:tomcat示例
命令:/start.sh
卷数:
-“/data/container/tomcat/logs:/opt/tomcat/logs,z”

版本

  • docker 1.11
  • docker compose 1.7.1
  • API版本1.21
问题:我想了解如何将变量插入“卷”日志路径,以便日志目录对于缩放服务的每个实例都是唯一的

我看到基于项目名(或我所在的目录),容器名实际上是已知的,所以我可以使用这个吗

例如,将项目名称设置为“tomcat”并运行
docker compose scale tomcat=2
我将看到以下容器

  • 主机名/tomcat_1
  • 主机名/tomcat_2
那么,我有没有办法把它作为日志记录量中的一个变量,欢迎提出其他建议或方法。我意识到我可以指定一个相对路径,让容器id来处理这个问题,但是现在如果我将splunk或logstash连接到日志记录设备,我需要知道哪些设备确实是日志记录设备,而不是基本容器f/s。然而,理想情况下,我在这里使用一个特定的绝对路径

提前感谢dockers!
R.

您真的不应该登录到文件系统,而应该使用专门的日志管理工具,如graylog/logstash/splunk/。。。相反在Tomcat中使用特定的appender配置日志框架,或者登录到sysout并在Docker中配置日志驱动程序,以将日志重定向到外部目标

也就是说,如果您真的想使用文件系统,只需使用一个常规的未命名卷,然后在容器上调用
docker inspect
,以查找该卷在文件系统上的路径:

[...snip...]
"Mounts": [
    {
        "Type": "volume",
        "Name": "b8c...SomeHash...48d6e",
        "Source": "/var/lib/docker/volumes/b8c...SomeHash...48d6e/_data",
        "Destination": "/opt/tomcat/logs",
[...snip...]
如果您希望在特定位置有好看的名称,请使用脚本创建符号链接


然而,我仍然对这个解决方案持怀疑态度,尤其是在多主机群集环境中。在您的用例中,登录到一个外部的、专门的服务是一种方法。

我认为更好的方法是将容器日志输出到stdout,并使用Docker的日志驱动程序稍后解析它们。Splunk在此处的列表中:。另外,
docker compose logs
将为您聚合日志,并在每个日志条目的前面添加容器名称和编号。我使用syslog驱动器来记录日志,效果非常好。它使扩展和添加服务易于管理。
[...snip...]
"Mounts": [
    {
        "Type": "volume",
        "Name": "b8c...SomeHash...48d6e",
        "Source": "/var/lib/docker/volumes/b8c...SomeHash...48d6e/_data",
        "Destination": "/opt/tomcat/logs",
[...snip...]