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

我试图看看我是否可以在docker容器(在容器中运行arch linux)中运行systemd

我使用所有function启动docker,并在cgroup中绑定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启动的东西。

在这里,我的主要小品:D在docker容器中运行systemd与ubuntu:D我得到了Ubuntu与systemd里面的docker

GitHub回购我的docker系统的容器

 $ 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 

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

您可以在Docker容器内运行systemd。 主机操作系统无关紧要,但您需要挂载主机的/ sys / fs / cgroup卷。 我按照这个指南开始工作: http : //developerblog.redhat.com/2014/05/05/running-systemd-within-docker-container/

目前,由于一整套原因,缺less正确的权限,systemd在Docker容器内无法正常运行。 您可以在Docker项目中的各种github问题上阅读这些内容,例如在docker arch容器挂载或segfaults以及有关init / process监视的相关问题中运行systemd 。 (我想在这里链接更多的问题,但我不能,因为我显然没有足够的声誉)。

正如你所看到的,这是一个目前正在研究的话题,已经有一些补丁已经被合并,以改善行为,所以我们可以期待这个工作很快就会开始。

显然,一些开发者已经设法让它在Fedora系统上运行,就像他们在他们的博客中logging的一样 。

发现这个问题,而试图在debian中做到这一点:8官方容器。 对于任何试图在官方的debian:8(debian:jessie)容器上执行此操作的人,@Flank-from-DSPEED的答案只需稍作修改即可,如旧git中心post中所述 :

 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,这是进行此项工作的关键部分。

我能够从这个工作倒退: https : //registry.hub.docker.com/u/codekoala/arch/

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