从Docker容器重新启动主机

正如标题所示,是否有可能从容器重新启动主机? 我有一个docker容器运行在systemd中,如下所述,并启动为:

$ docker run -privileged --net host -ti -d -v /sys/fs/cgroup:/sys/fs/cgroup:ro <image_name> 

一旦我发出systemctl reboot命令,我看到:

 # systemctl reboot [root@dhcp-40-115 /]# [3]+ Stopped 

主机不重启。 但是,我看到[1915595.016950] systemd-journald[17]: Received SIGTERM from PID 1 (systemd-shutdow). 在主机的内核缓冲区。

用例:

我正在尝试在容器中运行约束testing工具 ,一些testing重新启动主机,因此如果可以从容器中进行testing,则testing可以保持不变。

更新

正如我在答复中提到的那样:

有一个细节我错过了在我上面的问题,这是一旦我有systemd在容器本身运行,systemctl重新启动(粗略地说)连接到容器本身systemd而不是我想要的。

被接受的答案的优点是它不依赖于主机和容器发行版具有兼容的systemd 。 但是,在一个设置,我的答案是我认为是一个更可接受的,因为你可以使用通常的reboot命令。

其他初始化系统如upstart未经testing。

我能够将sysrq命令作为卷发送到主机挂载/proc/sysrq-trigger

这启动了主机。

 docker-server# docker run -i -t -v /proc/sysrq-trigger:/sysrq centos bash docker-container# echo b > /sysrq 

您可以在主机上的/proc/sys/kernel/sysrq上设置一个位掩码权限,以允许例如同步磁盘和启动。 有关这方面的更多信息在http://en.wikipedia.org/wiki/Magic_SysRq_key但是像这样(未经testing)应该设置这些权限&#xFF1A;

 echo 144 > /proc/sys/kernel/sysrq 

还要记得把kernel.sysrq = 144添加到/etc/sysctl.conf以便在重新启动时保存它。

有一个细节我错过了在我上面的问题,这是一旦我有systemd在容器本身运行, systemctl reboot (粗略地说)连接到容器本身systemd而不是我想要的。

在一位同事的暗示下,我做了一个“股票”fedora图像(没有什么特别的):

 $ docker run -ti -v /run/systemd:/run/systemd fedora /bin/bash 

然后在容器中:

 bash-4.2# systemctl status docker docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled) Active: active (running) since Tue 2014-07-01 04:57:22 UTC; 2 weeks 0 days ago Docs: http://docs.docker.io Main PID: 2589 CGroup: /system.slice/docker.service 

在这里,容器可以访问主机上的systemd 。 然后,发出reboot命令实际上会重新启动主机:

 bash-4.2# reboot 

因此,可以从容器重新启动主机。

这里需要注意的是主机运行的是Fedora 20,容器也是如此。 如果主机是一个不运行systemd的不同的发行systemd ,这是不可能的。 一般来说,如果主机和容器正在运行不在systemd或systemd不兼容版本的发行版,则不起作用。