在 docker 容器中執行 systemd (arch linux)
我正在嘗試查看是否可以在 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 @ 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
注意:當您的 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 作為主機。