一尘不染

Ubuntu Docker映像中的systemd和systemctl

docker

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

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

如果我systemctl status ssh16,04容器中执行,则结果为错误Failed to connect to bus: No such file or directory。在16.10容器中,错误为bash: systemctl: command not found

如果我这样做,which systemctl则在16.04容器中找到systemctl,但在16.10容器中找不到。

我发现/lib/systemd存在。

我尝试使用安装systemd apt-get install systemd libpam-systemd systemd-ui。然后which systemctl找到systemctl 16.10systemctl 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。是否有任何文档提供完整说明?


阅读 1265

收藏
2020-06-17

共1个答案

一尘不染

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

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

2020-06-17