欢迎来到站长天空!

其它服务器

当前位置: 主页 > 服务器 > 其它服务器

使用非root用户安装及启动docker的问题(rootless模式运行)

时间:2025-12-15 11:30:05|栏目:其它服务器|点击:

目录
  • 一、容器用户与宿主机用户映射
  • 二、在非root用户下运行docker守护进程
    • 2.1.docker版本要求
    • 2.2. 前置条件
    • 2.3.开始rootless模式安装
    • 2.4.启动守护进程运行容器
  • 三、存在若干已知的限制。
    • 四、卸载Rootless docker

      通过我之前的文章已经可以验证,在root用户下安装启动的容器存在安全问题。究其原因是因为:

      使用非root用户安装及启动docker的问题(rootless模式运行)

      • 容器内的root用户就是宿主机的root用户,容器内uid=1000的用户就是宿主机uid=1000的用户
      • docker的守护进程是root权限的

      既然我们知道了原因,那么我们就来解决一下这两个问题。

      一、容器用户与宿主机用户映射

      docker是使用--userns-remap容器用户映射宿主机用户的方式来解决问题,具体的方法描述如下:

      用户和组的映射由两个配置文件来控制,分别是/etc/subuid/etc/subgid

      echo "zimug:100000:65536" | tee /etc/subuid;
      echo "zimug:100000:65536" | tee /etc/subgid;

      subuid(sub子uid用户id):对于subuid的这一行表示,宿主机用户zimug的用户ip段为[100000,10000+65535]。也就是说,使用zimug这个宿主机启动容器,容器内的用户uid与宿主机内的用户uid存在关系。也就是说按照上面的配置

      使用非root用户安装及启动docker的问题(rootless模式运行)

      • zimug这个用户的容器子用户id(subuid),只能在[100000-165535]之间进行分配。[0-99999]这个区间范围内的uid仍然保留给宿主机进行使用。
      • 使用zimug启动的第一个容器,容器用户root(uid=0)对应的宿主机用户应该是uid=100000(不是宿主机root用户)
      • 使用zimug启动的第二个容器,容器用户root(uid-0)对应的宿主机用户可能是uid=101000(也不是宿主机root用户)
      • subgid表示的是用户组id的映射关系,映射原理和uid是一致的。

      二、在非root用户下运行docker守护进程

      2.1.docker版本要求

      既然root用户的提权问题解决了,我们就要解决下一个问题:docker的守护进程是root权限的,即运行docker守护进程的用户仍然是root。我们需要做如下修正:

      使用非root用户安装及启动docker的问题(rootless模式运行)

      也就是我们要在非root用户下安装docker,并启动docker守护进程,这种安装及运行模式被称为“RootLess”模式。可以安装但是存在先决条件:“RootLess”模式是在 Docker Engine v19.03 中作为实验性功能引入的,从 Docker Engine v20.10 开始提供正式使用。

      2.2. 前置条件

      需要安装newuidmapnewgidmap工具shadow-utils,即配置上文中的/etc/subuid/etc/subuid需要这两个工具的支持。安装之前使用yum list installed shadow-utils确认下是否已经安装过或者操作系统自带,如果存在就不要安装了,但第三步的配置是需要的。
      第一步:添加一个软件包安装源,该源下面包含shadow-utils46-newxidmap

      curl -o /etc/yum.repos.d/vbatts-shadow-utils-newxidmap-epel-7.repo https://copr.fedorainfracloud.org/coprs/vbatts/shadow-utils-newxidmap/repo/epel-7/vbatts-shadow-utils-newxidmap-epel-7.repo

      第二步: yum install -y shadow-utils46-newxidmap
      第三步:在/etc/sysctl.conf文件中修改系统参数user.max_user_namespaces = 28633,修改完成之后执行sysctl --system命令让参数生效。

      echo user.max_user_namespaces=28633 >> /etc/sysctl.d/userns.conf;
      sudo sysctl -p /etc/sysctl.d/userns.conf;

      该参数默认值是0,即不允许操作系统用户存在subuid空间。上面的操作完成之后使用sysctl --all --pattern user_namespaces命令验证修改的结果。

      2.3.开始rootless模式安装

      root用户下确保已经执行下列命令进行用户id关系配置

      echo "zimug:100000:65536" | tee /etc/subuid;
      echo "zimug:100000:65536" | tee /etc/subgid;

      我已经新建了一个linux用户zimug,使用su - zimug切换到该用户下,执行安装脚本,该安装脚本需要连网。

      curl -fsSL https://get.docker.com/rootless | sh

      脚本执行完成之后,显示的内容如下:

      使用非root用户安装及启动docker的问题(rootless模式运行)

      将上图中安装过程提示的export内容添加到 ~/.bashrc 文件中,添加完使用source ~/.bashrc命令使环境变量生效。注意:你的环境变量和我的一定不一致,要copy上图中红色部分。

      export XDG_RUNTIME_DIR=/home/zimug/.docker/run
      export PATH=/home/zimug/bin:$PATH
      export DOCKER_HOST=unix:///home/zimug/.docker/run/docker.sock

      2.4.启动守护进程运行容器

      在zimug用户下使用下面的脚本启动docker守护进程,该脚本在上文中的环境变量PATH目录下,所以我们不用写全路径。注意:我们这里使用了 --experimental --storage-driver vfs参数启动,因为我的linux内核版本比较低所以需要加这个参数,后文我会说明原因。

      dockerd-rootless.sh --experimental --storage-driver vfs

      启动一个容器我们尝试一下,注意宿主机映射的端口不能小于1024,因为linux非root用户不能使用1024以下的端口。

      docker run -d --name nginx-zimug -p  8080:80  nginx

      访问nginx服务看到界面就证明nginx服务没有问题,同时注意宿主机防火墙开放8080端口访问,这个我就不说了。

      三、存在若干已知的限制。

      官方文档说的是known-limitations,也就是已知的受限因素是下面这些,未知的受限因素还不一定有多少呢。所以笔者针对rootless模式目前也只是研究,还没有在生产上能够正式使用(2022年4月6日)。虽然它很安全,但是如果坑太多的话,我也受不了啊。

      • 目前仅支持以下存储驱动程序:
      • overlay2(仅当使用内核 5.11 或更高版本或 Ubuntu 发行版本的内核运行时,才能够支持这个存储驱动)。上文中我的内核版本是3.10达不到要求。
      • fuse-overlayfs(仅当使用内核 4.18 或更高版本运行并fuse-overlayfs被安装时)
      • btrfs(仅当使用内核 4.18 或更高版本运行,或者~/.local/share/docker使用user_subvol_rm_allowed挂载选项挂载时)
      • vfs 兼容性最好,但这个存储驱动目前仅能用于实验,不能用于生产。
      • 只有在使用 cgroup v2 和 systemd 运行时才支持 Cgroup。
      • 不支持以下功能:
      • AppArmor
      • Checkpoint
      • Overlay网络模式
      • 暴漏SCTP 端口

      四、卸载Rootless docker

      在非root用户(我用的是zimug用户)下执行下列命令,完成docker rootless卸载
      第一步:

      rootlesskit rm -rf ~/.local/share/docker

      第二步:

      $ cd ~/bin 
      $ rm -f containerd containerd-shim containerd-shim-runc-v2 ctr docker docker-init docker-proxy dockerd dockerd-rootless-setuptool.sh dockerd-rootless.sh rootlesskit rootlesskit-docker-proxy runc vpnkit

      第三步: 把上文中在 ~/.bashrc 文件中添加的环境变量删掉。

      上一篇:.NET 6 从0到1使用Docker部署至Linux环境超详细教程

      栏    目:其它服务器

      下一篇:Docker容器的加载分层原理及commit镜像

      本文标题:使用非root用户安装及启动docker的问题(rootless模式运行)

      本文地址:https://zz.feitang.co/server/31020.html

      广告投放 | 联系我们 | 版权申明

      申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

      如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

      联系QQ:257218569 | 邮箱:257218569@qq.com

      Copyright © 2018-2025 站长天空 版权所有 Powered by EyouCms冀ICP备14023439号