원문 캡처 · github.com
원문 캡처 · github.com

Boxr는 Rust로 작성한 루트리스 컨테이너 엔진으로, 컨테이너 실행뿐 아니라 이미지 빌드와 Compose 오케스트레이션, 런타임 기능도 제공한다. 프로젝트는 현재 베타 단계이며, 제작자는 기능을 보강하고 호환성 작업 부하를 시험하면서 커뮤니티의 기여와 피드백을 받고 있다고 설명한다.

Boxr 저장소에는 Linux에서 boxr 0.1.43으로 컨테이너를 가져오고 실행·관리하는 데모가 있다. 프로젝트 설명에 따르면 Boxr는 기본적으로 루트 권한 없이 작동하도록 설계됐으며, 데몬이나 sudo 없이 사용할 수 있다.

  • 루트리스 실행: 사용자 네임스페이스(CLONE_NEWUSER)와 uid_map, gid_map을 이용해 권한이 없는 사용자를 컨테이너 내부의 루트(UID 0)에 매핑한다. CAP_SYS_ADMIN, CAP_SYS_RAWIO 등의 기능을 제거하고 기본 seccomp 프로필을 적용한다.
  • 저장소와 리소스 관리: OverlayFS와 Copy-on-Write(CoW) 저장소 드라이버, cgroups v2 기반 메모리·CPU·프로세스 수 제한을 지원한다.
  • 이미지·네트워크·배포: Docker/OCI 형식의 이미지 저장·불러오기와 레지스트리 푸시, 볼륨·네트워크 관리, Dockerfile 빌드, Compose 배포 기능을 제공한다.
  • 컨테이너 관리: 대화형 터미널, 백그라운드 실행, 중지·시작·로그·컨테이너 내부 명령 실행·검사 기능을 지원한다.

CoW 저장소는 네이티브 OverlayFS의 lowerdir, upperdir, workdir, merged를 사용한다. 프로젝트는 빠른 하드링크 CoW 트리도 자체 구현했으며, 컨테이너를 밀리초보다 짧은 시간에 시작하고 디스크 사용량을 거의 0에 가깝게 만들 수 있다고 설명한다. 이 성능 표현은 프로젝트 측 설명이다.

cgroups v2 컨트롤러로 --memory 메모리 제한, --cpus CPU 할당량과 기간, --pids-limit 작업 수 제한을 설정한다. save와 load는 여러 레이어로 구성된 표준 Docker/OCI tar 아카이브를 처리한다. login, logout, push를 지원하며, 인증 정보는 Base64로 인코딩해 ~/.boxr/config.json에 저장한다.

네트워크는 브리지와 IP 주소 할당(IPAM), 외부 의존성이 없는 순수 Rust 사용자 모드 네트워크 스택 usernet, pasta 연동, 루트리스 포트 포워딩 프록시를 포함한다. 볼륨 기능은 로컬 명명 볼륨, 호스트 디렉터리 바인드 마운트(예: -v /host:/container:ro), 볼륨 검사와 수명 주기 관리를 제공한다. Dockerfile 빌더는 FROM, RUN, COPY, ADD, WORKDIR, ENV, CMD, ENTRYPOINT, EXPOSE, LABEL을 지원한다. Compose는 docker-compose.yml을 읽고 depends_on 의존성 그래프를 해석해 여러 컨테이너를 배포·종료하고 로그를 스트리밍한다.

Boxr에는 Unix 도메인 소켓 boxr.sock에서 실행되는 데몬 REST API도 있다. Docker Engine API의 /_ping, /version, /info, /containers, /images, /networks, /volumes 엔드포인트를 구현한다. Linux에서는 네이티브 실행을, macOS에서는 Virtualization.framework 기반 실행 브리지를 제공한다고 저장소는 설명한다.

설치와 실행

macOS와 Linux에서는 Homebrew 탭을 추가한 뒤 설치할 수 있다. 로그인 시 데몬을 자동 시작하는 백그라운드 서비스 실행은 선택 사항이다.

