无法在 ubuntu docker 容器上使用 systemd [关闭]

Posted

技术标签:

【中文标题】无法在 ubuntu docker 容器上使用 systemd [关闭]【英文标题】:Not able to use systemd on ubuntu docker container [closed] 【发布时间】:2017-01-03 07:26:03 【问题描述】:

问题

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 systemctl 在16.04 容器中找到,但在16.10 容器中找不到。

我发现/lib/systemd 存在。

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

apt-get install systemd libpam-systemd systemd-ui

然后which systemctl16.10中找到systemctl

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 从 Upstartsystemd 的转换的信息。有没有提供完整解释的文档?

【问题讨论】:

如果您想要一个功能齐全的初始化系统,请使用虚拟机。 有几个提议可以在容器内模拟 PID-1 的 init 系统。基本上,它应该对“docker stop”发送的 SIGTERM 做出反应,将其分发给容器中的其他进程。它应该能够从被杀死的后台进程中获取僵尸。 => 现在只剩下选择其中一种实现了。有些只是在 C/C++ 中移植一个真正的“init”,另一些正在用高级语言围绕 signal(3) 和 waitpid(3) 编写一些脚本——Python 的“signal”标准库也适用于此。 (如我的 docker-systemctl-replacement 脚本所示) 使用 docker run --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro <image>systemctl 运行 docker 镜像工作正常 【参考方案1】:

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

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

【讨论】:

在你链接的教程中没有讨论你的任何观点,所以我不明白你怎么能说它是“教程中的第一个注释”,它真的仅链接到文档的首页是没有帮助的。我从 Self-Paced Docker Training 视频中了解到容器的 Entrypoint 的 PID 为 1,因此隐含地理解了 Entrypoint 替换了 systemd。然而,在阅读了 Docker 文档的许多部分之后,我觉得我还没有阅读完整而清晰的解释。 为了做一些有用的事情,一个基本映像几乎总是包含一个操作环境,我的理解是这个和完整操作系统之间的唯一区别是它没有内核,而是使用主机操作系统的核心。假设您了解操作系统。我是 Linux 新手。我需要详细解释常规 Ubuntu/Linux Distro 操作环境和 Dockerized Ubuntu/Linux Distro 操作环境之间的区别。 另外一点是,第一个自定进度培训视频暗示多个进程可以在容器内运行,所以我觉得您关于“没有其他进程”在容器中运行的说法至少部分不准确。无论如何感谢您的回复。 与此相关的排名最高的问题是How is Docker different from a normal virtual machine?,您可能会觉得有帮助。 顺便说一句......因为我有一些脚本围绕着发出“systemctl start”和“systemctl stop”,我只是创建了一个可以处理必要步骤的替换脚本.. ...它只是为此解释 /etc/systemd/system/*.service 文件。不需要 SystemD 守护程序。它甚至可以执行您对 docker 容器中的 PID-1 进程的期望。随意看看github.com/gdraheim/docker-systemctl-replacement

以上是关于无法在 ubuntu docker 容器上使用 systemd [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

关于Redis Desktop Manager无法连接Ubuntu上的redis容器

如何解决docker宿主机无法访问容器中的服务

[原创]在Linux系统Ubuntu14.04上安装部署docker

如何在 Debian/Ubuntu Docker 容器中设置语言环境?

无法在 Docker 中的 ubuntu 16.04 上安装 openssh-server

我的 kafka docker 容器无法连接到我的 zookeeper docker 容器