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。
我有一个类似于 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。