如“用户命名空间已到达 Docker! ”(Phil Estes,ESTESP)中详述,这将在 docker 1.9(2014 年 11 月)的实验分支中可用。公关 12648。
用户命名空间最重要的特性之一是它允许容器对 uid 和 gid 范围有与主机系统不同的视图。
具体来说,可以为一个进程(在我们的例子中是容器内的进程)提供一组来自主机 uid 和 gid 空间的映射,这样当进程认为它以 uid 0 运行时(通常称为“root”),它实际上可能以 uid 1000、10000 甚至 34934322 运行。这完全取决于我们在用户命名空间内创建进程时提供的映射。
当然,应该清楚的是,从安全角度来看,这是一个很棒的功能,因为它允许我们的容器继续以 root 权限运行,但实际上在主机上没有任何 root 权限。
在“实验性:用户命名空间支持”文档页面上查看更多信息(对于实验性 docker build,来自Experimental.docker.com )。
docker daemon --userns-remap=default
请注意,在运行启用了实验性用户命名空间的 Docker 守护程序时,某些标准 Docker 功能当前不兼容,例如与主机( 、 等)或与其他容器共享命名--pid=host
空间--net=host
。
这种用户映射能力目前是每个守护进程,而不是每个容器(这需要一个正在工作的 Linux 内核演进,但不是)。与主机共享命名空间(--pid=host、--net=host 等)
最后:
由于需要通过提供的映射来隔离 Docker 守护程序的本地图层数据缓存中的内容,一旦您使用带有用户命名空间的实验性构建,您的图形目录的根目录(/var/lib/docker
默认情况下)将有一个额外的间接级别,它与到重新映射的根 uid 和 gid。
例如,如果我提供给标志的重映射用户--userns-remap
具有以 ID 开头的从属用户和组范围10000
,则使用该重映射设置运行的所有图像和容器的图形目录的根目录将驻留在/var/lib/docker/10000.10000
.
如果您使用实验版本但不提供用户命名空间重映射,您当前的内容将被迁移到/var/lib/docker/0.0
以将其与重映射的图层内容区分开来。