Nspawn 3.0:给 systemd-nspawn 容器套上一层兼容 Docker 的 Engine API
来源:blog.nspawn.org — 2026-11-08
📋 概述
2.0 只给挂载 docker socket 的机器一个只读 Docker API,够 Traefik 或 Dozzle 发现容器;3.0 把这个 API 连同它的写操作一起做到宿主上。宿主 socket 是 /run/nspawn/api.sock,由 nspawn-api.socket 打开,主要目的是兼容性:通过 Docker API 管理容器的工具(比如 GitLab Runner 的 docker executor)可以直接用 nspawn 的机器。nspawn 仍是管理机器的命令行,但把 DOCKER_HOST 指过去,docker 命令也能用。
🔑 核心要点
- 包默认不启用这个 socket,systemctl enable --now nspawn-api.socket 之后,nspawn-api.service 在第一次连接时启动。
- API 按 1.51 的形状应答,并向下兼容到 1.24:容器的 create/start/stop/kill/pause/wait/update/remove/prune、attach、exec、archive(docker cp 双向)、镜像 pull/remove/prune、卷与网络。
- 鉴权走 polkit:读与等待要 org.nspawn.inspect,日志与变更要 org.nspawn.manage,root 能做一切;socket 上无法弹认证代理,所以默认不提示,非 root 用户需要规则。
- 文章直言安全代价:和 docker 组一样,拥有 org.nspawn.manage 的用户在这台主机上就是 root,因为机器会以 root 运行命令、还能挂载任意宿主路径。
- 3.0 的破坏性变化:机器内挂载的 API socket 不再是只读,读写挂载可以建、启、exec、删容器,只读挂载仍能读日志与 kill,其余返回 403。
- 周边新增:nspawn info 支持 -f json/-f TEMPLATE、image inspect、-P/--publish-all、卷的 --label 过滤,以及变量值可以包含换行(GitLab 的 CI_COMMIT_MESSAGE 就有)。
💡 金句
和 docker 组一样,拥有 org.nspawn.manage 权限的用户在这台主机上就是 root。
👍 0
👎 0
← 返回 Lobsters 首页