使用 Sysbox 运行时实现安全 DinD 的步骤
解读
国内云原生面试中,“安全且高效的 Docker-in-Docker(DinD)” 是高频深挖题。传统 --privileged DinD 虽简单,却直接放通宿主机所有 capability,在等保 2.0 与金融合规场景下几乎一票否决。Sysbox 是 CNCF 生态中唯一无需特权容器即可运行 systemd、Docker、K8s 的 OCI 运行时,能在普通宿主机内核上提供用户态 rootless 隔离 + 内核态增强,因此面试官想确认候选人是否掌握:
- 为什么选 Sysbox(与 docker:dind rootless、Kata、Nestybox 对比)
- 落地步骤是否兼顾镜像源加速、国内仓库认证、CI 集成、运行时故障排查
- 能否量化安全收益(capability 白名单、seccomp 审计、AppArmor 策略)
知识点
- Sysbox 运行时原理:利用 Linux user-ns + shiftfs + idmapped-mounts,把容器内 uid 0 映射到宿主机高阶 uid,天然屏蔽宿主机资源
- 国内镜像加速:必须替换 docker.io、k8s.gcr.io 为阿里云、中科大、DaoCloud 加速器,否则拉取超时直接判负
- Cgroup v2 与 Systemd 共存:Sysbox 依赖宿主机开启 cgroup v2 和 systemd 统一层次,CentOS 7 默认 v1 需升级至 8 或 Ubuntu 20.04+
- Seccomp 与 AppArmor 模板:Sysbox 自带
sysbox-docker-default模板,仅开放 44 个系统调用,相比默认 Docker 的 300+ 大幅降低攻击面 - CI 流水线改造:Jenkins/GitLab Runner 需把
DOCKER_HOST=unix:///var/run/sysbox/docker.sock注入 Job,避免重复安装 Docker daemon
答案
步骤按“宿主机准备 → 安装 Sysbox → 启动安全 DinD → 验证与加固 → CI 集成”五段式回答,每段给出可直接落地的命令与国产镜像地址,面试时口述即可。
-
宿主机准备
- 操作系统:Ubuntu 22.04 LTS(内核 ≥ 5.15)
- 开启 cgroup v2:
sed -i 's/GRUB_CMDLINE_LINUX=""/GRUB_CMDLINE_LINUX="systemd.unified_cgroup_hierarchy=1"/' /etc/default/grub && update-grub && reboot - 卸载旧 Docker 避免冲突:
apt purge docker-ce docker-ce-cli containerd.io
-
安装 Sysbox
- 添加国内源加速:
curl -fsSL https://mirrors.aliyun.com/nestybox/sysbox/apt/gpg.key | apt-key add - - 写入列表:
echo "deb https://mirrors.aliyun.com/nestybox/sysbox/apt stable main" > /etc/apt/sources.list.d/sysbox.list - 安装:
apt update && apt install -y sysbox-ce=0.6.2-0 - 启用服务:
systemctl enable --now sysbox-sysfs && systemctl enable --now sysbox-mgr
- 添加国内源加速:
-
启动安全 DinD
- 创建专用网络:
docker network create --subnet 172.26.0.0/16 dind-net - 运行容器:必须指定 runtime 与国内镜像源
docker run -d --name sysbox-dind \ --runtime=sysbox-runc \ --network dind-net \ -e DOCKER_TLS_CERTDIR="" \ -e REGISTRY_MIRROR="https://registry.docker-cn.com" \ -v /var/run/sysbox/docker.sock:/var/run/docker.sock \ nestybox/alpine-docker:latest - 进入容器验证:
docker exec -it sysbox-dind docker info | grep "Storage Driver"出现 overlayfs 无 privileged 即成功
- 创建专用网络:
-
验证与加固
- capability 审计:
docker exec sysbox-dind grep Cap /proc/self/status仅包含00000000a80425fb=cap_chown,dac_override,fowner,fsetid,kill,setgid,setuid,setpcap,net_bind_service,net_raw,sys_chroot,mknod,audit_write,setfcap,无 SYS_ADMIN、SYS_MODULE - 最小镜像构建:在多阶段 Dockerfile 中采用
docker:24.0.7-dind-rootless作为第二阶段,最终镜像 < 120 MB - Secrets 管理:通过 Docker Compose v2
secrets:字段把阿里云 ACR 用户名密码注入,避免明文写在 daemon.json
- capability 审计:
-
CI 集成(GitLab Runner 示例)
- 注册 Runner:
gitlab-runner register --url https://git.company.cn --token $TOKEN --executor docker --docker-image "nestybox/alpine-docker:latest" --docker-runtime "sysbox-runc" .gitlab-ci.yml关键片段:build: stage: build services: - name: nestybox/alpine-docker:latest alias: docker command: ["dockerd", "--host=tcp://0.0.0.0:2375"] variables: DOCKER_HOST: tcp://docker:2375 DOCKER_TLS_CERTDIR: "" script: - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA- 日志排查:
journalctl -u sysbox-mgr -f出现 "shiftfs mount ok" 表示隔离层生效
- 注册 Runner:
拓展思考
- 与 Rootless Docker 对比:Rootless 需宿主机安装 newuidmap/newgidmap 且无法使用 overlayfs(仅 vfs),构建性能下降 40%;Sysbox 无此限制,适合高并发编译场景
- 多租户安全:在 ACK-TKE 混合集群中,可用 Sysbox + OPA GateKeeper 约束每个 Namespace 仅允许
runtimeClassName: sysbox-runc,实现软隔离与硬隔离双保险 - 国产化适配:华为 EulerOS 22.03 已内置 Sysbox 驱动,可直接通过 rpm 包安装,无需编译内核模块;面试时可提及“在麒麟 V10 SP3 上通过 rpm -ivh sysbox-0.6.2-1.ky10.x86_64.rpm 完成部署”,体现国产化落地经验
- 故障场景:若容器内 docker pull 报
x509: certificate signed by unknown authority,需把企业内网 Harbor 的 CA 证书挂载到 /etc/docker/certs.d/harbor.company.cn/ca.crt,并重启容器内 dockerd;面试时说出“通过 docker exec kill -SIGHUP 1 实现零中断重载”可加分