在ubuntu14.04 docker容器中安装systemd - 有可能吗?

时间:2017-01-08 19:21:22

标签: docker ubuntu-14.04 openstack systemd devstack

我试图在docker容器中安装和配置openstack(devstack)。安装时遇到以下错误

"无法获得D-Bus连接:没有与服务管理器的连接。"

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

$>systemd

我得到以下输出。

尝试作为用户实例运行,但系统尚未使用systemd启动。

以下是使用的东西。

主机操作系统:Ubuntu 14.04, Docker版本:Docker版本1.12.4,build 1564f02, Docker Container OS:Ubuntu 14.04

任何人都可以提供帮助。提前谢谢。

4 个答案:

答案 0 :(得分:2)

首先,systemd期望安装/sys/fs/cgroup。此外,您必须使容器具有特权,否则会发生这种情况:

operation not permitted

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

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

operation is permitted!

systemd正常运行(半)之后,您只需使用docker stop来停止容器。

这篇帖子是基于我自己的研究,也是几周的研究,对于我想打电话initbuntu的项目(最初我试图让init运行,但正在运行{{1}在我所有失败的尝试之后,直接是我唯一的解决方案)。该容器将在Docker Hub上以systemd Soon™ 的形式提供。现在,在发布时可以获得一份破损的副本(或者没有破坏,我不知道)。

来源(有点):

  • / sys / fs / cgroup:Here
  • logandark/initbuntu:StackOverflow帖子我丢失了链接。

答案 1 :(得分:2)

Docker项目上的现有DevStack

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

建立自己的形象

在Docker中运行systemd当然是可行的,并且已经完成before。我发现Ubuntu 16.04 LTS是Docker主机以及基本映像的良好基础。

您的systemd / DevStack Dockerfile需要此配置,它还会清除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,那么启动它可以省去很多麻烦,而不是定义单独的安全功能和卷:

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

要在新的systemd容器中获取bash,请尝试:

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

答案 2 :(得分:1)

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

" Systemd无法在没有SYS_ADMIN的情况下运行,权限少于未胜任的权限(参见#2296(评论))。是的,它可以使它变得更容易" (一种自动设置这些的工具),但它仍然需要某些特权"

请参阅此Github issue

毕竟docker是一个应用程序容器并且它运行您在运行时指定的进程,在完成该进程后它将退出。可能是您需要一个OS容器或虚拟机来处理您的用例。请参阅操作系统容器与应用程序容器here

答案 3 :(得分:0)

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

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