为什么要设置name space
首先,docker并不是虚拟机,其并没有完整的虚拟化系统内核,docker中的容器是公用宿主机的系统内核的。而docker默认情况下容器中的命令是在宿主机器上以root账号来进行运行的,如下图,圈出来的进程其实是在容器中运行的,但是在宿主机中该进程实际的执行者为root,这就有点点让人担心了
万一docker出了安全问题被渗透了,那就是宿主机上面的root权限,实在是有点令人担心,这时候我们就需要给docker设置name space来解决。或者是有的时候用普通用户权限运行docker容器,也有可能会出现容器内实际执行账户为”i have no name “这个情况也可以通过设置name space来进行修复
使用name space技术其实实际上是将容器中的root用户“映射”到宿主机中的一个普通用户上面,该进程在容器中有“root”权限,但是实际在宿主机器中只有一个普通用户权限。理解了以后就是如何操作了。
简单配置-让docker自动处理
有的时候我们可能不想手动去配置用户,所以干脆直接让docker自己一键配置好。我们只需要前往/etc/docker/daemon.json 这个文件加上以下的代码(没有这个文件则自己创建就行了),重启docker服务,
{
"userns-remap": "default"
}
然后我们通过执行以下命令可以看看系统中有没有创建这个用户:dockermap
cat /etc/passwd
注意!完成了配置docker使用namespace操作,当前镜像以及容器全部会消失(删除掉daemon.json中加的那行数据就会回来了)
手动配置-自己配置用户
首先我们要自己决定一个用户(用来执行docker),我以用户MCSM为例子
首先先创建个用户
adduser mcsm
然后给这个用户配置subuid以及subgid(用于docker的name space)
vim /etc/subuid
在这个文件后面加上 用户名:起始用户命名空间:终止命名空间,我这边设置的为mcsm:231072:250000
接下来是配置subgid
vim /etc/subuid
跟上方一样,加上 用户名:起始用户命名空间:终止命名空间,(填的内容也跟刚刚一样)我这边设置的为mcsm:231072:250000
配置完了以后我们前往/etc/docker/daemon.json 这个文件加上以下的代码(没有这个文件则自己创建就行了),重启docker服务,
{
"userns-remap": "mcsm"
}
将mcsm改为你配置的用户的名称
注意!完成了配置docker使用namespace操作,当前镜像以及容器全部会消失(删除掉daemon.json中加的那行数据就会回来了)
最终步骤:检查docker中的进程的运行用户
我们先启用个容器来看看docker中容器中的进程的运行权限
docker run -d ubuntu:20.04 sleep 100000
然后看看sleep的运行权限
已经不是root了,变为一个叫做231072的用户了,配置完成。