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