问题
如何在 Ubuntu Docker 容器中启用和使用
systemd
和 systemctl
?为什么这些容器中没有默认启用 systemd,以及为什么它不被认为是 Docker 中的最佳实践?
设置
我正在从 ubuntu:16.04 和 ubuntu:16.10 映像运行 Docker 容器。
测试
如果我执行:
systemctl status ssh
在16,04集装箱里
结果是
the error Failed to connect to bus: No such file or directory
在16.10容器中错误是:
bash: systemctl: command not found.
如果我这样做,
which systemctl
systemctl 在 16.04 容器中找到,但在 16.10 容器中找不到。
我发现
/lib/systemd
存在。
我尝试安装
systemd
:
apt-get install systemd libpam-systemd systemd-ui
然后
systemctl
在 16.10中找到
systemctl
但是
systemctl status ssh
仍然给出错误Failed to connect to bus: No such file or directory
问题
有人可以提供在 Ubuntu Docker 容器中启用和使用 systemd 的解决方案吗?
我未能找到有关 Ubuntu / Ubuntu Docker 映像的任何有关此主题的文档,只有有关 Ubuntu 从 Upstart 过渡到 systemd 的信息。
这是设计使然。 Docker 应该在容器的前台运行一个进程,并且它将在容器的 pid 命名空间中作为 PID 1 生成。 Docker 是为进程隔离而设计的,而不是为了操作系统虚拟化,因此容器内没有其他操作系统进程和守护进程(如 systemd、cron、syslog 等)运行,只有您运行的入口点或命令。
如果它们包含 systemd 命令,您会发现很多东西都不起作用,因为您的入口点替换了 init。 Systemd 还使用 docker 限制在容器内部的 cgroup,因为更改 cgroup 的能力可能允许进程逃脱容器的隔离。如果没有 systemd 在容器内作为 init 运行,就没有守护进程来处理您的启动和停止命令。