蓝易云

Docker 容器内执行宿主机的任何命令

499次阅读
没有评论

共计 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 端口,那么别人随意部署一个容器就能够操作你的机器。

提醒:本文发布于819天前,文中所关联的信息可能已发生改变,请知悉!

AD:【腾讯云服务器大降价】2核4G 222元/3年 1核2G 38元/年
正文完
 0
阿蛮君
版权声明:本站原创文章,由 阿蛮君 于2022-09-15发表,共计951字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
Copyright © 2022-2024 阿蛮君博客 湘ICP备2023001393号
本网站由 亿信互联 提供云计算服务 | 蓝易云CDN 提供安全防护和加速服务
Powered by Wordpress  Theme by Puock