開全端專案時常會遇到一個景象:打開 Docker Desktop,跑起 nginx、postgres、Vite 的 frontend 跟 FastAPI 的 backend,還沒開始寫 code,風扇就已經在轉,電量也肉眼可見地往下掉。build 一次 FastAPI image,等到可以去沖一杯咖啡回來。這些狀況都指向同一件事:在 Mac 上跑容器會卡、會燙、會耗電、build 還特別慢,不是容器的問題,是 Docker Desktop 不夠 Mac 原生。
這篇要介紹的 OrbStack 就是為 Apple Silicon 重寫的 Docker Desktop 替代方案。這篇會從底層架構開始,接著講我實際換過來後最有感的啟動速度、UI 跟價格,最後補上安裝和解除安裝流程。OrbStack 會動到系統幾個地方,隨便刪 app 會留殘留,這段比想像中重要。
OrbStack 為什麼會更快更輕
OrbStack 不是「調教得比較好」的 Docker Desktop,是架構上就不一樣。Docker Desktop 是跨平台產品,Mac 只是它的其中一個目標——虛擬化底層現在雖然也支援 Apple 的 Virtualization.framework,但外層的 filesystem 共享、網路堆疊、排程對接都是通用設計。OrbStack 是為 Apple Silicon 從頭寫的,整套鏈路都針對 Mac 手工優化。
下面三個具體的架構決策,剛好各自對應開場列的一個痛點。
為 Mac 原生重寫:解決卡、燙
OrbStack 底層也是用 Virtualization.framework,但關鍵在圍繞這個框架重寫的所有東西——檔案系統共享、網路堆疊、跟 macOS 排程器的對接都是針對 Mac 手工寫的,而不是跨平台通用實作。使用者感受到的差異,就是 container 跑起來時 CPU 占用低、context switch 開銷小,整台機器不會因為 container 在跑就常態燙手。
記憶體動態配置:解決耗電
Docker Desktop 要你在設定裡預先配 RAM(例如 8GB),不管 container 有沒有用到,那 8GB 就是鎖走的。OrbStack 改成動態配置——container 用多少它吃多少,閒置時系統可以回收。這件事對電池壽命差異很大,因為沒在跑容器的時候背景不會一直掛著一塊 memory pressure。
根據 OrbStack 官方 benchmark(2023 年 8 月在 M1 Max MacBook Pro 上測的,版本有點舊但架構差異到今天還在),跑同樣的工作負載耗電差異很誇張:Sentry 自架堆疊從 Docker Desktop 的 726 mW 降到 180 mW(省 75%)、K8s 約只耗 Docker Desktop 的 1/5、Supabase 約 1/2。這不是小數字,是「同樣插著充電線工作,筆電風扇不會響」等級的差異。
Rosetta 跑 x86 image:解決 build 慢
Apple Silicon 是 ARM 架構,但大部分 Docker image 還是 x86。Docker Desktop 用 QEMU 模擬 x86,效能很差——像 FastAPI 的 pip install 碰到需要 native compile 的套件(psycopg2、cryptography、pillow 這些),build 一次可以等到懷疑人生。OrbStack 改用 Rosetta 來跑 x86 binary,速度跟原生 ARM 接近,同一個 Dockerfile build 起來快非常多。
官方 benchmark 比較過幾個大型 image 的 build 時間:Open edX 從 Docker Desktop 的 45 分鐘縮到 17 分鐘(快 62%),PostHog 也有類似等級的差距。日常的小 image 感受不一定這麼戲劇化,但複雜專案或 full rebuild 會差到一杯咖啡的時間。
從 Docker Desktop 換過來能帶走什麼
CLI 完全相容,docker、docker compose 指令照用,Dockerfile 跟 compose 檔一字都不用改,這是換過來幾乎零成本的前提。實際換過來,差異主要出現在三個地方:啟動速度、UI、價格。
啟動跟待命都幾乎無感
Docker Desktop 從點開到能用要等十幾秒、有時候還會卡在那顆鯨魚 icon 轉圈圈。OrbStack 幾乎是開即用,點一下 menu bar 差不多馬上就能下 docker ps。一天開開關關幾次的累積差距很明顯。
Pricing
個人用免費,商用需要 Pro license。我個人用沒遇到限制,少數付費限定功能(像後面會提到的 Debug Shell)一般也用不到。
免費使用,商用需訂閱 官方網站UI:container 的四個分頁
這一塊是我換過去之後最有感的部分。OrbStack 的 container 詳情頁有 Info、Logs、Terminal、Files 四個分頁,把日常除錯最需要的操作直接做成 UI,省掉不少 docker exec、docker logs 的手敲跟 context switch。
Info 分頁:port forwards 一眼看光
Container 的基本資料(ID、image、status)、Port Forwards 列表、Mounts 全列在一頁。以前要確認「這個 container 開在哪個 port、對到 host 哪個 port」要去翻 compose 檔或下 docker port,現在直接看這張表,host port 還是可點的連結,點下去直接開瀏覽器送到對應的 localhost。
對全端工作流特別有用——nginx 開 80/443、backend 開 8080、pgweb 開某個 debug port,一眼就知道現在這些服務的入口在哪。
Logs 分頁:多服務 log 不打架
Logs 分頁直接看,不用手敲 docker logs -f。但真正有用的是——選到 container group 的層級時,它會把底下所有 service 的 log 合併顯示,而且每個 service 的名字會自動上色(截圖裡那個藍色的 backend_container prefix)。
開全端專案 debug 最煩的就是 nginx、backend、frontend 的 log 各自一個 terminal 視窗開著切來切去。OrbStack 把所有 service log 合在同一個流裡、靠顏色辨識來源,一眼就能看到「frontend 發了什麼請求 → nginx 收到後 → backend 怎麼回」的完整鏈。
Terminal 分頁:一鍵進 container shell
點一下就開 container 的 shell,不用 docker exec -it ... sh 手敲。
還有一個叫 Debug Shell 的進階功能。點右上角開關後,它會開一個內建除錯工具的環境(可裝超過 8 萬個套件),連 distroless / minimal image 也能進去除錯(這類 image 本身沒有 shell,正常情況連不進去)。Debug Shell 需要 Pro license,平常用的 terminal 是免費的。
Files 分頁:像 Finder 一樣逛 container
直接用 Finder 風格的介面瀏覽 container 的 filesystem。除錯「我 mount 的 config 到底有沒有進去」、「環境變數檔案路徑對不對」這類問題特別方便——以前要 docker exec 進去 cat 一下,現在點開 Files 分頁直接看,甚至可以在 host 端直接開啟編輯。
安裝方法
步驟一:停掉並解除安裝 Docker Desktop
OrbStack 跟 Docker Desktop 都會搶 /var/run/docker.sock 這個 socket,同時跑一定會衝突。所以要換過去之前,第一件事是先把 Docker Desktop 完全移除,不是只關閉,是解除安裝。
打開 Docker Desktop → 右上角的蟲蟲圖示(Troubleshoot)→ Uninstall。或直接把 /Applications/Docker.app 拖到垃圾桶也可以,但建議用內建的 uninstaller 會清得比較乾淨。
步驟二:安裝 OrbStack
推薦用 Homebrew 裝:
brew install --cask orbstack
或者到官網下載 .dmg 手動安裝也行,效果一樣。
步驟三:第一次啟動,遷移舊資料
打開 OrbStack 後,它會偵測到系統裡有 Docker Desktop 的殘留資料,自動跳出 Migrate from Docker Desktop 的選項。按下去之後 image、container、volume 會全部搬過來,不用自己重 pull 或重建。
如果錯過了自動跳出的遷移視窗,可以直接在 terminal 下 CLI 指令觸發同一個流程:
orb migrate docker
遷移完成後下 docker ps,看到的應該就是原本 Docker Desktop 裡那些 container,只是現在跑在 OrbStack 的 engine 上。原本的 docker-compose.yml 開起來繼續用,一樣的指令、一樣的輸出,但啟動更快、機器更安靜。
番外:OrbStack 的解除安裝方法
這個小節會單獨寫,是因為 OrbStack 安裝時會動到系統的幾個地方——不是單純丟在 Applications 就算了。如果只是把 /Applications/OrbStack.app 拖到垃圾桶,殘留的東西會讓你之後想回裝 Docker Desktop 或換別的容器引擎時撞到各種 socket 衝突跟 PATH 找不到的問題。
OrbStack 動了哪些東西:
- 在
/usr/local/bin/塞了一組 shim,讓docker、docker-compose、kubectl、orb等指令導向 OrbStack 自己的 binary - 註冊了自己的 Docker context
- 資料放在
~/.orbstack跟~/Library/Group Containers/HUAQ24HBR6.dev.orbstack
步驟一:切換 Docker context 回原本
如果之後要裝回 Docker Desktop 或換別的引擎,先把 Docker context 切回去,不然敲 docker 還是會找 OrbStack 的 socket:
docker context use default
docker context rm orbstack
步驟二:移除 OrbStack 應用跟資料
這是 OrbStack 官方文件 給的完整移除步驟——把 app 從 Applications 移到垃圾桶,然後:
rm -rf ~/.orbstack
rm -rf ~/Library/Group\ Containers/HUAQ24HBR6.dev.orbstack
步驟三:清 /usr/local/bin 的 symlinks
這步不在官方文件裡,但 OrbStack 會在 /usr/local/bin 塞一組 shim,app 移除後這些連結會指向不存在的路徑:
rm /usr/local/bin/docker /usr/local/bin/docker-compose /usr/local/bin/kubectl
rm /usr/local/bin/orb /usr/local/bin/orbctl /usr/local/bin/docker-credential-osxkeychain
如果打算裝 Docker Desktop,它會自己再建一組 symlink,可以先不清;但要換到 colima 或 Apple Containers 之類的其他引擎,這步最好做。最後重開終端機,下 which docker 確認沒指到 OrbStack 路徑就算乾淨了。