【问题标题】:Is it recommended to run systemd inside docker container?是否建议在 docker 容器内运行 systemd?
【发布时间】:2019-01-29 11:08:48
【问题描述】:

我打算在容器内使用“systemd”。根据我读过的文章,最好每个容器只限制一个进程。

但如果我在容器内配置“systemd”,我最终会运行许多进程。

在我做出任何决定之前了解在容器内使用 systemd 的优缺点会很棒。

【问题讨论】:

  • 在容器内使用 systemd 是个人选择的问题。您可以通过任何一种方式实现。
  • 您需要 systemd 的用例是什么?
  • 总是使用 docker restart 代替 systemd 怎么样?
  • 您是否能够使用所选答案解决您的用例?你能提供更多细节吗?

标签: docker systemd


【解决方案1】:

s6 在您需要多个进程时成为一种流行的容器初始化方法。是的,这不是“每个容器一个进程”,而是“每个容器一个东西”。运行一个网站,例如仍然是一回事,但通常不止一个过程。

【讨论】:

    【解决方案2】:

    我建议您尽可能避免在容器中使用 systemd。

    Systemd 挂载文件系统,控制多个内核参数,拥有自己的内部系统来捕获进程输出,配置系统交换空间,配置大页面和 POSIX 消息队列,启动进程间消息总线,启动每个终端登录提示并管理大量系统服务。其中许多是 Docker 为您做的事情;其他是 Docker 默认阻止的系统级控制(有充分的理由)。

    通常你希望一个容器做一个的事情,这偶尔需要多个协调进程,但你通常不希望它做 systemd 提供的进程管理器之外的任何事情。由于 systemd 更改了如此多的主机级参数,因此您经常需要以 --privileged 运行它,这会破坏 Docker 隔离,这通常是个坏主意。

    正如您在问题中所说,每个容器运行一个“部件”通常被认为是最好的。如果你不能做到这一点,那么像supervisord 这样的轻量级进程管理器会更好地匹配 Docker 和 Unix 哲学。

    【讨论】:

      【解决方案3】:

      您应该更多地考虑您喜欢使用哪个init系统的问题。

      可以使用旧的 /sbin/init 或 systemd-daemon 在容器中作为 PID-1 运行。像“docker stop”这样的任何命令都只会与 PID-1 对话。如果容器中只有一个 java 应用程序,则建议直接将该进程作为容器的 PID-1 运行。

      基本上不需要运行 systemd - 如果您在一个容器中有多个服务,或者如果某些包装脚本使用“systemctl”,那么您可能仍想使用激活它。但后面的用例也会被docker-systemctl-replacement 覆盖。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-10-04
        • 1970-01-01
        • 2016-05-27
        • 1970-01-01
        • 1970-01-01
        • 2016-06-09
        • 1970-01-01
        相关资源
        最近更新 更多