1. 为什么需要containerd-rootless最近在帮朋友部署一个测试环境时遇到了一个经典问题如何在普通用户权限下运行容器传统方案要么需要sudo权限要么就得把用户加入docker组这两种方式都存在安全隐患。这时候containerd-rootless模式就成了我的救命稻草。containerd作为行业标准的容器运行时其rootless模式允许普通用户无需root权限就能创建和管理容器。这种设计带来了三大核心优势安全性提升容器进程以普通用户身份运行即使容器被攻破攻击者也无法获取主机root权限权限隔离不同用户之间的容器环境完全隔离避免相互干扰合规性满足企业安全规范中对最小权限原则的要求实测下来rootless模式的性能损耗仅在5%左右对于大多数开发测试场景完全可以接受。下面我就以CentOS 7为例带你完整走通从安装到运行Hello World的全流程。2. 环境准备与依赖安装2.1 基础环境检查首先确认你的CentOS 7系统版本cat /etc/redhat-release建议使用7.7及以上版本我测试用的是7.7.1908。内核版本也很重要uname -r需要3.10.0-1062或更高版本否则可能会遇到内核模块不兼容的问题。2.2 创建专用用户为避免污染root环境我们新建一个测试用户sudo useradd -m -s /bin/bash containerd-user sudo passwd containerd-user # 设置密码这里有个小技巧使用-m参数会自动创建用户家目录省去后续权限配置的麻烦。2.3 安装必要依赖切换到新用户前先用root安装基础依赖sudo yum install -y iproute fuse-overlayfs slirp4netns这几个包的作用分别是iproute容器网络配置工具fuse-overlayfs用户空间overlay文件系统slirp4netns用户模式网络栈特别提醒如果遇到fuse-overlayfs包找不到的情况可能需要先启用EPEL仓库sudo yum install -y epel-release3. containerd-rootless安装实战3.1 获取安装包切换到普通用户su - containerd-user下载最新版nerdctl-full套件包含containerdwget https://github.com/containerd/nerdctl/releases/download/v1.6.2/nerdctl-full-1.6.2-linux-amd64.tar.gz tar -xzf nerdctl-full-1.6.2-linux-amd64.tar.gz解压后会得到包含bin和lib的目录结构建议放在用户主目录下。3.2 配置环境变量临时生效的配置方式export PATH$PATH:~/containerd/bin export CONTAINERD_ROOTLESS_ROOT~/containerd建议将这两行加入~/.bashrc实现永久生效echo export PATH$PATH:~/containerd/bin ~/.bashrc echo export CONTAINERD_ROOTLESS_ROOT~/containerd ~/.bashrc source ~/.bashrc3.3 运行安装脚本关键的一步来了containerd-rootless-setuptool.sh install这个脚本会自动生成containerd配置文件创建systemd用户服务单元设置cgroup v2委托常见报错处理如果提示systemctl --user不可用需要先执行sudo loginctl enable-linger $(whoami)遇到cgroup相关错误时可以尝试sudo grubby --update-kernelALL --argssystemd.unified_cgroup_hierarchy1 sudo reboot4. 网络配置与权限调优4.1 CNI网络插件配置默认情况下containerd会查找/opt/cni/bin下的插件但我们没有写入权限。解决方案是自定义CNI路径mkdir -p ~/containerd/cni/bin wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz tar xvf cni-plugins-linux-amd64-v1.1.1.tgz -C ~/containerd/cni/bin然后设置环境变量export CNI_PATH~/containerd/cni/bin4.2 解决挂载权限问题运行容器时可能会遇到FATA[0000] failed to mount /run/user/1000/containerd-mount2759511587: operation not permitted这是因为默认的overlayfs需要root权限。改用fuse-overlayfsnerdctl run --snapshotterfuse-overlayfs hello-world如果想永久生效可以修改~/.config/containerd/config.toml[plugins.io.containerd.snapshotter.v1] snapshotter fuse-overlayfs5. 验证与Hello World5.1 启动containerd服务先确保服务正常运行systemctl --user start containerd systemctl --user enable containerd检查状态systemctl --user status containerd正常应该看到active (running)状态。5.2 运行测试容器终于到了见证奇迹的时刻nerdctl run --rm hello-world如果看到经典的Hello World输出恭喜你如果失败可以尝试以下调试命令nerdctl info # 查看运行时信息 nerdctl images ls # 检查镜像列表 journalctl --user -u containerd -f # 查看实时日志5.3 日常使用技巧镜像加速配置nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6查看容器资源占用nerdctl stats进入运行中容器nerdctl exec -it [容器ID] sh整个安装过程最耗时的是解决各种权限问题特别是当企业环境有严格的权限管控时。我在某次客户现场部署时花了3小时才搞定所有目录权限和SELinux配置。建议提前准备好以下信息用户家目录的剩余空间至少10GB防火墙规则需要放行容器通信端口代理服务器配置如有