sh
brew tap kchaitanya863/tap
brew install boxr
brew services start boxr

Debian·Ubuntu에서는 최신 릴리스의 .deb 패키지를 내려받아 설치한다. 다음 명령은 x86_64/amd64용과 ARM64/aarch64용 설치 예다.

sh
curl -fsSLO https://github.com/kchaitanya863/homebrew-tap/releases/latest/download/boxr_0.1.18_amd64.deb
sudo dpkg -i boxr_*_amd64.deb

curl -fsSLO https://github.com/kchaitanya863/homebrew-tap/releases/latest/download/boxr_0.1.18_arm64.deb
sudo dpkg -i boxr_*_arm64.deb

Fedora·RHEL·CentOS에서는 DNF 또는 RPM으로 설치할 수 있다.

sh
sudo dnf install https://github.com/kchaitanya863/homebrew-tap/releases/latest/download/boxr-0.1.18-1.x86_64.rpm
sudo rpm -ivh boxr-*.rpm

Windows에서는 Chocolatey를 이용하거나 최신 릴리스의 사전 컴파일된 ZIP 파일을 내려받아 압축을 푼다. ZIP 설치 예는 C:\ProgramData\boxr에 파일을 풀고 시스템 Path에 실행 파일 경로를 추가한다.

sh
choco install boxr
powershell
Invoke-WebRequest -Uri https://github.com/kchaitanya863/homebrew-tap/releases/latest/download/boxr-windows-x86_64.zip -OutFile boxr.zip
Expand-Archive boxr.zip -DestinationPath C:\ProgramData\boxr
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\ProgramData\boxr\bin", "Machine")

저장소에서 제공하는 설치 스크립트를 실행하거나, GitHub에서 스크립트를 가져와 실행하는 방법도 있다.

sh
./install.sh
curl -fsSL https://raw.githubusercontent.com/kchaitanya863/boxr/main/install.sh | sh

직접 빌드하려면 Rust의 Cargo를 사용한다. 결과 바이너리는 target/release/boxr에 생성된다.

sh
cargo build --release

기존 docker 명령이 Boxr를 호출하도록 래퍼나 셸 별칭을 설정하는 방법은 선택 사항이다. 독립 실행 파일 래퍼는 boxr alias --install로 설치할 수 있다. 셸 별칭은 Bash/Zsh 설정 파일에 alias docker="boxr", Fish에는 alias docker "boxr"를 추가한다. PowerShell에서는 Set-Alias -Name docker -Value boxr를 쓴다. Docker를 함께 설치했거나 명령을 구분하고 싶다면 별칭 없이 boxr를 직접 호출하면 된다.

명령 예시

컨테이너 실행 시 메모리·CPU·프로세스 수 제한을 줄 수 있고, 네트워크 모드를 선택하거나 포트와 볼륨을 연결할 수 있다. 아래는 저장소에 기재된 사용 예다.

sh
./target/release/boxr run hello-world
./target/release/boxr run --memory 512m --cpus 1.5 --pids-limit 100 --rm alpine /bin/echo "Resource limits enforced"
./target/release/boxr run --network pasta -p 8080:80 nginx:latest
./target/release/boxr run --network usernet -p 8080:80 nginx:latest
./target/release/boxr run --network none alpine ifconfig
./target/release/boxr run -d --name web -p 8080:80 -v my-data:/data alpine /bin/sh -c "echo 'ready' > /data/status.txt; sleep 60"
./target/release/boxr logs -f -t -n 50 web
./target/release/boxr kill -s SIGHUP web
./target/release/boxr kill web
./target/release/boxr exec web /bin/cat /data/status.txt
./target/release/boxr inspect web
./target/release/boxr diff web
./target/release/boxr top web
./target/release/boxr pause web
./target/release/boxr unpause web
./target/release/boxr rename web production-web
./target/release/boxr wait production-web
./target/release/boxr cp web:/app/config.json ./local-config.json
./target/release/boxr cp ./updated-config.json web:/app/config.json
./target/release/boxr update --memory 1g --cpus 2.0 --pids-limit 200 web
./target/release/boxr attach web
./target/release/boxr stop production-web
./target/release/boxr start production-web
./target/release/boxr rm production-web

