第一章:当容器开始“叛逆”:一场无声的“越狱”
想象一下,你精心打造了一个Docker容器,它像一个乖巧的租客,住在你宿主机(房东)精心划分的“隔离公寓”(命名空间)里。你给它分配了CPU、内存,以为万事大吉。但某天夜里,这个“租客”突然开始凿墙、改水电、甚至试图复制你家大门的钥匙!这不是恐怖故事,这就是Docker文件系统失控的真实写照。
默认情况下,一个docker run出来的容器,拥有一个可读写的文件系统。它确实被限制在自己的“房间”里,但问题在于:
- 它可以在自己的房间里为所欲为:疯狂写日志直到撑爆磁盘,安装恶意软件,或篡改自身的应用逻辑。
- 它可能通过“秘密通道”溜出来:如果你不小心将宿主机的敏感目录(如
/,/etc)挂载到容器内,它就有了直接修改宿主机的“尚方宝剑”。
这种“叛逆”行为的后果是灾难性的:数据泄露、服务中断、甚至宿主机完全沦陷。所以,对文件系统的控制,不是可选项,而是安全运行的生命线。
第二章:修炼“金钟罩”第一式:让根文件系统“只读”(--read-only)
最根本的解决方案是什么?就是让这个“租客”变成只能看、不能碰的“参观者”。Docker提供了 --read-only 这个强大的标志,能让容器的根文件系统变为只读。
原理浅析:
当我们启动一个容器时,Docker会为其创建一个可写层(读写层),所有对文件系统的修改都会发生在这里。使用 --read-only 后,Docker会直接移除这个可写层。任何试图写入根文件系统的操作(比如创建文件、修改系统配置)都会触发 Read-only file system 错误,从而被立即终止。
试试看:
首先,我们让一个“活泼好动”的容器(以Ubuntu为例)尝试搞点破坏。
# 运行一个普通容器,尝试创建一个文件
docker run -it --rm ubuntu:20.04 touch /home/test.txt
# 执行成功,容器安静地退出,因为它完成了任务。
# 现在,启动一个交互式容器,并让它只读
docker run -it --rm --read-only ubuntu:20.04 bash
进入容器后,我们故技重施:
root@容器ID:/# touch /home/

最低0.47元/天 解锁文章
263

被折叠的 条评论
为什么被折叠?



