我有一个类似于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正在运行!)
答案 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 的计量。