我打算在容器内使用'systemd'。根据我阅读的文章,每个容器最好限制一个过程。
但是,如果我在容器内配置“ systemd”,则最终将运行许多进程。
在我做出任何决定之前,了解在容器内使用systemd的利弊是很重要的。
答案 0 :(得分:5)
我建议您尽可能避免将systemd放在容器中。
Systemd挂载文件系统,控制多个内核参数,具有其自己的内部系统来捕获进程输出,配置系统交换空间,配置大型页面和POSIX消息队列,启动进程间消息总线,启动每个终端登录提示,并管理大量系统服务。其中许多就是Docker为您服务的事情;其他是Docker默认情况下会阻止的系统级控件(有充分的理由)。
通常,您希望容器做一个 事,这有时需要多个协调过程,但是您通常不希望它做systemd提供的超出过程管理器的任何事情。由于systemd更改了许多主机级参数,因此您通常需要以--privileged
的身份运行它,这破坏了Docker的隔离,这通常是一个坏主意。
正如您在问题中所说,通常认为每个容器运行一个“部件”是最好的。如果您无法做到这一点,那么对于Docker和Unix而言,像supervisord这样的轻量级进程管理器,它要求最小的初始化进程是一个更好的选择。
答案 1 :(得分:1)
s6成为容器的一种流行的初始化方法。是的,它不是“每个容器一个进程”,而是“每个容器一个事物”。运营网站,例如仍然是一回事,但通常不止一个过程。
答案 2 :(得分:0)
您应该更多地考虑要使用哪个初始化系统。
一个人可以在容器中使用以PID-1运行的旧版/ sbin / init或systemd-daemon。诸如“ docker stop”之类的任何命令都只会与PID-1通讯。如果您的容器中只有一个Java应用程序,则建议直接将该过程作为容器的PID-1运行。
通常不需要运行systemd-如果您在容器中有多个服务,或者如果某些包装脚本使用'systemctl',则可能仍要使用激活它。但是docker-systemctl-replacement也涵盖了后者的用例。