AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 607769
Accepted
Michael Neale
Michael Neale
Asked: 2014-06-26 01:26:59 +0800 CST2014-06-26 01:26:59 +0800 CST 2014-06-26 01:26:59 +0800 CST

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

  • 772

我正在尝试查看是否可以在 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 启动事物。

arch-linux
  • 7 7 个回答
  • 41307 Views

7 个回答

  • Voted
  1. frank-dspeed
    2014-12-21T19:16:14+08:002014-12-21T19:16:14+08:00

    这是我的主图: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/

    • 5
  2. Michael Hampton
    2014-07-03T04:45:00+08:002014-07-03T04:45:00+08:00

    要在 Docker 容器中运行 systemd,主机系统也必须运行 systemd。这意味着您不能使用 Ubuntu < 16.04 作为主机。

    • 4
  3. Alexander Jung-Loddenkemper
    2014-07-25T00:08:17+08:002014-07-25T00:08:17+08:00

    目前 systemd 不能在 docker 容器中正确运行,原因有很多,即缺乏正确的权限。您可以在 docker 项目的各种 github 问题中阅读相关内容,例如在 docker arch 容器中运行 systemd 挂起或段错误以及有关初始化/进程监控的相关问题。(我想在这里链接更多问题,但我不能,因为我显然没有足够的声誉)。

    正如您所看到的,这是一个当前正在研究的主题,并且已经合并了一些补丁以改善行为,因此我们可以期待它很快就会起作用。

    显然,一些开发人员已经设法让它在 Fedora 系统上运行,正如他们在博客中所记录的那样。

    • 3
  4. Best Answer
    Michael Neale
    2014-07-08T01:32:18+08:002014-07-08T01:32:18+08:00

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

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

    • 1
  5. Tony H
    2015-03-13T19:08:38+08:002015-03-13T19:08:38+08:00

    您可以在 docker 容器中运行 systemd。主机操作系统无关紧要,尽管您需要挂载主机的 /sys/fs/cgroup 卷。我按照本指南让它工作:http: //developerblog.redhat.com/2014/05/05/running-systemd-within-docker-container/

    • 1
  6. twildfarmer
    2016-11-05T13:57:43+08:002016-11-05T13:57:43+08:00

    尝试在 debian:8 官方容器中执行此操作时发现此问题。对于尝试在官方 debian:8 (debian:jessie) 容器上执行此操作的任何其他人,@Frank-from-DSPEED 的答案只需稍作修改即可,如旧 git hub 帖子中所述:

    docker run -d \
        -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
        --cap-add SYS_ADMIN \
        debian:jessie  /sbin/init
    docker exec -it <your-new-container-name-or-ID> bash
    

    然后从容器中:

    systemctl show-environment
    

    这对我来说非常有效,因为这只是一个开发环境,所以安全问题对我来说并不重要。

    注意:/sbin/init 命令使 /sbin/init 成为进程 1,这是完成这项工作的关键部分。

    • 1
  7. Robin Green
    2018-06-10T01:40:56+08:002018-06-10T01:40:56+08:00

    截至 2018 年,这对我有用:docker run -it -e container=docker your-image-name /sbin/init

    但是,这不会给您一个 shell,因此您需要首先在映像中启用一些 systemd 服务(例如 sshd)(如果尚未启用),以执行任何有用的操作。

    • 1

相关问题

  • 哪个守护进程在archlinux中实现afp文件共享?

  • Arch Linux 不挂载两个 U 盘?

  • 从其他计算机访问 Webmin [关闭]

  • Arch Linux 上的 VPN 服务器

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve