使用 Sysbox 运行时实现安全 DinD 的步骤

解读

国内云原生面试中,“安全且高效的 Docker-in-Docker(DinD)” 是高频深挖题。传统 --privileged DinD 虽简单,却直接放通宿主机所有 capability,在等保 2.0 与金融合规场景下几乎一票否决。Sysbox 是 CNCF 生态中唯一无需特权容器即可运行 systemd、Docker、K8s 的 OCI 运行时,能在普通宿主机内核上提供用户态 rootless 隔离 + 内核态增强,因此面试官想确认候选人是否掌握:

  1. 为什么选 Sysbox(与 docker:dind rootless、Kata、Nestybox 对比)
  2. 落地步骤是否兼顾镜像源加速、国内仓库认证、CI 集成、运行时故障排查
  3. 能否量化安全收益(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 集成”五段式回答,每段给出可直接落地的命令与国产镜像地址,面试时口述即可。

  1. 宿主机准备

    • 操作系统: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
  2. 安装 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
  3. 启动安全 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 即成功
  4. 验证与加固

    • 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
  5. 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" 表示隔离层生效

拓展思考

  • 与 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 实现零中断重载”可加分