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

时间:2019-01-26 00:59:38

标签: docker docker-compose containers dockerfile docker-container

我有一个类似于this one的问题。运行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在生产机器上运行它。

(顺便说一句,我是Docker的新手。我的所有步骤都正确吗?我是否遗漏了任何东西?!我发现一切都很好,尽管myapp正在运行!)

2 个答案:

答案 0 :(得分:2)

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

尝试以下内容,让我知道您的收获。

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

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

答案 1 :(得分:1)

  • 是的,您可以使用 bind mount

  • 将主机中的卷挂载到上述答案中概述的容器中
  • 在生产中,我强烈建议将所有容器的日志发送到某个中央位置,这样,即使整个Docker主机出现故障,您仍然可以访问日志,并且也许可以轻松地分析,过滤和设置观察者记录错误并创建一个仪表板,例如 ELK

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

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

更进一步,您可以考虑使用诸如 kubernetes 之类的容器管理系统,该系统具有对ELK的集中日志记录和对 promethous 的计量。