이미지 가져오기와 Dockerfile 빌드, 컨테이너 변경 사항의 이미지 저장, 레지스트리 인증·푸시는 다음과 같이 실행한다.

sh
./target/release/boxr pull alpine:latest
./target/release/boxr build -t my-app:v1 .
./target/release/boxr commit -m "added custom configs" my-container new-app:v1
./target/release/boxr save -o my-app.tar my-app:v1
./target/release/boxr load -i my-app.tar
./target/release/boxr login -u myuser -p mysecret
./target/release/boxr push my-app:v1
./target/release/boxr logout

명명 볼륨은 만들고 목록을 확인하거나 검사한 뒤 삭제할 수 있다. 사용자 정의 브리지 네트워크에는 서브넷을 지정할 수 있으며, 컨테이너를 연결하거나 네트워크를 검사·삭제할 수 있다.

sh
./target/release/boxr volume create app-db
./target/release/boxr volume ls
./target/release/boxr volume inspect app-db
./target/release/boxr volume rm app-db
./target/release/boxr network create my-net --subnet 172.30.0.0/16
./target/release/boxr network ls
./target/release/boxr network inspect my-net
./target/release/boxr network connect my-net my-container
./target/release/boxr network rm my-net

Compose는 파일을 지정해 다중 컨테이너 애플리케이션을 백그라운드로 올리고, 상태와 로그를 확인한 뒤 컨테이너와 네트워크를 종료·삭제한다.

sh
./target/release/boxr compose -f docker-compose.yml up -d
./target/release/boxr compose ps
./target/release/boxr compose logs
./target/release/boxr compose down

Podman 스타일 파드를 만들면 컨테이너끼리 네트워크와 IPC를 공유할 수 있다. Kubernetes Pod YAML을 실행하거나 기존 컨테이너·파드에서 YAML을 생성하는 명령도 제공한다.

sh
./target/release/boxr pod create --name web-pod -p 8080:80
./target/release/boxr pod ps
./target/release/boxr pod inspect web-pod
./target/release/boxr play kube pod.yaml
./target/release/boxr generate kube my-container
./target/release/boxr unshare whoami
./target/release/boxr pod rm web-pod

데몬은 Unix 도메인 소켓으로 실행하며, 예시에서는 Docker Engine API의 핑·버전·컨테이너 목록을 조회한다. Windows에서는 TCP를 사용할 수 있다고 설명한다. 서비스 설치·시작·상태 확인·중지·제거 명령도 제공한다.

sh
./target/release/boxr daemon --socket ~/.boxr/boxr.sock
curl --unix-socket ~/.boxr/boxr.sock http://localhost/_ping
curl --unix-socket ~/.boxr/boxr.sock http://localhost/version
curl --unix-socket ~/.boxr/boxr.sock http://localhost/containers/json
boxr service install
boxr service start
boxr service status
boxr service stop
boxr service uninstall

리소스 통계는 실시간 스트리밍 또는 단일 스냅샷으로 확인할 수 있다. 이벤트 명령은 컨테이너 생성·시작·종료·중지 같은 수명 주기 이벤트를 스트리밍한다. 시스템 명령은 컨테이너·이미지·볼륨·빌드 캐시의 디스크 사용량을 보여주며, 사용하지 않는 자원을 정리한다.

sh
./target/release/boxr stats
./target/release/boxr stats --no-stream
./target/release/boxr events
./target/release/boxr system df
./target/release/boxr system prune
./target/release/boxr system prune --all --volumes
./target/release/boxr completion zsh > ~/.zfunc/_boxr
./target/release/boxr completion bash > /etc/bash_completion.d/boxr
./target/release/boxr alias
./target/release/boxr alias --install

