用 Lima 在你的 Mac 上運(yùn)行容器
在你的 Mac 上運(yùn)行容器可能是一個(gè)挑戰(zhàn)。畢竟,容器是基于 Linux 特有的技術(shù),如控制組和命名空間。
幸運(yùn)的是,macOS 擁有一個(gè)內(nèi)置的虛擬機(jī)監(jiān)控程序hypervisor,允許在 Mac 上運(yùn)行虛擬機(jī)(VM)。虛擬機(jī)監(jiān)控程序是一個(gè)底層的內(nèi)核功能,而不是一個(gè)面向用戶(hù)的功能。
hyperkit 是一個(gè)可以使用 macOS 虛擬機(jī)監(jiān)控程序運(yùn)行虛擬機(jī)的 開(kāi)源項(xiàng)目。hyperkit 被設(shè)計(jì)成一個(gè)“極簡(jiǎn)化”的虛擬機(jī)運(yùn)行器。與 VirtualBox 不同,它沒(méi)有花哨的 UI 功能來(lái)管理虛擬機(jī)。
你可以獲取 hyperkit,這是一個(gè)運(yùn)行容器管理器的極簡(jiǎn) Linux 發(fā)行版,并將所有部分組合在一起。但這將有很多變動(dòng)組件,且聽(tīng)起來(lái)像有很多工作。特別是如果你想通過(guò)使用 vpnkit (一個(gè)開(kāi)源項(xiàng)目,用于創(chuàng)建感覺(jué)更像是主機(jī)網(wǎng)絡(luò)一部分的虛擬機(jī)網(wǎng)絡(luò))使網(wǎng)絡(luò)連接更加無(wú)縫。
Lima
當(dāng) lima 項(xiàng)目 已經(jīng)解決了這些細(xì)節(jié)問(wèn)題時(shí),就沒(méi)有理由再去做這些努力了。讓 lima 運(yùn)行的最簡(jiǎn)單方法之一是使用 Homebrew。你可以用這個(gè)命令安裝 lima:
- $ brew install lima
安裝后,可能需要一些時(shí)間,就享受一些樂(lè)趣了。為了讓 lima 知道你已經(jīng)準(zhǔn)備好了,你需要啟動(dòng)它。下面是命令:
- $ limactl start
如果這是你第一次運(yùn)行,你會(huì)被問(wèn)到是否喜歡默認(rèn)值,或者是否要改變其中的任何一項(xiàng)。默認(rèn)值是非常安全的,但我喜歡生活在瘋狂的一面。這就是為什么我跳進(jìn)一個(gè)編輯器,從以下地方進(jìn)行修改:
- - 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
正如評(píng)論中所說(shuō),這可能是危險(xiǎn)的。可悲的是,許多現(xiàn)有的工作流程都依賴(lài)于掛載是可讀寫(xiě)的。
默認(rèn)情況下,lima 運(yùn)行 containerd 來(lái)管理容器。containerd 管理器也是一個(gè)非常簡(jiǎn)潔的管理器。雖然使用一個(gè)包裝的守護(hù)程序,如 dockerd,來(lái)增加這些漂亮的工效是很常見(jiàn)的,但也有另一種方法。
nerdctl 工具
nerdctl 工具是 Docker 客戶(hù)端的直接替換,它將這些功能放在客戶(hù)端,而不是服務(wù)器上。lima 工具允許無(wú)需在本地安裝就可以直接從虛擬機(jī)內(nèi)部運(yùn)行 nerdctl。
做完這些后,可以運(yùn)行一個(gè)容器了!這個(gè)容器將運(yùn)行一個(gè) HTTP 服務(wù)器。你可以在你的 Mac 上創(chuàng)建這些文件:
- $ ls
- index.html
- $ cat index.html
- hello
現(xiàn)在,掛載并轉(zhuǎn)發(fā)端口:
- $ lima nerdctl run --rm -it -p 8000:8000 -v $(pwd):/html --entrypoint bash python
- root@9486145449ab:/#
在容器內(nèi),運(yùn)行一個(gè)簡(jiǎn)單的 Web 服務(wù)器:
- $ 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/>) ...
在另一個(gè)終端,你可以檢查一切看起來(lái)都很好:
- $ curl localhost:8000
- hello
回到容器上,有一條記錄 HTTP 客戶(hù)端連接的日志信息:
- 10.4.0.1 - - [09/Sep/2021 14:59:08] "GET / HTTP/1.1" 200 -
一個(gè)文件是不夠的,所以還要做些優(yōu)化。 在服務(wù)器上執(zhí)行 CTRL-C,并添加另一個(gè)文件:
- ^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
總結(jié)
總結(jié)一下,安裝 lima 需要一些時(shí)間,但完成后,你可以做以下事情:
- 運(yùn)行容器。
- 將你的主目錄中的任意子目錄掛載到容器中。
- 編輯這些目錄中的文件。
- 運(yùn)行網(wǎng)絡(luò)服務(wù)器,在 Mac 程序看來(lái),它們是在 localhost 上運(yùn)行的。
這些都是通過(guò) lima nerdctl 實(shí)現(xiàn)的。