
사용자 공간 애플리케이션 커널로 시스템 호출을 가로채고 호스트 커널 접근을 제한하며, OCI 런타임을 통해 Docker/Kubernetes와 통합하여 컨테이너를 샌드박싱합니다.

gVisor는 실행 중인 애플리케이션과 호스트 운영 체제 사이에 강력한 격리 계층을 제공합니다. Linux 유사 인터페이스를 구현하는 애플리케이션 커널입니다. Linux와 달리 메모리 안전 언어(Go)로 작성되었으며 사용자 공간에서 실행됩니다.
gVisor는 Open Container Initiative (OCI) 런타임인 runsc를
포함하며, 이를 통해 기존 컨테이너 도구와 쉽게 연동할 수 있습니다. runsc
런타임은 Docker 및 Kubernetes와 통합되어 샌드박스 컨테이너를 간단히 실행할
수 있게 해줍니다.
seccomp-bpf)도 아니고, Linux 격리
프리미티브(예: firejail, AppArmor 등)를 감싸는 래퍼도 아닙니다.gVisor는 독특한 제3의 접근 방식을 취하며, 일반 사용자 공간 애플리케이션의 낮은 리소스 사용량, 빠른 시작, 유연성을 유지하면서 VM의 많은 보안 이점을 제공합니다.
컨테이너는 샌드박스가 아닙니다. 컨테이너는 애플리케이션을 개발, 패키징, 배포하는 방식을 혁신했지만, 추가 격리 없이 신뢰할 수 없거나 잠재적으로 악의적인 코드를 실행하는 데 사용하는 것은 좋은 생각이 아닙니다. 단일 공유 커널을 사용하면 효율성과 성능 향상을 얻을 수 있지만, 단 하나의 취약점으로 컨테이너 탈출이 가능하다는 의미이기도 합니다.
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/ 디렉터리에서 찾을 것으로 기대하는 몇 가지
사이드카 바이너리가 포함된 릴리스 tarball을 빌드한 다음 /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을 직접 사용하는 것은 권장되지 않지만, 시작하려면 다음을 따르세요:
종속 항목을 설정한 후에는 Makefile과 유사하게 Bazel을 사용할 수 있습니다:
bazel build -c opt //debian:gvisor-release-tar
표준 테스트 스위트를 실행하려면 다음을 사용할 수 있습니다:
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로
확인되는데, 이는 Bazel이 필요하며 표준 Go 도구와 호환되지 않습니다:
go get gvisor.dev/gvisor/pkg/tcpip/transport/tcp@go
참고: 이 브랜치에서 runsc를 빌드하는 것은 지원되지 않습니다.
gVisor와 runsc는 작동하기 위해 여러 바이너리(일부는 Go로 작성되지 않은
바이너리도 있음)가 필요합니다. go 브랜치는 최선의 노력으로 지원되며, 이
브랜치에서 직접 개발하는 것은 지원되지 않습니다. 개발은 master 브랜치에서
이루어져야 하며, 이후 go 브랜치에 반영됩니다.
프로젝트 거버넌스 정보는 GOVERNANCE.md를 참조하세요.
gvisor-users 메일링 리스트와 gvisor-dev 메일링 리스트는 질문과 토론을 시작하기 좋은 곳입니다.
SECURITY.md를 참조하세요.
Contributing.md를 참조하세요.