前言

之前摸鱼的时候在 Twitter 上刷到了 OrbStack 的相关推文。看了 Benchmark 对比后,决定安装上试一下,果然国外开发者诚不欺我!

进入 OrbStack 官网后引入眼帘的 Slogan 是:Say goodbye to slow, clunky containers and VMs

特点介绍

  • 原生 UI
  • 支持 Linux VMs 管理
  • 支持 ARM 和 Intel(在 ARM 可以上使用 Rosetta 转译)
  • VirtioFS 文件共享
  • 完善的 CLI 集成
  • Kubernetes 集成
  • 更高的网络吞吐
  • 支持 eBPF
  • 针对 Apple Silicon 优化
  • 支持为容器绑定域名

架构设计:

Arch

了解更多信息请移步至官方文档:

安装

brew install orbstack

域名

这是我觉得比较实用的功能,OrbStack 为 Docker compose 服务和容器都默认绑定了域名,我们可以通过访问 http://orb.local 来查看可访问的服务!

OrbStack Service list

例如我们在 OrbStack 中启动一个 名为 web 的 Nginx 容器,那么就会绑定一个 web.orb.local 的域名。OrbStack 通过 mDNS 来实现域名到 IP 的解析,我们可以通过如下命令查看域名解析的 IP:

dns-sd -Q web.orb.local
DATE: ---Sun 17 Sep 2023---
17:33:11.494  ...STARTING...
Timestamp     A/R  Flags         IF  Name                        Type   Class  Rdata
17:33:11.495  Add  40000002      24  web.orb.local.              Addr   IN     192.168.215.2

当然我们也可以自己手动注册,可以参考 dns-sd 的帮助手册:

dns-sd --help
dns-sd -E                          (Enumerate recommended registration domains)
dns-sd -F                          (Enumerate recommended browsing     domains)
dns-sd -R <Name> <Type> <Domain> <Port> [<TXT>...]         (Register a service)
dns-sd -P <Name> <Type> <Domain> <Port> <Host> <IP> [<TXT>...] (Register Proxy)
dns-sd -B        <Type> <Domain>                 (Browse for service instances)
dns-sd -Z        <Type> <Domain>           (Output results in Zone File format)
dns-sd -L <Name> <Type> <Domain>        (Resolve (‘lookup’) a service instance)
dns-sd -Q <name> <rrtype> <rrclass>         (Generic query for any record type)
dns-sd -q <name> <rrtype> <rrclass>     (Generic query, using SuppressUnusable)
dns-sd -G v4/v6/v4v6 <hostname>          (Get address information for hostname)
dns-sd -X udp/tcp/udptcp <IntPort> <ExtPort> <TTL>           (NAT Port Mapping)
dns-sd -H                               (Print usage for complete command list)
dns-sd -V            (Get version of currently running daemon / system service)
dns-sd -O [-compress|-stdout](Dump the state of mDNSResponder to file / STDOUT)

但是 mDNS 有一个限制,那就是只对 .local 这个 TLD 有效,这也是为什么 OrbStack 在官方文档中说仅支持 local 的 TLD!

而对于 Docker Compose 启动的容器,则会使用 Docker Compose 项目名称作为域名的中缀,如上图所示,我为 outline 启动的一些列服务,得到的域名如下

  • cockroachdb.outline.orb.local
  • outline.outline.orb.local
  • zitadel.outline.orb.local
  • minio.outline.orb.local
  • postgres.outline.orb.local
  • redis.outline.orb.local
  • nginx.outline.orb.local

当然除了默认绑定的域名,我们还可以通过在 docker-compose.yaml 文件中为 service 配置 label 项来手动指定域名:

services:
  nginx:
    image: nginx
    labels:
      - dev.orbstack.domains=foo.local,bar.local

通过上面的配置,我们可以访问 foo.local 和 bar.local 来访问 Nginx 容器!

总结

OrbStack 强大且优雅,无论是 UI 还是设计理念,据说该项目的开发者还是一名大学生,只能说努力在天赋面前一文不值……

I hope this is helpful, Happy hacking…