Docker容器的命名空间与安全机制深度解析
1. 自定义Cgroup与容器关联
可以在Docker外部创建自定义的Cgroup,然后使用 docker container create
命令的 --cgroup-parent
参数将新容器附加到该Cgroup。一些调度器(如Kubernetes Pod)也会使用此机制在同一个Cgroup中运行多个容器。
2. 命名空间概述
在每个容器内部,尽管与系统上的其他进程共享内核,但容器拥有看似独有的文件系统、网络接口、磁盘等资源。这种隔离效果通过Linux命名空间实现,命名空间将传统的全局资源转换为容器独有的版本。
命名空间不像Cgroup那样容易在文件系统中探索,但大部分信息可在 /proc/*/ns/*
和 /proc/*/task/*/ns/*
目录下找到。在较新的Linux版本中, lsns
命令也很有用。
默认情况下,容器在多个资源上都有各自的命名空间,包括挂载、UTS、IPC、PID、网络、用户命名空间,以及部分实现的时间命名空间。下面详细介绍这些命名空间的作用:
- 挂载命名空间 :主要用于让容器拥有独立的文件系统,类似于 chroot jail
,但更强大,甚至挂载和卸载系统调用也被命名空间化。使用 docker container exec
或 nsenter
进入容器时,看到的文件系统根目录