Rocky Linux 9上安装Docker Rootless

一、前提条件

  1. Rocky Linux 9 已更新且有一个非 root 用户(拥有 sudo 权限)。

  2. 安装以下系统包:

    1
    sudo dnf install -y uidmap dbus-user-session

    uidmap 提供 newuidmap/newgidmapdbus-user-session 用于用户级 systemd/session 支持。

  3. 确认 /etc/subuid/etc/subgid 为普通用户分配了至少 65536 个 subordinate UIDs/GIDs,例如:

    testuser:231072:65536
    

    可通过:

    1
    grep ^$(whoami): /etc/subuid /etc/subgid

    验证是否正确配置


二、安装 Docker Engine(rootful)

  1. 添加 Docker 官方 RHEL/CentOS 仓库:

    1
    2
    sudo dnf install -y dnf-plugins-core
    sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo

    Rocky Linux 可使用兼容的 CentOS 仓库

  2. 安装 Docker 及 rootless extras:

    1
    sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
  3. 启动并启用 Docker 服务(安装完成后):

    1
    sudo systemctl enable --now docker

    如只想用于 rootless,可稍后关闭 rootful 守护进程。


三、配置 Rootless Docker

方式一:使用安装脚本(推荐)

以普通用户身份运行:

1
dockerd-rootless-setuptool.sh install

该脚本会生成 ~/.config/systemd/user/docker.service 并提示使用 systemctl --user 来管理 rootless Docker,并建议启用 linger。

方式二:官方 convenience script(次选)

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

也会配置 rootless 环境并提示设置用户服务等


四、系统设置与服务管理

  1. 启用 linger 模式,让 Docker 用户服务在无登录时仍可持续运行:

    1
    loginctl enable-linger $(whoami)
  2. 将以下内容写入 ~/.bashrc 并使其生效:

    1
    2
    3
    export XDG_RUNTIME_DIR=/run/user/$(id -u)
    export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock
    export PATH=/usr/bin:$PATH

    然后运行 source ~/.bashrc

  3. 检查 rootless docker 用户服务:

    1
    systemctl --user status docker

    应显示 Active: active (running)


五、测试 Rootless Docker

1
docker run -it --rm nginx:alpine sh -c 'echo container UID: $(id -u)'

输出应为 0(容器内的 root)。
宿主机上查看相关进程 UID,应为高 UID(不是 root 或用户正常 UID)说明映射成功。


六、常见问题与注意事项

  • SELinux:Rocky 9 默认启用 SELinux,可能影响 rootful/docker 安装。部分社区称 docker-ce 在 Rocky 9 上不稳定,推荐优先考虑 Podman
  • cgroup v2 支持限制:rootless 模式在资源限制上依赖 cgroup v2,重启后可能需要手动 reload systemd + 重启用户服务以恢复资源限制能力。
  • 根端口绑定:rootless 用户无法绑定 1024 以下端口。如需监听低端口,可使用 socat 或设置 CAP_NET_BIND_SERVICE 能力。
  • Podman 替代方案:Podman 在 Rocky 9 上原生支持,daemonless、rootless-by-default 更加安全,兼容 Docker CLI 语法,是推荐的替代选择 。

总结建议

  • 优先使用 Podman:更适合 Rocky Linux 架构,支持 rootless 无痛部署,社区支持更佳。
  • 如坚持使用 Docker Rootless:确保满足前提条件,使用 dockerd-rootless-setuptool.sh install,并妥善处理 SELinux 和 cgroup 限制。
  • 系统升级时重新验证 rootless 安装状态,确保环境变量和用户服务配置一致。