在Docker容器内运行systemd是否推荐?

23

我计划在容器内使用"systemd"。根据我阅读的文章,限制每个容器只有一个进程是更可取的。

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

在做出任何决定之前,了解在容器内使用systemd的利弊将是很好的。


在容器内使用systemd是个人选择的问题。你可以用任何一种方式实现。 - abunickabhi
你需要systemd的使用场景是什么? - Sathyajith Bhat
不如使用docker restart always来替代systemd,这样怎么样? - Mayur
你能够用所选的答案解决你的使用情景了吗?能否提供更多细节呢? - Girish
3个回答

34

如果可能的话,我建议您避免在容器中使用systemd。

Systemd 挂载文件系统,控制多个内核参数,具有自己的内部系统来捕获进程输出,配置系统交换空间、配置大页面和POSIX消息队列,启动进程间消息总线,启动每个终端登录提示,并管理一系列系统服务。其中许多是Docker为您完成的任务,其他是默认情况下Docker防止(出于良好原因)的系统级控制。

通常,您希望容器只做一个事情,这可能需要多个协调进程,但通常您不希望它执行systemd提供的除进程管理器外的任何操作。由于systemd更改了许多主机级别的参数,因此您通常需要将其作为--privileged运行,这会破坏Docker的隔离,这通常是一个不好的想法。

如您在问题中所述,通常认为每个容器运行一个“组件”最佳。如果您无法这样做,则像supervisord这样的轻量级进程管理器,只需完成所需的最小init进程即可,这符合Docker和Unix哲学。


6

s6 成为了容器中一个相对受欢迎的init程序,当你需要多个进程时。是的,并不是“每个容器一个进程”,而是“每个容器一件事情”。例如运行网站,虽然仍然是一件事情,但通常涉及到多个进程。


每个容器不是“一个东西”,而实际上是一个进程!我不知道你从哪里得到这个信息,但是它是错误的。这并不意味着没有例外情况,需要在同一个容器中运行多个进程,但你最好有一个很好的理由来违反这个原则。 - Lethargos
我不知道你从哪里得到的这个信息。它来自这里:https://github.com/just-containers/s6-overlay#the-docker-way - rudolfbyker

4
你应该考虑更多的是你想使用哪个初始化系统。
有人可能会使用旧的/sbin/init或在容器中作为PID-1运行的systemd-daemon。任何像“docker stop”这样的命令都只会与PID-1通信。如果你在一个容器中只有一个Java应用程序,那么建议直接将该进程作为容器的PID-1运行。
大多数情况下不需要运行systemd——如果你在一个容器中有多个服务,或者某些包装脚本使用了'systemctl',那么你可能仍然希望激活它。但后一种用例也可以通过docker-systemctl-replacement来实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接