
通过用户空间应用内核将容器沙箱化,该内核拦截系统调用、限制宿主机内核访问,并通过 OCI 运行时与 Docker/Kubernetes 集成。

gVisor 在运行中的应用程序与宿主操作系统之间提供了强大的隔离层。它是一个实现了类 Linux 接口的应用内核。与 Linux 不同,它使用内存安全的语言(Go)编写,并运行在用户空间中。
gVisor 包含一个名为 runsc 的开放容器倡议(OCI)运行时,可轻松配合现有的容器工具使用。runsc 运行时可与 Docker 和 Kubernetes 集成,从而简化沙箱容器的运行。
seccomp-bpf),也不是对 Linux 隔离原语(例如 firejail、AppArmor 等)的封装。gVisor 采用了独特的第三种方法,在提供虚拟机的诸多安全优势的同时,保持了普通用户空间应用的低资源占用、快速启动和灵活性。
容器并不是沙箱。尽管容器彻底改变了我们开发、打包和部署应用的方式,但在没有额外隔离的情况下使用它们来运行不受信任或可能恶意的代码并不是个好主意。虽然使用单一共享内核可以带来效率和性能上的提升,但这也意味着只需一个漏洞就可能实现容器逃逸。
gVisor 是面向容器的应用内核。它限制了应用程序可访问的宿主内核表面,同时仍让应用程序能够访问其所期望的所有功能。与大多数内核不同,gVisor 不假设也不要求固定的物理资源集合;相反,它利用现有的宿主内核功能,并作为普通进程运行。换言之,gVisor 通过 Linux 的方式来实现 Linux。
不应将 gVisor 与用于加固容器以抵御外部威胁、提供额外完整性检查或限制服务访问范围的技术和工具相混淆。人们应始终谨慎对待向容器提供哪些数据。
用户文档和技术架构(包括快速入门指南)可在 gvisor.dev 找到。
gVisor 可在 x86_64 和 ARM64 上构建。其他架构可能在未来支持。
就本说明而言,bazel 及其他构建依赖项都封装在一个构建容器中。也可以直接使用 bazel,或输入 make help 查看标准目标。
请确保已安装以下依赖项:
构建一个发布压缩包,其中包含 runsc、containerd-shim-runsc-v1 containerd shim,以及 runsc 期望在其自身旁边的 gvisor-bin/ 目录中找到的几个 sidecar 二进制文件,然后将其解压到 /usr/local/bin:
make release-tarball DESTINATION=bin/
sudo tar -C /usr/local/bin -xf bin/gvisor.tar.bz2
要构建特定的库或二进制文件,可以指定目标:
make build TARGETS="//pkg/tcpip:tcpip"
由于额外的开销,不推荐直接使用 Bazel,但若要开始使用:
设置好依赖项后,使用 Bazel 与使用 Makefile 类似:
bazel build -c opt //debian:gvisor-release-tar-bz2
要运行标准测试套件,你可以使用:
make unit-tests
make tests
要运行特定测试,可以指定目标:
# Makefile
make test TARGETS="//runsc:version_test"
# Bazel
bazel test //runsc:version_test
部分软件包支持直接在 macOS 上运行测试。在撰写本文时,gVisor 需要 bazel 8,你可以通过 homebrew 安装:
brew install bazel@8
# You can then run the tests, e.g.:
$(brew --prefix bazel@8)/bin/bazel test --macos_sdk_version=$(xcrun --show-sdk-version) -- //tools/nogo/... //tools/check{aligned,const,escape,linkname,locks,unsafe}/...
go get本项目使用 bazel 来构建和管理依赖。为方便起见,项目维护了一个合成的 go 分支,它与标准 go 工具链兼容。这对于依赖 gVisor 子包(例如通过 Netstack 实现用户态网络)的外部包和库来说非常有用,可将 gVisor Go 代码导入到它们的 Go 项目中。
请通过 go 分支查询显式选择该分支。@latest 会解析到 master,而 master 需要 Bazel,与标准 Go 工具链不兼容:
go get gvisor.dev/gvisor/pkg/tcpip/transport/tcp@go
注意:不支持从此分支构建 runsc。gVisor 和 runsc 需要多个二进制文件(其中一些甚至不是用 Go 编写的)才能正常运行。go 分支以尽力而为的方式提供支持,不支持在此分支上直接进行开发。开发应在 master 分支上进行,然后将其反映到 go 分支中。
有关项目治理信息,请参阅 GOVERNANCE.md。
有关已知生产用户和采用者的列表,请参阅 ADOPTERS.md。
gvisor-users 邮件列表 和 gvisor-dev 邮件列表 是提问和讨论的良好起点。
请参阅 SECURITY.md。
请参阅 Releases。
请参阅 Contributing.md。