在ubuntu14.04 docker container中安装systemd – 可能吗?

我试图在Docker容器中安装和configurationopenstack(devstack)。 安装时出现以下错误

“无法获得D-Bus连接:没有连接到服务pipe理器。”

后来我查了一下,发现是因为系统问题。 当我尝试执行命令systemd

$>systemd 

获得以下输出。

尝试以用户实例身份运行,但系统尚未使用systemd引导。

以下是使用的东西。

主机操作系统:Ubuntu 14.04,Docker版本:Docker版本1.12.4,版本1564f02,Docker容器操作系统:Ubuntu 14.04

任何人都可以在这帮助。 提前致谢。

首先, systemd需要挂载/sys/fs/cgroup 。 此外,您必须使容器具有特权,否则会发生这种情况:

操作不允许

 docker run -v /sys/fs/cgroup:/sys/fs/cgroup:ro --privileged -it --rm ubuntu 

然后,你可以继续运行/bin/systemd --system --unit=basic.target ,它应该正常运行(当然有一些错误,因为Docker没有虚拟化整个系统,也不是library:ubuntu图像超过了正常运行所需的最小尺寸):

操作是允许的!

系统正常运行(半)之后,您可以简单地使用docker stop来停止容器。


这篇文章是基于我自己的研究,也是几个星期,对于一个我喜欢调用initbuntu的项目initbuntu (原来我试图让init运行,但是直接运行systemd是我所有失败尝试后唯一的解决scheme)。 容器将在Docker Hub上作为logandark/initbuntuSoon™提供 。 现在,在发布的时候,可以在那里find一份破损的副本(或者没有损坏,我不知道)。

来源(有点):

  • / sys / fs / cgroup: 这里
  • systemd --system :一个StackOverflow后,我失去了链接。

Docker项目上现有的DevStack

首先,您可以在Docker上使用DevStack Ocata / Pike获取预configuration的Dockerfile。 存储库还包含有关DevStack和容器的更多信息。

build立你自己的形象

在Docker中运行systemd肯定是可行的, 之前已经完成。 我发现Ubuntu 16.04 LTS是Docker主机以及基本映像的良好基础。

你的systemd / Dockerfile需要这个configuration,它也清理了Docker容器内可能不需要的服务:

 FROM ubuntu:16.04 ##################################################################### # Systemd workaround from solita/ubuntu-systemd and moby/moby#28614 # ##################################################################### ENV container docker # No need for graphical.target RUN systemctl set-default multi-user.target # Gracefully stop systemd STOPSIGNAL SIGRTMIN+3 # Cleanup unneeded services RUN find /etc/systemd/system \ /lib/systemd/system \ -path '*.wants/*' \ -not -name '*journald*' \ -not -name '*systemd-tmpfiles*' \ -not -name '*systemd-user-sessions*' \ -exec rm \{} \; # Workaround for console output error moby/moby#27202, based on moby/moby#9212 CMD ["/bin/bash", "-c", "exec /sbin/init --log-target=journal 3>&1"] 

如果您打算在容器中运行OpenStack / DevStack,那么可以为您启动权限而不是定义单独的安全function和容量,从而为您节省很多麻烦:

 docker run \ --name devstack \ --privileged \ --detach \ image 

要在你的新systemd容器中得到一个bash,试试这个:

 docker exec \ --tty \ --interactive \ devstack \ bash 

Systemd应该在正确configuration的容器内工作。 你可以以特权的心情运行容器来运行systemd。

“Systemd不能在没有SYS_ADMIN的情况下运行,比这更less的特权将不起作用(请参阅#2296(注释))。是的,可以使它更容易(一个自动设置这些的工具),但它仍然需要某些权限“

看到这个Github的问题

毕竟Docker是一个应用程序容器,它运行你在运行时指定的进程,完成该进程后将退出。 可能是你需要一个操作系统容器或虚拟机用于你的用例。 在这里看到OS容器vs应用程序容器

在大多数情况下,出现错误消息是因为安装程序试图运行“systemctl start”。 与initscripts不同,systemctl命令不会直接尝试执行启动脚本 – 而是尝试联系systemd守护程序来执行服务的启动顺序。 所以所有的服务在systemd守护进程中都有一个共同的父节点。

在Docker容器中运行一个systemd守护进程只是为了启动一个服务。 您可以使用systemctl-docker-replacement覆盖/ usr / bin / systemctl,在这种情况下,目标服务在没有systemd守护进程的帮助下启动。 它直接从* .service文件运行ExecStart。