Mac平台虚拟化神器:Orbstack

OrbStack](https://orbstack.dev/) 是一种快速、轻便和简单的方式来运行容器和 Linux 机器。Mac 平台中强烈建议用它替换 Docker Desktop,它比 Docker Desktop 占用更少的资源,官方有对比,感兴趣可以在这里查看https://docs.orbstack.dev/benchmarks,从图中对比来看,直接吊打。

OrbStack 占用的资源很少。OrbStack 在空闲时使用大约 0.1% 的 CPU,通常会降至 0%,这比大多数应用程序的后台 CPU 使用率更低!并且还可以在运行容器或者虚拟机的时候使用 orb config命令来限制 cpu 的最大使用量。当然啦,如果我们想尽量减少 CPU 的占用,那停止任何没有使用的容器或者关闭任何没有使用的虚拟机。OrbStack 是按需分配内存的,并会根据需要增长,并且后面没有使用的内存会自动返回给 macOS,这对于内存堪比黄金的 mac 电脑,真的是非常适合。OrbStack 磁盘占用也比较少,全新安装的 OrbStack 占用不到 10MB 的磁盘空间,并且它采用了完全动态的磁盘管理,几乎没有额外开销,其占用空间会根据需要自动增减。

安装

安装非常地简单,直接去官网https://orbstack.dev/download,选择对应的版本,下载安装即可,个人版是完全免费的。如果安装了 homebrew,推荐使用 brew install orbstack下载。

https://blog-img-1259526442.cos.ap-nanjing.myqcloud.com/20250506152053836.png

使用 OrbStack 运行 docker 容器

命令

OrbStack 包括一个 Docker 引擎来运行容器,无缝支持包括网络、端口转发、挂载目录和卷等功能。 OrbStack 包含最新的命令行工具,包括 Compose 和 buildx,这些工具不用我们自己安装,如果已经安装了其他的 docker 工具(例如 docker Desktop),但是想使用 OrbStack 提供的工具,直接卸载掉原来的工具,OrbStack 提供了从其他工具迁移数据的命令。

运行一个容器试试看:

docker run --name nginx --rm -p 80:80 nginx

在本地访问一下:

https://blog-img-1259526442.cos.ap-nanjing.myqcloud.com/20250506155724718.png

可以看到,访问是完全没有问题的,使用docker ps看一下运行中的容器:

https://blog-img-1259526442.cos.ap-nanjing.myqcloud.com/20250506155910078.png

网络

OrbStack 拥有一个定制构建的虚拟网络堆栈,旨在实现无缝连接。它实现了所有常见的网络功能,包括 IPv6、ping 和 traceroute。端口转发、主机网络和其他功能也均受支持。

在 OrbStack 中,容器拥有形如“容器名称.orb.local”的域名,(例如上面例子中的 ngnx 容器就有一个nginx.orb.local的域名),无需进行配置或使用端口号。

我们可以在另一个容器中试一下:

docker run --rm alpine/curl http://nginx.orb.local

可以看到,在容器中是可以通过域名访问对应容器的服务的。

https://blog-img-1259526442.cos.ap-nanjing.myqcloud.com/20250506160620028.png

上面的例子是直接创建一个容器运行的例子,如果使用 docker compose 运行,OrbStack 也提供了域名访问,格式是**service.project.orb.local**,例如,我们有一个 test 的 project ,里面有两个 服务 foobar,那么这两个服务对应的域名就分别是foo.test.orb.localbar.test.orb.local,下面我们用下面的这个例子来测试一下:

version: "3.8"
services:
  foo:
    image: nginx:alpine
    container_name: test_foo
    ports:
      - "8081:80"
    command: /bin/sh -c "echo '<h1>This is Foo</h1>' > /usr/share/nginx/html/index.html && nginx -g 'daemon off;'"
  bar:
    image: nginx:alpine
    container_name: test_bar
    ports:
      - "8082:80"
    command: /bin/sh -c "echo '<h1>This is Bar</h1>' > /usr/share/nginx/html/index.html && nginx -g 'daemon off;'"

使用下面这个命令把,容器运行起来

docker-compose -p test up -d

能看到这个项目已经运行起来了,下面用两个命令来测试一下:

https://blog-img-1259526442.cos.ap-nanjing.myqcloud.com/20250506173846071.png

docker run --rm alpine/curl http://foo.test.orb.local

https://blog-img-1259526442.cos.ap-nanjing.myqcloud.com/20250506174115045.png

docker run --rm alpine/curl http://bar.test.orb.local

https://blog-img-1259526442.cos.ap-nanjing.myqcloud.com/20250506174130515.png

存储

OrbStack 让在 macOS 上原生访问容器、镜像、卷和虚拟机中的文件变得轻松。这与访达、编辑器、命令行工具及其他 macOS 应用程序无缝协作。要开始使用,可从访达边栏中打开“~/OrbStack”,或在 OrbStack 应用程序中点击任何容器、镜像或卷上的文件夹按钮。

  • 容器的文件存储目录:~/OrbStack/docker/containers/<name>
  • 卷的存储目录:~/OrbStack/docker/volumes/<name>
  • 镜像的存储目录:~/OrbStack/docker/images/<tag>

使用 OrbStack 运行 Linux 虚拟机

当前 OrbStack 支持如下的 Linux 发行版:

  • Alma
  • Alpine
  • Arch
  • CentOS
  • Debian
  • Devuan
  • Fedora
  • Gentoo
  • Kali
  • NixOS
  • openSUSE
  • Oracle
  • Rocky
  • Ubuntu
  • Void

命令

使用 orb create命令创建虚拟机,例如:

# 如果不写版本,默认创建最新的稳定版
orb create ubuntu
# 创建的时候指定版本 24.04 LTS
orb create ubuntu:noble
# 创建的时候指定命令
orb create ubuntu my-machine

执行 orb命令进入默认 Linux 虚拟机 shell 中,如果想指定其他的虚拟机使用orb -m your-vm-name -u your-vm-user, 下面的例子我们均在默认虚拟机中测试,如果想在其他的虚拟机中测试,请加上 -m your-vm-name -u your-vm-user选项。

另外,orb 运行的时候还可以使用 -m指定 work directory,如果不指定就是当前的 mac 目录。

在虚拟机中运行命令,例如 uname -a,我们在 mac 的终端里面直接运行orb uname -a,加上 orb这个前缀,我们就不用进入虚拟机中,执行命令了。

https://blog-img-1259526442.cos.ap-nanjing.myqcloud.com/20250506181346932.png

orb 支持的命令如下:

completion  Generate completion script
config      Change OrbStack settings
create      Create a new machine
debug       Debug a Docker container with extra commands
default     Get or set the default machine
delete      Delete a machine
docker      Show commands for using Docker
help        Help about any command
info        Get info about a machine
k8s         Show commands for using Kubernetes
list        List machines
login       Log in and activate your OrbStack license
logout      Log out of your OrbStack account
logs        Show logs for a machine
migrate     Migrate data from Docker Desktop to OrbStack
pull        Copy files from Linux
push        Copy files to Linux
rename      Rename a machine
report      Gather info for a bug report
reset       Delete all Linux and Docker data
restart     Restart a machine
run         Run command on Linux
ssh         Show SSH details
start       Start OrbStack or a machine
status      Check whether OrbStack is running
stop        Stop OrbStack or a machine
update      Update OrbStack
version     Show OrbStack version
$ orb list
NAME          STATE    DISTRO  VERSION   ARCH   SIZE
----          -----    ------  -------   ----   ----
ubuntu        running  ubuntu  oracular  arm64  721.4 MB
ubuntu-24.04  running  ubuntu  noble     arm64  769.2 MB
(base)

除了 orb 之外,还有一个 orbctl 命令,这个命令和 orb 实现的功能是一样的,支持的命令也是一样的是,只不过 使用 orbctl 运行的格式是 orbctl run 或者 orbctl shell

OrbStack 除了支持在 mac 系统中直接运行 Linux 命令之外,还支持在 Linux 虚拟机中运行 mac 命令,在命令的前方添加 mac 前缀即可

$ mac uname -a
Darwin Hus-MacBook-Pro.local 24.5.0 Darwin Kernel Version 24.5.0: Tue Apr 22 20:42:08 PDT 2025;

和 orb 命令类似,mac 命令也有一个 macctl 命令,使用方式和 orbctl 类似

我们还可以使用 mac link 将 macOS 命令链接到 Linux。链接后的命令无需在运行前加上 mac 前缀,并且可以像原生 Linux 命令一样使用。例如:

mac link pbcopy

使用 orb push 和 orb pull 这两个命令可以实现 mac 和 Linux 虚拟机之间文件的传输

从 Linux 虚拟机复制文件到 mac

orb pull ~/foo.txt

从 mac 复制文件到 Linux 虚拟机

orb push ~/bar.txt

复制的时候还可以指定主机名和目录

orb push -m my-machine ~/bar.txt /home/my-user/code/

网络

OrbStack 使用定制的虚拟网络堆栈,旨在实现无缝连接。它实现了所有常见的网络功能,包括 IPv6、ping 和 traceroute,并遵循你的 VPN 和 DNS 设置。该网络针对速度进行了优化,在 macOS 和 Linux 之间的吞吐量高达 45 Gbps。和 docker 中的类似,所有的虚拟机都有一个域名,一般是 machine-name.orb.local,在 mac 中可以使用这个域名连接 Linux 虚拟机中的服务,同样在 Linux 虚拟机中,mac 机器的域名是host.orb.internal,我们可以使用这个域名连接 mac 中的服务。还有一个更厉害的,如果我们在 mac 平台上启动了 docker 容器,在 Linux 虚拟机中可以使用 docker.orb.internal来访问 docker 容器中的服务。

# On macOS
docker run --rm -p 80:80 nginx
# On Linux
curl docker.orb.internal