跳到主内容

Docker Rootless 教程:Ubuntu VPS 安装、迁移与排错

在 Ubuntu VPS 上以非 root 用户运行 Docker 守护进程和容器,覆盖 subordinate ID、用户级 systemd、数据迁移、端口映射、资源限制及回滚检查。

GSProber · 主机测评编辑0 阅读
在 Ubuntu VPS 上以非 root 用户运行 Docker 守护进程和容器,覆盖 subordinate ID…

Docker Rootless 教程:Ubuntu VPS 安装、迁移与排错

Docker 默认守护进程拥有主机 root 权限,把普通用户加入 docker 组也等同于授予较高的主机控制能力。Rootless mode 的思路不同:守护进程和容器都运行在普通用户的 user namespace 中,降低容器或守护进程漏洞直接取得主机 root 权限的风险。它不是万能隔离层,也不适合所有网络、存储和编排场景;上线前应先核对限制,再从非关键 VPS 迁移。

本文面向 Ubuntu 或 Debian 系 VPS。已有容器的数据保护应先按Docker Compose 数据备份教程完成一致性备份,主机入站端口则可结合nftables 防火墙教程独立管理。Rootless 不能替代备份、防火墙、镜像更新和最小权限。

检查内核与用户映射前提

Docker 官方要求主机具备 newuidmapnewgidmap,Ubuntu 通常由 uidmap 包提供。为专用运行用户执行 grep ^用户名: /etc/subuid /etc/subgid,两份文件都应分配足够的 subordinate UID 与 GID 范围;官方示例使用至少 65,536 个映射。不要让多个运行用户复用重叠范围,否则会破坏隔离假设。

建议新建不承担日常登录工作的专用用户,并确认其主目录位于本地文件系统。Rootless 数据目录默认在用户主目录下的 .local/share/docker,官方排错文档指出该目录放在 NFS 上可能引发层文件所有权错误。还要确认系统使用 cgroup v2 和 systemd;如果缺少这些条件,CPU、内存或进程数限制可能不生效。

安装用户级 Docker 守护进程

以目标普通用户登录,在已安装 Docker Engine 软件包的系统上运行 dockerd-rootless-setuptool.sh install。安装器会创建用户级 systemd 单元和名为 rootless 的 Docker CLI context。随后执行 systemctl --user status dockerdocker context show,确认客户端连接的是用户 socket,而不是误连系统级 /var/run/docker.sock

要让用户退出登录后服务仍随系统启动,可由管理员执行 loginctl enable-linger 用户名,然后用该用户运行 systemctl --user enable docker。Docker 官方明确说明,不应把 Rootless 守护进程伪装成带 User= 的系统级 docker.service;应使用安装器创建的 ~/.config/systemd/user/docker.service

若主机原来运行 rootful Docker,不要直接删除旧数据。先停止业务并备份 Compose 文件、环境变量、命名卷和数据库导出,再停止系统级 docker.servicedocker.socket。Rootless 使用独立的数据目录,原有镜像和容器不会自动出现;应重新拉取镜像、恢复数据并逐个验证服务。确认迁移成功前保留可回滚副本。

处理端口、网络与资源限制

Rootless 网络由 RootlessKit 等用户态组件提供,容器地址不能假定能被主机直接访问,发布服务应使用明确的 -p 或 Compose ports 映射。低于 1024 的特权端口默认受限。更稳妥的做法是在高位端口运行容器,再由 Caddy 或 Nginx 反向代理;若调整系统的非特权端口起点或给 rootlesskit 增加 capability,必须记录扩大后的安全边界。

不要未经 TLS 保护把 Docker API socket 暴露到公网。远程管理优先通过 SSH context,并继续用安全组或 nftables 限制管理入口。Rootless 降低守护进程权限,并不意味着任何能访问该用户 socket 的进程都可以被信任。

资源限制需要 cgroup v2、systemd 和相应 controller 委派。运行 docker info 检查 Cgroup Driver;若显示 none--cpus--memory--pids-limit 可能被忽略。再查看用户 slice 的 cgroup.controllers,确认实际委派的控制器。不要只因为命令未报错就认定限制已经生效。

验证、排错与回滚

