--userns-remap
容器用户映射宿主机用户的方式来解决问题,具体的方法描述如下:,用户和组的映射由两个配置文件来控制,分别是/etc/subuid
和/etc/subgid
。,subuid(sub子uid用户id):对于subuid的这一行表示,宿主机用户zimug的用户ip段为[100000,10000+65535]。也就是说,使用zimug这个宿主机启动容器,容器内的用户uid与宿主机内的用户uid存在关系。也就是说按照上面的配置:,,既然root用户的提权问题解决了,我们就要解决下一个问题:docker的守护进程是root权限的,即运行docker守护进程的用户仍然是root。我们需要做如下修正:,,也就是我们要在非root用户下安装docker,并启动docker守护进程,这种安装及运行模式被称为“RootLess”模式。可以安装但是存在先决条件:“RootLess”模式是在 Docker Engine v19.03 中作为实验性功能引入的,从 Docker Engine v20.10 开始提供正式使用。,需要安装newuidmap
和newgidmap
工具shadow-utils,即配置上文中的/etc/subuid
和/etc/subuid
需要这两个工具的支持。安装之前使用yum list installed shadow-utils
确认下是否已经安装过或者操作系统自带,如果存在就不要安装了,但第三步的配置是需要的。第一步:添加一个软件包安装源,该源下面包含
shadow-utils46-newxidmap
,第二步: yum install -y shadow-utils46-newxidmap
第三步:在
/etc/sysctl.conf
文件中修改系统参数user.max_user_namespaces = 28633
,修改完成之后执行sysctl --system
命令让参数生效。,该参数默认值是0,即不允许操作系统用户存在subuid空间。上面的操作完成之后使用sysctl --all --pattern user_namespaces
命令验证修改的结果。,root用户下确保已经执行下列命令进行用户id关系配置,我已经新建了一个linux用户zimug,使用su - zimug
切换到该用户下,执行安装脚本,该安装脚本需要连网。,脚本执行完成之后,显示的内容如下:,,将上图中安装过程提示的export内容添加到 ~/.bashrc
文件中,添加完使用source ~/.bashrc
命令使环境变量生效。注意:你的环境变量和我的一定不一致,要copy上图中红色部分。,在zimug用户下使用下面的脚本启动docker守护进程,该脚本在上文中的环境变量PATH目录下,所以我们不用写全路径。注意:我们这里使用了 --experimental --storage-driver vfs
参数启动,因为我的linux内核版本比较低所以需要加这个参数,后文我会说明原因。,启动一个容器我们尝试一下,注意宿主机映射的端口不能小于1024,因为linux非root用户不能使用1024以下的端口。,访问nginx服务看到界面就证明nginx服务没有问题,同时注意宿主机防火墙开放8080端口访问,这个我就不说了。,官方文档说的是known-limitations,也就是已知的受限因素是下面这些,未知的受限因素还不一定有多少呢。所以笔者针对rootless模式目前也只是研究,还没有在生产上能够正式使用(2022年4月6日)。虽然它很安全,但是如果坑太多的话,我也受不了啊。,在非root用户(我用的是zimug用户)下执行下列命令,完成docker rootless卸载第一步:,第二步:,第三步: 把上文中在
~/.bashrc
文件中添加的环境变量删掉。