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