为何Docker容器仅显示部分挂载点,unshare创建的命名空间可见全量挂载
unshare命令未创建独立mount namespace
你执行的unshare --pid --fork --mount-proc /bin/bash命令仅新增了PID namespace,没有添加--mount(或-m)参数,所以新启动的bash进程仍然和宿主机共享同一个mount namespace,自然可以看到宿主机所有挂载信息。其中--mount-proc参数的作用仅为新的PID namespace挂载对应的/proc文件系统,不会触发mount namespace的创建。mount namespace默认行为与Docker的定制化隔离逻辑不同
就算你添加--mount参数为unshare创建独立的mount namespace,其默认行为也是完整复制父namespace(宿主机)的所有挂载条目,不会主动删除任何挂载信息,你依然能看到所有宿主机挂载。
而Docker创建容器时会对mount namespace做大量专属的隔离处理:- 执行
pivot_root系统调用,将容器的根目录替换为镜像对应的rootfs(示例中为ubuntu镜像的文件系统),原宿主机的根目录会被移出容器的文件树 - 主动卸载所有容器不需要的宿主机挂载点,比如宿主机的/boot、/run/user、/var/lib/docker相关的overlay挂载等,仅保留容器运行必须的挂载:比如overlay根文件系统、/dev的tmpfs、cgroup挂载、/etc/hosts等绑定挂载
- 将容器内挂载的传播属性设置为
private,既避免容器内的挂载操作同步到宿主机,也不会继承宿主机后续新增的挂载
- 执行
内容的提问来源于stack exchange,提问作者django
相关产品推荐
相关产品推荐

