如何在 Ubuntu Docker 容器中启用和使用 systemd 和 systemctl? [已关闭]

问题描述 投票:0回答:1

问题

如何在 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 的信息。

ubuntu docker systemd ubuntu-server systemctl
1个回答
98
投票

这是设计使然。 Docker 应该在容器的前台运行一个进程,并且它将在容器的 pid 命名空间中作为 PID 1 生成。 Docker 是为进程隔离而设计的,而不是为了操作系统虚拟化,因此容器内没有其他操作系统进程和守护进程(如 systemd、cron、syslog 等)运行,只有您运行的入口点或命令。

如果它们包含 systemd 命令,您会发现很多东西都不起作用,因为您的入口点替换了 init。 Systemd 还使用 docker 限制在容器内部的 cgroup,因为更改 cgroup 的能力可能允许进程逃脱容器的隔离。如果没有 systemd 在容器内作为 init 运行,就没有守护进程来处理您的启动和停止命令。

© www.soinside.com 2019 - 2024. All rights reserved.