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


12

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

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

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进行初始化的方法开始了。


systemd手册页将是一个良好的开端。Google还产生了几篇有关在docker下运行systemd的文章。
larsk's

您能解释一下为什么需要systemd吗?
030

Answers:


4

要在Docker容器中运行systemd,主机系统还必须运行systemd。这意味着您不能将Ubuntu用作主机。目前,我所知道的唯一的主机发行版是Fedora(与Ubuntu不同,它具有最新版本的Docker)或RHEL 7。


4
Arch Linux也使用systemd。
杰森·安特曼

8
从16.04开始的ubuntu默认使用systemd
Scott Stensland

4

这是我的主要pice:D与ubuntu在docker容器中运行systemd:D我在docker内部使用systemd的Ubuntu

我的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

6
从技术上讲这是可行的,但是您必须破坏容器的安全性才能做到这一点。这不适用于生产部署。
迈克尔·汉普顿

如今,使用更少的安全性标记可以更轻松
地实现thuis

2

由于种种原因,即缺少正确的权限,当前systemd在docker容器中无法正确运行。您可以在docker项目上的各种github问题中进行阅读,例如在docker arch容器挂起或segfaults中运行systemd以及有关init /进程监控的相关问题。(我想在这里链接更多的问题,但是由于我显然没有足够的声誉而无法这样做)。

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

显然,有些开发人员已经设法使其在fedora系统上运行,正如他们在Blog中所记录的那样


2

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


4
欢迎使用ServerFault。除了链接到解决方案之外,请在答案中包括其要点。这样,如果链接目标消失,您的答案将仍然有用。
Andrew Schulman

您链接到的文章包含非常有用的信息。为了使您的答案更完整,请总结其主要可行的建议(安装主机的建议除外/sys/fs/cgroup)。
阿米尔

以下是包含更多有用信息的后续文章:developers.redhat.com/blog/2016/09/13/…–
Amir

1

我可以从这里倒退:https : //registry.hub.docker.com/u/codekoala/arch/

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


1

尝试在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
systemctl show-environment为我祈祷Failed to get D-Bus connection: Unknown error -1。当我用一个--privileged标志而不是--cap-add SYS_ADMINdocker run -d --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name=ubuntu_systemd_test debian:jessie /sbin/init)启动容器时,systemctl像往常一样响应
czerasz

@twildfarmer谢谢。也适合任何尝试此方法的人。另一个已实现的Dockerfile
Vivek Kodira

0

从2018年开始,这现在对我有效:docker run -it -e container=docker your-image-name /sbin/init

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


您能否提供有关为此使用的图像的详细信息?我已经尝试过Ubuntu,Debian,Arch,Alpine和OpenSUSE,但它们都不起作用。二进制文件不存在或init无法打开资源。
编码
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.