如何在 Docker 容器内配置日志记录?

如何在 Docker 容器内配置日志记录?

我试图将 OpenVPN 服务器 dockerize(到 Debian 8.2)(是的,我知道,已经有这样的容器),但容器内部出现问题,服务器无法启动。

我决定检查日志,但/var/log/syslog(OpenVPN 日志在我的主机上)在容器内丢失。

我认为它rsyslog没有安装,并在 OpenVPN 安装之前将其安装添加到 Dockerfile 中。但这并没有什么效果,syslog仍然不见踪影。

我的 Dockerfile 是:

FROM debian:8.2
USER root
EXPOSE 53/udp
EXPOSE 1194/udp
EXPOSE 443/tcp
RUN apt-get update
RUN apt-get install -y rsyslog
RUN apt-get install -y openvpn
# ...
# Some configuration stuff
# ...
ENTRYPOINT service openvpn start && sh

问题是:

  • 为什么 OpenVPN 在我的主机 Debian 8.2 上默认安装后会登录syslog,而不会在容器内登录?我没有在主机上配置任何内容来强制 OpenVPN 日志记录到syslog.这是一种默认行为。

  • 如何配置在 docker 容器内运行的 OpenVPN 服务器的日志记录?

答案1

OpenVPN 不会从该 Dockerfile 启动,因为没有任何东西可以启动它:-)。你的入口点是sh;这就是它将运行的全部内容。

如果你想在 Docker 中启动两个守护进程,你的入口点需要是一个启动它们的程序。很多人都用supervisord这个。请注意,Docker 是一种相对固执己见的软件,在一个容器中运行多个守护进程并不被认为是惯用的。

如果这只是为了调试,那么没有问题。只是不要openvpn--daemonor一起运行--log。它将写入标准输出(据称,尽管看到标准错误我不会感到惊讶)。如果您手动启动它,这对于调试非常有用。您将立即在终端中看到所有日志消息。

如果您设置入口点并以交互模式手动启动容器 - 同样的交易。如果您将其作为后台容器启动(请原谅我的含糊不清),则输出将被捕获docker logs。这与现代 init 系统(如 systemd)(以及 systemd“日志”日志系统)所青睐的技术相同。

一旦您按照您想要的方式设置了守护进程,您可能会对用于捕获日志的更定制的系统感兴趣,就像其他答案一样。

根据docker logs.有一个“syslog”驱动程序,它表示它会写入主机系统日志。 它说docker logs不起作用,但我不认为这对你来说是个问题。

警告docker logs如果您使用日志记录驱动程序,则确实有效。然而,在 Debian 默认情况下,我的假设是这会导致日志在重新启动时丢失。因为Debian没有设置持久性日志。不过,如果你愿意的话,改变并不难。

支持该命令的另一个日志记录驱动程序docker logs称为“json-file”。我希望这种情况会持续存在,但您可能更喜欢其他解决方案之一。

“为什么”的问题

关键是 Docker 容器的工作方式不一定与它们所基于的操作系统相同。 Docker 不是像LXC、 、 那样的操作系统虚拟化systemd-nspawn,也不是虚拟机。尽管 Docker 源自LXC,但它是专门为运行单个程序的“应用程序容器”而设计的。

(当前)服务器发行版被设计为多个正在运行的程序的组合。因此,您不能从它们那里获取一个包并期望它在这些应用程序容器之一内的行为完全相同。

与日志守护进程的通信就是一个很好的例子。除了人们将更加熟悉应用程序容器的概念之外,没有什么会改变。以及这是否是他们真正想要使用的:)。我怀疑很多系统管理员会对 LXC(操作系统容器)的混搭更感兴趣,比如使用 NixOS 来在容器之间共享包; AFAIK 只是还没有写出来。或者只是一个更好的LXC

相关内容