从docker容器重新启动主机

时间:2014-07-15 05:01:25

标签: docker

如标题所示,是否可以从容器重启主机?我有一个使用systemd运行的docker容器,如here所述,并以:

开头
$ 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).

使用案例

我正在尝试在容器中运行restraint test harness并且一些测试会重新启动主机,因此如果可以从容器中执行此操作,则测试可以保持不变。

更新

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

  

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

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

upstart等其他初始化系统未经测试。

4 个答案:

答案 0 :(得分:5)

我在上面的问题中遗漏了一个细节,一旦我在容器中运行systemdsystemctl 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版本的发行版,则无法使用。

答案 1 :(得分:4)

我能够将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,但此类内容(未经测试)应设置这些权限:

echo 144 > /proc/sys/kernel/sysrq

另请注意将kernel.sysrq = 144添加到/etc/sysctl.conf,以便在重新启动后保存。

答案 2 :(得分:0)

添加到user59634的答案:

-v /run/systemd:/run/systemd适用于fedora 27和ubuntu 16

但你需要的唯一插座是

docker run -it --rm -v /run/systemd/private:/run/systemd/private fedora reboot

您也可以使用/run/dbus,但我更喜欢这种systemd方法。我不完全了解你给容器多少力量,我怀疑它足以接管你的主机。所以我只建议在你编写的容器中使用它,然后与任何其他容器通信,参见here

无关的类似信息

只能使用-v /sys/power/state:/sys/power/state并使用/lib/systemd/systemd-sleep suspend进行休眠/暂停/休眠。如果您知道如何操作,则可以直接将字符串回显到/sys/power/state,例如echo mem > /sys/power/state here,以获取有关cat /sys/power/state

的不同选项的更多说明

答案 3 :(得分:0)

docker run -d --name network_monitor --net host --restart always --privileged --security-opt apparmor=unconfined  --cap-add=SYS_ADMIN \
-v /proc:/proc \
$IMAGE_URI

docker 容器必须被授予足够的权限才能挂载 /proc