저장소에는 셸 자동 완성 스크립트를 Bash·Zsh·Fish용으로 생성하는 기능과 Docker 호환 래퍼 설치 명령도 안내돼 있다. 위 예시는 Zsh와 Bash 자동 완성 파일 생성, 별칭 명령 출력, ~/.boxr/bin/docker에 래퍼 설치를 보여준다.

벤치마크와 테스트

프로젝트는 ./benchmark.sh로 자동 벤치마크를 실행하는 방법과 Apple Silicon arm64에서 Boxr와 Docker를 비교한 결과를 공개했다. 측정 조건은 해당 플랫폼으로 한정돼 있다.

지표Boxr (Rust)Docker비교
데몬 대기 메모리 사용량8.4 MB859.2 MB102배 적음
CLI 최대 RAM 사용량(RSS)8.3 MB29.1 MB3.5배 적음
CLI 바이너리 디스크 크기8.0 MB (6.2M stripped)39.6 MB5~6.5배 작음
전체 제품군 디스크 사용량8.0 MB2.1 GB260배 작음
Dockerfile 빌드(캐시 없음)464.5 ms880.6 ms1.90배 빠름
Dockerfile 빌드(캐시 사용)161.9 ms182.4 ms1.13배 빠름
컨테이너 시작 지연 시간(중앙값)261.5 ms191.6 msmacOS 브리지에서 대등한 수준이라고 표기
컨테이너 5개 동시 시작546.4 ms427.5 ms1초 미만 처리량이라고 표기
볼륨 I/O(10MB 쓰기+읽기)300.5 ms218.6 ms네이티브에 가까운 I/O라고 표기

저장소는 전체 자동 테스트 명령으로 cargo test를 제시하며, 단위·통합·E2E 테스트 66개라고 설명한다. 테스트 범위에는 OCI 이미지 참조의 표준 형식, 사용자 정의 레지스트리와 포트, 기호가 들어간 태그, sha256 다이제스트 고정, 잘못된 입력이 포함된다. Dockerfile·다단계 빌드에서는 AS builder, COPY --from=, .dockerignore의 예외 패턴과 와일드카드, 줄 이어쓰기, 잘못된 명령 감지를 다룬다.

Compose 테스트는 여러 서비스의 의존성 그래프와 순환 의존성(A -> B -> A, A -> B -> C -> A), 정의되지 않은 의존성을 확인한다. 볼륨·네트워크 테스트에는 호스트 바인드 마운트, 읽기 전용 모드, 충돌 거부, 기본 boxr0 브리지 삭제 방지, IPAM 주소 순서 할당, 잘못된 포트 경계 검사가 포함된다. 보안·cgroups 테스트는 모든 바이트 길이에 대한 Base64 왕복 퍼징, 기본 seccomp의 주요 시스템 호출 차단, cgroups 메모리 단위 변환, Unix 신호 조합을 다룬다. E2E와 실제 작업 부하 테스트에는 존재하지 않는 컨테이너 오류, 잘못된 CLI 옵션, exec로 Redis에 ping·set·get을 수행하는 사례, 전체 스택 Compose 앱이 포함된다.

문서와 프로젝트 정보

저장소는 아키텍처와 런타임 내부 구조, 권한 제거·강화, 루트리스 격리, 네트워킹, CLI 명령을 설명하는 문서를 제공한다. 문서에는 트램펄린, 저장소 계층, 다중 플랫폼 하이퍼바이저 브리지, /tmp의 sticky 1777 권한, POSIX /dev/shm, PID 1 초기화, cgroups v2, 커널 네임스페이스와 하위 ID 매핑 등이 포함된다. Kubernetes 파드와 Compose 오케스트레이션 문서는 Podman 스타일 파드, play kube, Docker Compose DAG를 다룬다.

프로젝트는 MIT 라이선스로 공개됐으며, 기여 안내는 CONTRIBUTING.md에서 확인할 수 있다. 안내 문서는 아키텍처 불변 조건, 코딩 규칙, 개발 환경 설정과 풀 리퀘스트 지침을 다룬다.