Arch-Linux

在 docker 容器中執行 systemd (arch linux)

  • April 14, 2021

我正在嘗試查看是否可以在 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 儲存庫

$ 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 上游 repos。更清楚地說,我的朋友 David Walsh @ RED​​HAT 也發布了很多關於此的內容。 https://developers.redhat.com/blog/author/rhatdan/

在沒有額外權限的情況下執行 SystemD 需要

/run作為 tmpfs。 /sys/fs/cgroup只讀。 /sys/fs/cgroup/systemd讀/寫。 /etc/machine-id需要包含一個 Uniqe MachineID SIGRTMIN+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

注意:當您的 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 作為主機。

引用自:https://serverfault.com/questions/607769