在 docker 容器内运行 systemd(arch linux)

在 docker 容器内运行 systemd(arch linux)

我正在尝试看看是否可以在 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 @ RED​​HAT 也发布了很多关于此的帖子。 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/

相关内容