用 Lima 在你的 Mac 上運行容器
在你的 Mac 上運行容器可能是一個挑戰。畢竟,容器是基于 Linux 特有的技術,如控制組和命名空間。
幸運的是,macOS 擁有一個內置的虛擬機監控程序hypervisor,允許在 Mac 上運行虛擬機(VM)。虛擬機監控程序是一個底層的內核功能,而不是一個面向用戶的功能。
hyperkit 是一個可以使用 macOS 虛擬機監控程序運行虛擬機的 開源項目。hyperkit 被設計成一個“極簡化”的虛擬機運行器。與 VirtualBox 不同,它沒有花哨的 UI 功能來管理虛擬機。
你可以獲取 hyperkit,這是一個運行容器管理器的極簡 Linux 發行版,并將所有部分組合在一起。但這將有很多變動組件,且聽起來像有很多工作。特別是如果你想通過使用 vpnkit (一個開源項目,用于創建感覺更像是主機網絡一部分的虛擬機網絡)使網絡連接更加無縫。
Lima
當 lima 項目 已經解決了這些細節問題時,就沒有理由再去做這些努力了。讓 lima 運行的最簡單方法之一是使用 Homebrew。你可以用這個命令安裝 lima:
- $ brew install lima
安裝后,可能需要一些時間,就享受一些樂趣了。為了讓 lima 知道你已經準備好了,你需要啟動它。下面是命令:
- $ limactl start
如果這是你第一次運行,你會被問到是否喜歡默認值,或者是否要改變其中的任何一項。默認值是非常安全的,但我喜歡生活在瘋狂的一面。這就是為什么我跳進一個編輯器,從以下地方進行修改:
- - location: "~"
- # CAUTION: `writable` SHOULD be false for the home directory.
- # Setting `writable` to true is possible but untested and dangerous.
- writable: false
變成:
- - location: "~"
- # I *also* like to live dangerously -- Austin Powers
- writable: true
正如評論中所說,這可能是危險的。可悲的是,許多現有的工作流程都依賴于掛載是可讀寫的。
默認情況下,lima 運行 containerd 來管理容器。containerd 管理器也是一個非常簡潔的管理器。雖然使用一個包裝的守護程序,如 dockerd,來增加這些漂亮的工效是很常見的,但也有另一種方法。
nerdctl 工具
nerdctl 工具是 Docker 客戶端的直接替換,它將這些功能放在客戶端,而不是服務器上。lima 工具允許無需在本地安裝就可以直接從虛擬機內部運行 nerdctl。
做完這些后,可以運行一個容器了!這個容器將運行一個 HTTP 服務器。你可以在你的 Mac 上創建這些文件:
- $ ls
- index.html
- $ cat index.html
- hello
現在,掛載并轉發端口:
- $ lima nerdctl run --rm -it -p 8000:8000 -v $(pwd):/html --entrypoint bash python
- root@9486145449ab:/#
在容器內,運行一個簡單的 Web 服務器:
- $ lima nerdctl run --rm -it -p 8000:8000 -v $(pwd):/html --entrypoint bash python
- root@9486145449ab:/# cd /html/
- root@9486145449ab:/html# python -m http.server 8000
- Serving HTTP on 0.0.0.0 port 8000 (<http://0.0.0.0:8000/>) ...
在另一個終端,你可以檢查一切看起來都很好:
- $ curl localhost:8000
- hello
回到容器上,有一條記錄 HTTP 客戶端連接的日志信息:
- 10.4.0.1 - - [09/Sep/2021 14:59:08] "GET / HTTP/1.1" 200 -
一個文件是不夠的,所以還要做些優化。 在服務器上執行 CTRL-C,并添加另一個文件:
- ^C
- Keyboard interrupt received, exiting.
- root@9486145449ab:/html# echo goodbye > foo.html
- root@9486145449ab:/html# python -m http.server 8000
- Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
檢查你是否能看到新的文件:
- $ curl localhost:8000/foo.html
- goodbye
總結
總結一下,安裝 lima 需要一些時間,但完成后,你可以做以下事情:
- 運行容器。
- 將你的主目錄中的任意子目錄掛載到容器中。
- 編輯這些目錄中的文件。
- 運行網絡服務器,在 Mac 程序看來,它們是在 localhost 上運行的。
這些都是通過 lima nerdctl 實現的。