先运行最小测试容器,再检查重启后的用户服务、端口发布、DNS、卷读写和日志轮转。systemctl --user status dockerjournalctl --user-unit dockerdocker infodocker context ls 是首要排查入口。拉取镜像出现 lchown 错误时,优先检查 subordinate ID 数量和数据目录文件系统;资源参数失效时,检查 cgroup v2 与 controller 委派。

迁移完成后,应确认系统级 Docker socket 已停止,避免 rootful 与 rootless 两套守护进程并存造成误操作。若业务依赖 host 网络、特权端口、复杂存储驱动或严格网络吞吐,应先在隔离环境验证兼容性;无法满足要求时,回滚到经过加固的 rootful Docker 比强行上线更安全。最终目标不是追求“无 root”标签,而是得到权限边界清楚、可恢复、可观察的容器运行环境。

所属专题:建站VPS专题
教程GsDesk 是一款基于 Cloudflare Workers 与 VPS 自托管 的开源远程桌面项目,支持 WebR…

Cloudflare Workers 免费搭建开源远程桌面完整教程:无需 VPS,支持 WebRTC P2P、D1、KV、R2、浏览器远程控制、Windows 客户端和文件传输

GsDesk 是一款基于 Cloudflare Workers 与 VPS 自托管 的开源远程桌面项目,支持 WebRTC P2P 直连,服务端仅负责 API、身份认证和 WebSocket 信令,不中转桌面视频流,大幅降低服务器带宽成本。项目支持 Cloudflare 免费套餐 部署,也可以使用 Docker 在 VPS 上自托管,内置 Windows 客户端、浏览器控制端、手机远程控制,支持 8 位设备 ID、OTP 一次性密码、永久密码、Ed25519 设备认证、JWT 身份验证、文件传输、剪贴板同步、自动重连 等完整功能。

309 阅读

教程如果你一直想拥有一个属于自己的网盘,但又不想买 VPS、维护数据库或者折腾复杂环境,那么这个基于 Cloudflare…

CloudDisk:基于 Cloudflare Workers 的免费个人网盘,无需 VPS、MySQL,支持 R2+D1+KV 一键部署

如果你一直想拥有一个属于自己的网盘,但又不想买 VPS、维护数据库或者折腾复杂环境,那么这个基于 Cloudflare Workers 的开源项目 CloudDisk 值得看看。整个系统运行在 Cloudflare 免费套餐上,文件存储使用 R2,数据库使用 D1,会话数据使用 KV,不需要 MySQL,也不需要服务器。支持多用户登录、文件夹管理、分享链接、在线预览、Office 文档查看、文本在线编辑、大文件断点续传、协作者权限管理等功能。无论是个人备份、开发者存放代码文件、团队共享资料,还是搭建自己的私有网盘,都可以直接部署到 Cloudflare,一键完成,几乎零维护成本,非常适合独立开发者、个人站长和轻量团队使用。

288 阅读

教程很多朋友在使用 Linux 服务器或者 VPS 时,经常会遇到 DNS 污染、解析慢、域名无法访问等问题。其实只需要安…

Linux 开启 DNS over HTTPS(DoH)教程:使用 Cloudflared + systemd 实现加密 DNS,防污染、防劫持

很多朋友在使用 Linux 服务器或者 VPS 时,经常会遇到 DNS 污染、解析慢、域名无法访问等问题。其实只需要安装 Cloudflare 官方的 cloudflared,并配合 systemd 自启动,就能让整个系统通过 DNS over HTTPS(DoH)进行加密解析。

237 阅读

常见问题

把用户加入 docker 组等于启用 Rootless 吗?

不等于。docker 组只是允许用户访问通常由 root 运行的守护进程,具有很高权限;Rootless 会让守护进程和容器都在普通用户命名空间中运行。

Rootless Docker 可以直接使用 80 和 443 端口吗?

低于 1024 的端口默认受限制。通常可将容器映射到高位端口,再通过反向代理对外服务;修改系统阈值或 capability 前应评估安全边界。

为什么 Rootless 模式下内存限制没有生效?

资源限制依赖 cgroup v2、systemd 以及控制器委派。应检查 docker info 的 Cgroup Driver 和用户 slice 的 cgroup.controllers,而不能只看命令是否报错。

原有 rootful Docker 容器会自动迁移吗?

不会。Rootless 使用独立数据目录,应先备份 Compose 配置、卷与数据库,再重新部署和恢复数据,并在确认成功前保留回滚副本。

评价与回复

无需登录;审核通过后公开显示。