linux在很久之前就已经支持namespace,维基百科上写着初始发行时间为2002年,user namespace是在linux 3.8中完成的。Docker 1.10 版本之前,是不支持 user namespace。我对docker中使用linux
user namespace的了解非常浅,在我脑海中是这样理解的:docker中的用户与宿主机上的用户有一个映射,比如docker中的root可以映射到宿主机上的www用户,docker中的文件所有者为root,实际上等于宿主机上www用户为该文件的所有者。(理解的就是这么浅显)
我对Docker的认知一直处于入门级别,虽然使用了很多年,并没有在生产环境使用的经验。一开始使用Docker时我就遇到一个问题:Docker中的root用户创建的文件居然在宿主机中也是root,即使我是使用其他用户创建的容器。
这个问题困扰了我好久,一直都是使用sudo来修改宿主机上的文件的,既然能临时解决问题,也就没有仔细去研究和寻找恰当的解决方案。最近在想,如果生产环境还是这样的话,那么会有多问题。想到这里才认真的去寻找一下恰当的解决方案。
linux在很久之前就已经支持namespace,维基百科上写着初始发行时间为2002年,user namespace是在linux 3.8中完成的。Docker 1.10 版本之前,是不支持 user namespace。我对docker中使用linux user namespace的了解非常浅,在我脑海中是这样理解的:docker中的用户与宿主机上的用户有一个映射,比如docker中的root可以映射到宿主机上的www用户,docker中的文件所有者为root,实际上等于宿主机上www用户为该文件的所有者。(理解的就是这么浅显)
目前我机器上的用户名为
woodong
,UID是1000,用户组docker
的GID是999,我的目的是让docker容器内的root用户创建的文件在宿主机上对应所有者和所属组是woodong:docker。根据网上的一些教程,我修改了/etc/subuid
,内容如下:第一行的目的是将root用户所创建的文件都属于uid为1000的用户。 第二行的目的是将其他用户所创建的文件都属于100000+,比如uid为1023的用户创建的文件的所属者为101023。
然后修改
/etc/subgid
,内容如下:其目的是和subuid一样,999对应的用户组docker。
修改
/etc/docker/daemon.json
为以下内容:“告诉”docker使用
woodong
user namespace。 然后重启docker。重启docker后,我发现之前的容器和image都不见了,最后我发现在/var/lib/docker/
目录下多了一个1000.999
目录,里面的目录结构和/var/lib/docker/
是一样的,我尝试把/var/lib/docker/
中的文件和目录放在了/var/lib/docker/1000.999/
下,并且修改了所有者和所属组:重启docker后,docker ps -a、docker images, 一切正常,新建的容器内,root创建的文件所属也是woodong:docker。
最后将现有的volumes所属改称woodong:docker。
参考: https://en.wikipedia.org/wiki/Linux_namespaces https://www.jujens.eu/posts/en/2017/Jul/02/docker-userns-remap/