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

Mic*_*ale 14 arch-linux systemd docker

我正在尝试查看是否可以在 docker 容器(在容器中运行 arch linux)中运行 systemd。

我启动 docker 的所有功能,并在 cgroups 中绑定 mount:

docker run -it --rm --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro ..
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试运行 systemd 二进制文件:

Trying to run as user instance, but the system has not been booted with systemd.
Run Code Online (Sandbox Code Playgroud)

试图找出如何正确地将东西初始化到 systemd 开始。

fra*_*eed 5

这里是我的大师:D 在 ubuntu 的 docker 容器中运行 systemd :D 我让 Ubuntu 在 docker 中与 systemd 一起工作

我的 docker-systemd 容器的 GitHub 存储库

$ docker run -it --cap-add SYS_ADMIN -v /sys/fs/cgroup:/sys/fs/cgroup:ro dockerimages/docker-systemd
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

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需要包含 Uniqe MachineIDSIGRTMIN+3作为停止信号 ,因为 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
Run Code Online (Sandbox Code Playgroud)

注意:当您的 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/

  • 从技术上讲,这是可行的,但您必须破坏容器的安全性才能做到这一点。这不适用于生产部署。 (7认同)

Mic*_*ale 1

我能够从此向后工作:https://registry.hub.docker.com/u/codekoala/arch/

Docker 1.1 使这变得更容易,因为容器中已经提供了组 (ro) - 我目前仍然需要 priv 访问权限,以便它可以创建 PrivateTmp 挂载,但除此之外,只要您指定 cmd 作为 systemd 二进制文件运行 - 它就可以很好地工作。