我正在尝试查看是否可以在 docker 容器中运行 systemd(在容器中运行 arch linux)。
我以所有功能启动 docker,并在 cgroups 中绑定挂载:
docker run -it --rm --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro ..
但是,如果我尝试运行 systemd 二进制文件:
Trying to run as user instance, but the system has not been booted with systemd.
试图找出如何正确地为 systemd 启动事物。
这是我的主图:D 在带有 ubuntu 的 docker 容器中运行 systemd:D 我让 Ubuntu 在 docker 中使用 systemd
我的 docker-systemd 容器的 GitHub 存储库
输出:
2021 年更新
很多补丁被提交到不同的项目,比如 REDHAT 的 docker 上游 repos。更清楚地说,我的朋友 David Walsh @ REDHAT 也发布了很多关于此的内容。 https://developers.redhat.com/blog/author/rhatdan/。
在没有额外权限的情况下运行 SystemD 需要
/run
作为 tmpfs。/sys/fs/cgroup
只读。/sys/fs/cgroup/systemd
读/写。/etc/machine-id
需要包含一个 Uniqe MachineIDSIGRTMIN+3
作为停止信号,因为 sigterm 将不起作用/var/log/journal
如果它不存在,它将写入内存注意:当您的 dockerfile 包含
STOPSIGNAL SIGRTMIN+3
查看完整的帖子。https://developers.redhat.com/blog/2016/09/13/running-systemd-in-a-non-privileged-container/
注意:今天使用 Podman,在这里阅读它会更简单: https ://developers.redhat.com/blog/2019/04/24/how-to-run-systemd-in-a-container/
要在 Docker 容器中运行 systemd,主机系统也必须运行 systemd。这意味着您不能使用 Ubuntu < 16.04 作为主机。
目前 systemd 不能在 docker 容器中正确运行,原因有很多,即缺乏正确的权限。您可以在 docker 项目的各种 github 问题中阅读相关内容,例如在 docker arch 容器中运行 systemd 挂起或段错误以及有关初始化/进程监控的相关问题。(我想在这里链接更多问题,但我不能,因为我显然没有足够的声誉)。
正如您所看到的,这是一个当前正在研究的主题,并且已经合并了一些补丁以改善行为,因此我们可以期待它很快就会起作用。
显然,一些开发人员已经设法让它在 Fedora 系统上运行,正如他们在博客中所记录的那样。
我能够从这里向后工作:https ://registry.hub.docker.com/u/codekoala/arch/
Docker 1.1 使这更容易,因为容器中已经提供了组 (ro) - 我目前仍然需要 priv 访问权限,以便它可以创建 PrivateTmp 挂载,但除此之外,只要您指定 cmd 作为 systemd 二进制文件运行 - 它工作得很好。
您可以在 docker 容器中运行 systemd。主机操作系统无关紧要,尽管您需要挂载主机的 /sys/fs/cgroup 卷。我按照本指南让它工作:http: //developerblog.redhat.com/2014/05/05/running-systemd-within-docker-container/
尝试在 debian:8 官方容器中执行此操作时发现此问题。对于尝试在官方 debian:8 (debian:jessie) 容器上执行此操作的任何其他人,@Frank-from-DSPEED 的答案只需稍作修改即可,如旧 git hub 帖子中所述:
然后从容器中:
这对我来说非常有效,因为这只是一个开发环境,所以安全问题对我来说并不重要。
注意:/sbin/init 命令使 /sbin/init 成为进程 1,这是完成这项工作的关键部分。
截至 2018 年,这对我有用:
docker run -it -e container=docker
your-image-name/sbin/init
但是,这不会给您一个 shell,因此您需要首先在映像中启用一些 systemd 服务(例如 sshd)(如果尚未启用),以执行任何有用的操作。