我正在尝试看看是否可以在 docker 容器(在容器中运行 arch linux)内运行 systemd。
我启动具有所有功能的 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 启动。
答案1
这是我的主图 :D 使用 ubuntu 在 docker 容器内运行 systemd :D 我让 Ubuntu 在 docker 内使用 systemd 工作
我的 docker-systemd 容器的 GitHub Repo
$ docker run -it --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro dockerimages/docker-systemd
输出:
systemd 218 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT -GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID -ELFUTILS +KMOD -IDN)
Detected virtualization 'docker'.
Detected architecture 'x86-64'.
Welcome to Ubuntu Vivid Vervet (development branch)!
Set hostname to <502ec40509a5>.
[ OK ] Created slice Root Slice.
[ OK ] Created slice System Slice.
Starting Emergency Shell...
[ OK ] Started Emergency Shell.
Startup finished in 5ms.
Welcome to emergency mode! After logging in, type "journalctl -xb" to view
system logs, "systemctl reboot" to reboot, "systemctl default" or ^D to
try again to boot into default mode.
root@502ec40509a5:~# exit
2021 年更新
很多补丁都提交给了不同的项目,比如 REDHAT 的 docker 上游仓库。更清楚的是,我的朋友 David Walsh @ REDHAT 也发布了很多关于此的帖子。 https://developers.redhat.com/blog/author/rhatdan/。
在没有额外权限的情况下运行 SystemD 需要
/run
作为 tmpfs。
/sys/fs/cgroup
只读。
/sys/fs/cgroup/systemd
读/写。
/etc/machine-id
需要包含一个唯一的 MachineID
SIGRTMIN+3
,因为 stopsignal 和 sigterm 不起作用
/var/log/journal
,如果不存在,它将写入内存
docker run -d \
--tmpfs /tmp \
--tmpfs /run \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--stop-signal SIGRTMIN+3 \
httpd /sbin/init
注意:当您的 dockerfile 包含以下代码时,可以删除 Stopsignal 标志: 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/
答案2
要在 Docker 容器中运行 systemd,主持人系统还必须运行 systemd。这意味着您不能使用 Ubuntu < 16.04 作为主机。
答案3
目前,由于一系列原因,例如缺乏正确的权限,systemd 无法在 docker 容器中正确运行。您可以在 docker 项目的各种 github 问题中阅读有关此问题的信息,例如在 docker arch 容器内运行 systemd 挂起或出现段错误以及与 init/进程监控相关的问题。(我想在这里链接更多问题,但我不能,因为我显然没有足够的声誉)。
如您所见,这是一个目前正在研究的主题,并且已经合并了一些补丁来改善行为,因此我们可以期待它很快就能发挥作用。
显然,一些开发人员已经设法让它在 Fedora 系统上运行,正如他们所记录的那样在他们的博客中。
答案4
您可以在 docker 容器内运行 systemd。主机操作系统无关紧要,但您需要挂载主机的 /sys/fs/cgroup 卷。我按照以下指南操作:http://developerblog.redhat.com/2014/05/05/running-systemd-within-docker-container/