Ubuntu Docker映像中的systemd和systemctl [关闭]


77

问题

systemd在Ubuntu Docker映像中似乎无效或不可用。

设定

我正在从中运行Docker容器 ubuntu:16.04ubuntu:16.10镜像。

测验

如果我执行:

systemctl status ssh 在里面 16,04容器中

结果是错误 Failed to connect to bus: No such file or directory

16.10容器中的错误是:bash: systemctl: command not found

如果我which systemctl16.04容器中找到systemctl,但在16.10容器中。

我发现了 /lib/systemd存在。

我尝试使用以下方式安装systemd:

apt-get install systemd libpam-systemd systemd-ui

然后 which systemctl找到systemctl16.10

systemctl status ssh仍然给出错误Failed to connect to bus: No such file or directory

问题

如何激活systemd和systemctl以在Ubuntu Docker映像中使用?

为什么systemd在Ubuntu Docker容器中不活跃?在实例化容器时不使用systemd吗?

我没有找到有关此主题的关于Ubuntu / Ubuntu Docker映像的任何文档,仅提供了有关从Ubuntu过渡Upstart到的信息systemd。是否有任何文档提供完整说明?


如果要使用功能完整的初始化系统,请使用虚拟机。
user2105103

有一些建议模仿容器内部PID-1的初始化系统。基本上,它应该对“ docker stop”发送的SIGTERM作出反应,将其分发到容器中的其他进程。而且它应该能够从被杀死的后台进程中获得僵尸。=>现在,只需选择周围的一种实现即可。有些只是在C / C ++中移植一个真正的“ init”,而另一些是以高级语言围绕signal(3)和waitpid(3)进行脚本编写的-Python的“ signal”标准库也适用。(如我的docker-systemctl-replacement脚本所示)
Guido U. Draheim

2
运行docker映像docker run --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro <image>systemctl正常工作
-bucky

Answers:


76

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

如果它们包含systemd命令,那么您会发现许多事情都无法正常进行,因为您的入口点将其替换为init。Systemd还利用了docker限制容器内部的cgroup,因为更改cgroup的能力可以使进程逃避容器的隔离。如果没有在容器内将systemd作为init运行,则没有守护进程来处理启动和停止命令。


5
链接到的教程中没有讨论您的任何观点,因此我看不到如何说它“几乎是教程中的第一笔记”,仅链接到它并没有帮助。文档的首页。我从Docker自学式培训视频中了解到,容器的入口点具有PID 1,因此隐式地了解到入口点将替换systemd。但是,在阅读了Docker文档的众多章节之后,我觉得我还没有阅读完整而清晰的解释。
邓肯·格拉维尔

4
为了几乎在基本映像中包含一个操作环境来执行有用的操作,我的理解是,此映像与完整OS之间的唯一区别是它没有内核,而是使用主机OS的内核。也许假设您了解OS。我是Linux的新手。我需要详细说明常规的Ubuntu / Linux Distro操作环境和Dockerized Ubuntu / Linux Distro操作环境之间的区别。
邓肯·格拉维尔

1
另一个要点是,第一个自定进度的培训视频暗示了一个容器中可以运行多个进程,因此我认为您关于在容器中运行“没有其他进程”的说法至少部分不准确。仍然感谢您的回复。
邓肯·格拉维尔

1
与此相关的最高问题是Docker与普通虚拟机有何不同?您可能会发现有帮助。
BMitch '16

4
顺便说一下...。由于我周围也有一些脚本发布了“ systemctl start”和“ systemctl stop”,我只是创建了一个替换脚本,可以处理必要的步骤.....它只是在解释/etc/systemd/system/*.service文件。不需要SystemD守护程序。它甚至可以执行docker容器中PID-1进程所期望的操作。随时查看github.com/gdraheim/docker-systemctl-replacement
Guido U. Draheim
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.