woodongwong / notes

4 stars 0 forks source link

笔记:使用Linux user namespace修复Docker volumes权限 #48

Open woodongwong opened 4 years ago

woodongwong commented 4 years ago

我对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,内容如下:

woodong:1000:1
woodong:100000:65536

第一行的目的是将root用户所创建的文件都属于uid为1000的用户。 第二行的目的是将其他用户所创建的文件都属于100000+,比如uid为1023的用户创建的文件的所属者为101023。

然后修改/etc/subgid,内容如下:

woodong:999:1
woodong:100000:65536

其目的是和subuid一样,999对应的用户组docker。

修改/etc/docker/daemon.json为以下内容:

{
  "userns-remap": "woodong"
}

“告诉”docker使用woodonguser namespace。 然后重启docker。重启docker后,我发现之前的容器和image都不见了,最后我发现在/var/lib/docker/目录下多了一个1000.999目录,里面的目录结构和/var/lib/docker/是一样的,我尝试把/var/lib/docker/中的文件和目录放在了/var/lib/docker/1000.999/下,并且修改了所有者和所属组:

drwx------   2 root    root    4096 Apr 25  2018 builder
drwx------   4 root    root    4096 Jul 19  2018 buildkit
drwx--x--x   3 root    root    4096 Apr 25  2018 containerd
drwx------  16 woodong docker 12288 Jan 23 13:58 containers
drwx------   3 root    root    4096 Apr 25  2018 image
drwxr-x---   3 root    root    4096 Apr 25  2018 network
drwx------ 270 woodong docker 36864 Jan 23 13:58 overlay2
drwx------   4 root    root    4096 Apr 25  2018 plugins
drwx------   2 root    root    4096 Jan 22 16:02 runtimes
drwx------   2 root    root    4096 Apr 25  2018 swarm
drwx------   2 woodong docker  4096 Jan 22 16:03 tmp
drwx------   2 root    root    4096 Apr 25  2018 trust
drwx------  66 woodong docker 12288 Nov 19 11:17 volumes

重启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/