为什么 Docker 有守护进程?

Why does Docker have a daemon?

我最近发现 rkt,Docker 的竞争对手容器运行时。似乎 rkt 不需要守护进程。对我来说,rkt 就像 运行 任何其他命令,它可以轻松地与 systemd(或其他初始化系统)一起使用。

这让我想知道 Docker 守护进程的实用性。

为什么 Docker 需要守护进程?守护进程提供了哪些没有它就不可能实现的功能?它的唯一目标是消除对像 systemd 这样的初始化系统的需求吗(在 Rancher OS 中可以看到)?

Docker 被设计为 client/server 应用程序,允许您远程访问 docker API。这允许诸如基于经典容器的 swarm 之类的工具有效地反向代理 docker 主机集群。

守护进程还为共享状态提供了一个位置。它根据重启策略重启容器。但它也管理可能在多个容器之间共享的网络和卷。

最后,随着 swarm 模式的引入,守护进程也是这些工具的中心位置,否则这些工具将 运行 作为它们自己的带有 kubernetes 等工具的守护进程。

如果您需要一个无守护程序的解决方案,但在其他方面喜欢 docker,请考虑使用 runc,这是 docker 用于每个容器的 运行 时间环境默认情况下。

这里不涉及容器内部的init。如果您需要,docker 现在包含一个可选的 init,您可以为每个容器启用它。如果你需要一些东西来清理僵尸进程,你总是可以选择包含你自己的 init,比如 tini。