Sysbox 是一个开源免费的容器运行时(一种专门的 "runc"),最初由 Nestybox 开发(于 2022 年 5 月被 Docker 收购),它通过两种关键方式增强容器:
增强容器隔离性:
所有容器均启用 Linux 用户命名空间(即容器内的 root 用户在宿主机上没有任何权限)。
虚拟化容器内的部分 procfs 和 sysfs。
隐藏容器内的宿主机信息。
锁定容器的初始挂载等。
使容器能够运行与虚拟机相同的工作负载:
借助 Sysbox,容器可以无缝且安全地运行系统级软件,如 systemd、Docker、Kubernetes、K3s、buildx(包括多架构构建)、遗留应用、多架构应用等。
这些软件可以在 Sysbox 容器内无需修改即可运行,也无需使用特殊的软件版本(例如 rootless 变体)。
无需特权容器、无需复杂镜像、无需棘手的入口点、无需特殊的卷挂载等。
可以将其视为**“容器超级增压器”**:它使你现有的容器管理器/编排器(例如 Docker、Kubernetes 等)能够部署具有强化隔离性、几乎可以运行虚拟机中任何工作负载的容器。
Sysbox 通过高级操作系统虚拟化技术,尽可能让容器呈现类似虚拟机的环境来实现这一点。
与 Kata 和 KubeVirt 等替代运行时不同,它不使用虚拟机。这使得它更易于使用(尤其是在云环境中,避免了嵌套虚拟化),尽管它无法提供基于虚拟机的运行时那样的隔离级别。参见此处进行比较。
无需学习新工具或修改现有的容器镜像或工作流即可利用 Sysbox。只需安装它,并将容器管理器/编排器指向它即可部署增强型容器。
Sysbox 可以与同一宿主机上的其他容器运行时(例如默认的 OCI runc、Kata 等)共存。你可以根据需要轻松选择使用哪种运行时来运行哪些容器或 Pod。
Sysbox 是免费且开源的,采用 Apache License 2.0 许可。详情请参见 LICENSE 文件。
Sysbox 最初由 Nestybox 开发。由于 Nestybox 现已并入 Docker,Docker 成为 Sysbox 项目的主要赞助商。
尽管如此,Sysbox 是一个社区开源项目,不受 Docker 官方支持(即 Docker 订阅不包含 Sysbox 支持)。支持通过此 GitHub 仓库或 Sysbox Slack 工作区以尽力而为的方式提供。
我们鼓励社区参与,共同推动 Sysbox 的发展和改进,目标是增加它所支持的使用场景和带来的益处。欢迎外部维护者和贡献者。
Sysbox 解决以下问题:
增强容器化微服务的隔离性(容器内的 root 映射为宿主机上的非特权用户)。
在容器内启用功能强大的 root 用户,同时不影响宿主机安全。
通过支持 Docker-in-Docker (DinD) 或 Kubernetes-in-Docker (KinD) 来保障 CI/CD 流水线的安全,无需不安全的特权容器或挂载宿主机 Docker 套接字。
使容器能够作为“类虚拟机”环境用于开发、本地测试、学习等场景,具备强大的隔离性,并能在容器内运行 systemd、Docker、IDE 等。
在容器内运行遗留应用(而不是效率较低的虚拟机)。
用更简单、更快、更高效、更便携的基于容器的替代方案取代虚拟机,并且可以轻松部署到各种云环境。
将裸机主机划分为多个隔离的计算环境,密度是虚拟机的 2 倍(即在相同硬件上以相同性能部署两倍于虚拟机数量的类虚拟机容器)。
将云实例(例如 EC2、GCP 等)划分为多个隔离的计算环境,而无需采用昂贵的嵌套虚拟化方案。
Sysbox 可以轻松安装到 Linux 主机(裸机、虚拟机、本地、云等)上。它适用于所有主流的基于云的 IaaS 和 Kubernetes 服务(例如 EC2、GCP、GKE、EKS、AKS、Rancher 等)。
安装后,Sysbox 在底层工作:你可以使用 Docker、Kubernetes 等通过它来部署容器。
例如,这个简单的 Docker 命令即可使用 Sysbox 创建一个容器:
$ docker run --runtime=sysbox-runc -it any_image
你将获得一个隔离良好的容器,它既能无缝运行微服务,也能运行通常运行在虚拟机上的系统级软件(例如 systemd、Docker、Kubernetes 等)。
有关如何使用 Sysbox 的更多信息,请参见此处。
如图所示,Sysbox 使非特权容器能够无缝运行 systemd、Docker、Kubernetes 等系统级工作负载,同时在容器隔离性、性能、效率和便携性之间为你提供平衡的方案。
而且它只需对你现有的基础设施进行最少的配置更改即可实现:只需安装 Sysbox,并将容器管理器/编排器配置为使用它来启动容器,使用你选择的镜像即可。
请注意,虽然 Sysbox 强化了标准容器的隔离性,并在许多场景下消除了对不安全特权容器的需求,但它(尚)无法提供与基于虚拟机的替代方案或像 gVisor 这样的用户空间操作系统相同的隔离级别。因此,对于需要最高隔离级别的场景,KubeVirt 等替代方案可能更可取(代价是性能和效率较低,复杂性和成本较高)。
更多信息请参见这篇博客文章。
Sysbox 项目面向任何希望使用系统容器进行实验、创新、学习和构建系统的人。它是一项前沿的操作系统虚拟化技术,欢迎贡献。
在 2022 年 5 月被 Docker 收购之前,Nestybox 提供 Sysbox Enterprise 作为 Sysbox 的增强版本(例如更强的安全性、更多的工作负载和官方支持)。
然而,收购之后,Sysbox Enterprise 不再作为独立产品提供,而是已并入 Docker Desktop(参见 Docker Hardened Desktop)。
注意: 由于 Sysbox Enterprise 不再作为独立产品提供,Docker 计划将 Sysbox Enterprise 的某些功能引入 Sysbox 社区版。具体功能尚未确定(TBD),欢迎你的反馈。
下表总结了 Sysbox 容器运行时的关键特性。
它还提供了 Sysbox 社区版(即本仓库)与之前可用的 Sysbox 企业版(现已弃用)之间的比较。
有关 Sysbox 特性的更多信息,请参见此处。
如有疑问,可以通过此处联系我们。
我们将 Sysbox 部署的容器称为系统容器,以强调它们不仅可以运行微服务(如常规容器那样),还可以运行 Docker、Kubernetes、Systemd、内嵌容器等系统软件。
有关系统容器的更多信息,请参见此处。
Sysbox 主机必须满足以下要求:
必须运行受支持的 Linux 发行版之一,并且是具有受支持架构的机器(例如 amd64、arm64)。
我们建议至少配备 4 个 CPU(例如 2 核带 2 个超线程)和 4GB 内存。虽然这不是硬性要求,但较小的配置可能会降低 Sysbox 的运行速度。
安装方法取决于将要安装 Sysbox 的环境:
要在 Kubernetes 集群上安装 Sysbox,请使用 sysbox-deploy-k8s daemonset。
否则,请使用适用于你发行版的 Sysbox 软件包。
另外,如果你的发行版尚无可用的软件包,或者你想获取上游的最新更改,可以从源代码构建并安装 Sysbox。
安装 Sysbox 后,你可以使用容器管理器或编排器(例如 Docker 或 Kubernetes)以及你选择的镜像来创建容器。
Docker 命令示例:
$ docker run --runtime=sysbox-runc --rm -it --hostname my_cont registry.nestybox.com/nestybox/ubuntu-bionic-systemd-docker
root@my_cont:/#
Kubernetes Pod 规范示例:
apiVersion: v1
kind: Pod
metadata:
name: ubu-bio-systemd-docker
annotations:
io.kubernetes.cri-o.userns-mode: "auto:size=65536"
spec:
runtimeClassName: sysbox-runc
containers:
- name: ubu-bio-systemd-docker
image: registry.nestybox.com/nestybox/ubuntu-bionic-systemd-docker
command: ["/sbin/init"]
restartPolicy: Never
你可以选择任何你想要的容器镜像,Sysbox 对镜像没有任何要求。
Nestybox 在其 Dockerhub 和 GitHub Container Registry 仓库中提供了多个参考镜像。这些镜像通常在容器内包含 systemd、Docker、Kubernetes 等。Dockerfile 位于此处。欢迎根据你的需要自由使用和修改。
我们努力提供良好的文档;它是 Sysbox 项目的关键组成部分。
我们有多份文档可以帮助你快速上手并充分发挥 Sysbox 的作用。
Sysbox 快速且高效,如这篇 Nestybox 博客文章所述。
Sysbox 创建的容器与 OCI runc(Docker 和 Kubernetes 的默认运行时)创建的容器性能相近。
即使在系统容器内部署的容器也拥有出色的性能,尽管网络 IO 会有轻微开销(这是符合预期的,因为内嵌容器发出的数据包会经过系统容器内部的额外网络接口/网桥)。
如果你使用 Sysbox 部署取代虚拟机的系统容器,那么性能和效率的提升将非常显著:你可以在同一台服务器上部署两倍于虚拟机数量的系统容器并获得相同的性能,而且只需消耗一小部分内存和存储。上面引用的博客文章对此有更多介绍。
Sysbox 于 2019 年初从出色的 OCI runc 分叉而来,它站在 OCI runc 开发者所做工作的肩膀上。
尽管如此,Sysbox 在其基础上增加了大量功能。它使用 Go 编写,目前由三个组件组成:sysbox-runc、sysbox-fs 和 sysbox-mgr。
Sysbox 使用了 Linux 内核的许多操作系统虚拟化特性,并辅以在用户空间实现的操作系统虚拟化技术。这些包括使用所有 Linux 命名空间(特别是用户命名空间)、对 procfs 和 sysfs 的部分虚拟化、选择性系统调用捕获等。
有关 Sysbox 设计的更多信息,请参阅 Sysbox 用户指南。
尽管 Sysbox 生成的容器在某些方面类似于虚拟机(例如,你可以以 root 身份运行、运行多个服务,并在其中部署 Docker 和 K8s),但 Sysbox 不使用硬件虚拟化。
Sysbox 是一种纯粹的操作系统虚拟化技术,旨在创建能够轻松、安全地运行应用程序和系统级软件的容器。
这使得 Sysbox 创建的容器快速、高效且便携(即它们不依赖于虚拟机监控程序)。
在隔离性方面,可以公平地说,Sysbox 容器比常规 Docker 容器提供更强的隔离性(通过使用 Linux 用户命名空间和轻量级操作系统垫片),但比虚拟机提供更弱的隔离性(因为容器之间共享 Linux 内核)。
我们欢迎对 Sysbox 的贡献,无论是小的文档修改、错误修复还是新功能添加。更多信息请参阅贡献指南和开发者指南。
有关 Sysbox 如何保护容器安全的信息,请参阅用户指南的安全章节。
如果你发现可能导致 Sysbox 漏洞的 bug 或问题,请发送电子邮件至 [email protected] 进行报告。请勿在本仓库中公开安全问题。谢谢!
此外,最近在 Linux 内核中发现了一些漏洞,在某些情况下会削弱或抵消 Sysbox 容器提供的增强隔离性。幸运的是,这些问题在最近的 Linux 内核中均已修复。更多信息请参阅 Sysbox 用户指南的漏洞与 CVE 章节,如有进一步问题,请在 Sysbox Slack 频道上联系。
目前以尽力而为的方式提供支持。
如果你有问题或评论,我们很乐意倾听。你可以通过我们的 Slack 频道联系我们,或在本 GitHub 仓库中提交 issue。
如果你发现 Sysbox 存在问题,请先搜索现有的 issues,因为它们可能已经描述了该问题并提供了解决方法。
另请查看故障排除文档。
在卸载 Sysbox 之前,请确保使用它部署的所有容器都已停止并移除。
卸载方法取决于安装 Sysbox 时所使用的方法:
以下是 Sysbox 路线图中的功能列表。
我们在此列出这些功能,以便用户更好地了解我们的发展方向,并可以就他们最喜欢(或最不喜欢)的功能向我们提供反馈。
以下是一个简短的列表;Sysbox 的 issue 跟踪器中还有更多。
支持更多 Linux 发行版。
对 procfs 和 sysfs 虚拟化进行更多改进。
持续改进容器隔离性。
以适当权限在系统容器内暴露宿主机设备。
Slack:Sysbox Slack 工作区
电子邮件:[email protected]
我们于太平洋时间周一至周五上午 9 点至下午 5 点提供服务。
我们衷心感谢你使用和/或为 Sysbox 做出贡献。我们希望你觉得它有趣,并希望它帮助你以更新、更强大的方式使用容器。