从docker容器重新启动主机

从docker容器重新启动主机,docker,Docker,如标题所示,是否可以从容器重新启动主机?我有一个docker容器运行systemd,如下所述,并以以下方式启动: $ docker run -privileged --net host -ti -d -v /sys/fs/cgroup:/sys/fs/cgroup:ro <image_name> 主机不会重新启动。但是,我在主机的内核缓冲区上看到了[1915595.016950]systemd journald[17]:从PID 1(systemd shutdow)接收到SIGTE

如标题所示,是否可以从容器重新启动主机?我有一个docker容器运行systemd,如下所述,并以以下方式启动:

$ docker run -privileged --net host -ti -d -v /sys/fs/cgroup:/sys/fs/cgroup:ro <image_name>
主机不会重新启动。但是,我在主机的内核缓冲区上看到了
[1915595.016950]systemd journald[17]:从PID 1(systemd shutdow)接收到SIGTERM

用例:

我正在尝试在容器中运行,一些测试会重新启动主机,因此,如果可以从容器中重新启动主机,则测试可以不加更改地运行

更新

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


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

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


其他init系统(如upstart)未经测试。

我能够将sysrq命令作为卷发送到主机

这启动了主机

docker-server# docker run -i -t -v /proc/sysrq-trigger:/sysrq centos bash
docker-container# echo b > /sysrq
您可以在主机上的
/proc/sys/kernel/sysrq
上设置位掩码权限,以仅允许同步磁盘和引导。有关此操作的详细信息,请访问,但类似的内容(未测试)应设置这些权限:

echo 144 > /proc/sys/kernel/sysrq

另外,请记住将
kernel.sysrq=144
添加到
/etc/sysctl.conf
中,以便在重新启动时保存它。

我在上面的问题中遗漏了一个细节,即一旦我在容器中运行了
systemd
,则
systemctl重新启动
就是(粗略地说)连接到容器本身上的
systemd
,这不是我想要的

根据一位同事的提示,以下是我对“库存”软呢帽图像所做的操作(没有什么特别之处):

然后在容器中:

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 
因此,可以从容器中重新启动主机


这里需要注意的一点是,主机运行Fedora20,容器也运行Fedora20。如果主机是另一个未运行
systemd
的发行版,则这是不可能的。一般来说,如果主机和容器运行的发行版未运行systemd或systemd的不兼容版本,则这将不起作用。

添加到user59634的答案中:

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

但你需要的唯一插座是

docker run-it--rm-v/run/systemd/private:/run/systemd/private fedora重启

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

无关相似信息 睡眠/挂起/休眠只能使用
-v/sys/power/state:/sys/power/state
,例如使用
/lib/systemd/systemd sleep suspend
。如果您知道如何,可以将字符串直接回显到
/sys/power/state
,例如
echo mem>/sys/power/state
,了解有关从
cat/sys/power/state
获得的不同选项的更多说明

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

,谢谢!不过,现在有一些对我有用的东西被贴出来作为答案。到目前为止已经测试过了:Fedora主机上的Fedora容器,Fedora主机上的Ubuntu容器。接受这个答案,因为它不依赖于容器和主机OS init系统是否相同/兼容。非常好的小费!在Ubuntu16.04上,这是可行的,因此只安装/run/dbus。但我必须说,我更喜欢59634的解决方案,而不是将所有DBU提供给一个容器。此外,您只需要挂载/运行/systemd/private。我不知道这有多危险,但至少比所有的/rub/systemd都要小
bash-4.2# reboot 
docker run -d --name network_monitor --net host --restart always --privileged --security-opt apparmor=unconfined  --cap-add=SYS_ADMIN \
-v /proc:/proc \
$IMAGE_URI