8 docker
如标题所示,是否可以从容器重新启动主机?我有一个使用systemd运行的docker容器,如下所述,并启动为:
$ docker run -privileged --net host -ti -d -v /sys/fs/cgroup:/sys/fs/cgroup:ro <image_name>
Run Code Online (Sandbox Code Playgroud)
一旦我发出systemctl reboot命令,我看到:
# systemctl reboot
[root@dhcp-40-115 /]#
[3]+ Stopped
Run Code Online (Sandbox Code Playgroud)
主机不会重启.但是,我[1915595.016950] systemd-journald[17]: Received SIGTERM from PID 1 (systemd-shutdow).在主机的内核缓冲区上看到了.
使用案例:
我正在尝试在容器中运行约束测试工具,并且一些测试会重新启动主机,因此如果可以从容器执行此操作,则测试可以保持不变.
更新
正如我在回答中提到的那样:
我在上面的问题中遗漏了一个细节,一旦我在容器本身运行systemd,systemctl reboot(粗略地说)连接到容器本身的systemd,这不是我想要的.
接受的答案的优点是它不依赖于主机并且容器发行版具有兼容性systemd.但是,在它们所处的设置中,我的答案是我认为更可接受的答案,因为您可以使用通常的reboot命令.
其他初始系统如upstart未经测试.
小智 7
我在上面的问题中遗漏了一个细节,一旦我systemd在容器本身运行,systemctl reboot就是(粗略地说)连接到systemd容器本身,这不是我想要的.
在一位同事的暗示下,这是我在"股票"Fedora图像上所做的事情(没什么特别的):
$ docker run -ti -v /run/systemd:/run/systemd fedora /bin/bash
Run Code Online (Sandbox Code Playgroud)
然后在容器中:
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
Run Code Online (Sandbox Code Playgroud)
这里,容器能够systemd在主机上访问.然后,发出reboot命令实际上重新启动主机:
bash-4.2# reboot
Run Code Online (Sandbox Code Playgroud)
因此,可以从容器重新启动主机.
这里需要注意的是主机正在运行Fedora 20,容器也是如此.如果主机是不同的发行版没有运行systemd,这是不可能的.一般来说,如果主机和容器正在运行未运行systemd或不兼容的systemd版本的发行版,则这将不起作用.
我能够将sysrq命令/proc/sysrq-trigger作为卷发送到安装的主机。
这启动了主机。
docker-server# docker run -i -t -v /proc/sysrq-trigger:/sysrq centos bash
docker-container# echo b > /sysrq
Run Code Online (Sandbox Code Playgroud)
您可以/proc/sys/kernel/sysrq在主机上设置位掩码权限,以仅允许例如同步磁盘并启动。有关此问题的更多信息,请访问http://en.wikipedia.org/wiki/Magic_SysRq_key,但类似(未经测试)的内容应设置这些权限:
echo 144 > /proc/sys/kernel/sysrq
Run Code Online (Sandbox Code Playgroud)
还记得添加kernel.sysrq = 144以/etc/sysctl.conf使其在重新启动后保存。
| 归档时间: |
|
| 查看次数: |
6023 次 |
| 最近记录: |