共计 951 个字符,预计需要花费 3 分钟才能阅读完成。
我们知道,使用 Docker 是可以隔离环境的。
如果说不想让自己的宿主机环境变得乱七八糟,那么在容器内进行开发也未尝不可,现在也很多人是通过构建容器后,使用 vscode 等开发工具 ssh 到容器内部进行开发。
但是有时候比较特殊的容器又比较依赖宿主机的某些命令,这时候该怎么办?
比如说 nut (NetworkUpsTools),这是一个 ups 容器。在断电时,需要发送关机指令,不让硬盘损坏。
但如果是直接在容器内使用 shutdown -h
命令,结果将会是提示命令不存在,即使将命令映射进去也不行。
[root@localhost ~]# docker exec -it test sh
/ # shutdown -h
sh: shutdown: not found
后来百度时,偶然看见一个解决的办法,那就是将宿主机的全部文件映射到容器内,通过 chroot
命令能够完成。
具体操作如下:
# 这里演示的话,就不用 ups 容器了
[root@localhost ~]# docker run -d --name test -v /:/host alpine tail -f /dev/null
[root@localhost ~]# docker exec -it test chroot /host shutdown -h
Shutdown scheduled for Thu 2022-09-15 14:20:43 CST, use 'shutdown -c' to cancel.
# systemctl 命令同样可以运行
[root@localhost ~]# docker exec -it test chroot /host systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
不出意外的话,执行这两条指定后,机器将在一分钟后关机。
通过这种方式,可以实现在容器内拥有宿主机的命令。
其实很危险,如果服务器恰巧没有加密开放 docker 的 2375 端口,那么别人随意部署一个容器就能够操作你的机器。
提醒:本文发布于797天前,文中所关联的信息可能已发生改变,请知悉!
AD:【腾讯云服务器大降价】2核4G 222元/3年 1核2G 38元/年
正文完