Docker 容器在主机目录上保存日志

Docker container save logs on the host directory

我有一个类似于 的问题。当 运行 我的 docker-compose.yml 文件时,我会自动创建一个 docker 图像,并按照我的 dockerfile 中的指定,我 运行 某些应用程序。这些应用程序会生成一些日志,但这些日志写在 内 docker 容器中,在 /home/logs/ 文件夹中。

如何指示这些日志写在容器外,在我的/path/on/host地址上?仅仅是因为如果容器失败,我需要查看日志而不是丢失它们!

这是我的 docker-compose.yml:

version: '3'
services:
  myapp:
    build: .
    image: myapp
    ports:
      - "9001:9001"

这是我的 dockerfile:

FROM java:latest
COPY myapp-1.0.jar /home
CMD java -jar /home/myapp-1.0.jar

我只是 运行 在生产机器上使用 docker-compose up -d

(顺便说一句,我是 dockers 的新手。我的所有步骤都正确吗?我遗漏了什么吗?!我看到一切都很好,但我的应用程序正在 运行ning!)

您只需要一个 docker 卷来保存日志文件。因此,在与 docker-compose.yml 相同的目录中创建一个日志目录,然后定义一个卷挂载。定义挂载时,请记住语法是 <host_machine_directy>:<container_directory>

试试下面的卷,让我知道你得到了什么。

version: '3'
services:
  myapp:
    build: .
    image: myapp
    ports:
      - "9001:9001"
    volumes:
      - ./logs:/home/logs

同样值得注意的是,这种方法的持久性是双向的。从容器内对文件所做的任何更改都会反映回主机。来自主机的任何更改也会反映在容器内部。

  • 是的,您可以使用 bind mount

    [= 将卷从主机装载到容器中,如上述答案中所述31=]
  • 在生产中,我强烈建议将所有容器的日志发送到某个中央位置,这样即使整个 docker 主机出现故障,您仍然可以访问日志,也许可以轻松分析、过滤、设置日志错误观察者并制作仪表板,例如 ELK

https://docs.docker.com/config/containers/logging/configure/

为此,您需要将应用配置为将日志发送到标准输出,然后配置 docker 守护进程将日志发送到您的端点之一,例如 logstash ,然后您可以配置 logstash 进行一些预处理(如果需要),然后将其流式传输到您的 elasticsearch 实例。

更进一步,您可以考虑一个容器管理系统,例如 kubernetes,中央日志记录到 ELK 并计量到 promethous