Docker圖形客戶端與容器管理指南)
簡(jiǎn)介Kitematic 0.17.11是一款適用于macOS平臺(tái)的圖形化Docker管理工具面向希望在Mac上通過(guò)直觀界面運(yùn)行與維護(hù)容器的開(kāi)發(fā)者、運(yùn)維人員及Docker初學(xué)者?;贓lectron框架構(gòu)建支持從Docker Hub搜索鏡像、一鍵創(chuàng)建容器并能在圖形界面與Docker CLI之間無(wú)縫切換同時(shí)內(nèi)置端口映射、環(huán)境變量修改、數(shù)據(jù)卷配置和日志查看等常用功能可顯著降低命令行操作門(mén)檻適合日常開(kāi)發(fā)與容器化學(xué)習(xí)場(chǎng)景。壓縮包共182個(gè)文件整體約56.37MB以C/C頭文件、Electron運(yùn)行時(shí)pak資源、plist配置、current版本標(biāo)識(shí)及resources資源文件為主另有asar歸檔、dylib動(dòng)態(tài)庫(kù)與主程序組件結(jié)構(gòu)完整屬于可直接解壓使用的Mac應(yīng)用分發(fā)格式。已有294人瀏覽學(xué)習(xí)適合剛接觸容器化或希望提升開(kāi)發(fā)效率的macOS用戶。解壓后即可獲得完整可運(yùn)行的Kitematic.app相關(guān)組件省去自行搭建Docker GUI環(huán)境的額外配置步驟便于快速開(kāi)始容器實(shí)踐。1. Kitematic 0.17.11Mac 上一鍵式運(yùn)行 Docker 的圖形入口拿到一臺(tái) Mac想在本地跑 Docker最直接的反應(yīng)是裝桌面版客戶端但很多項(xiàng)目到現(xiàn)在還只用 Docker 的基礎(chǔ)功能拉鏡像、開(kāi)端口、掛目錄、看日志。這些操作在命令行里不難卻架不住每次都要回憶參數(shù)。Kitematic 0.17.11 就是為這個(gè)場(chǎng)景生的一個(gè) zip 包解壓后可以一鍵式安裝在 Mac 上把 Docker 跑起來(lái)然后給你一個(gè)圖形窗口。反直覺(jué)的是這個(gè)停更多年的老版本反而成了穩(wěn)定代名詞——它不追新功能資源占用小界面樸素適合不想被新版桌面端綁架的人。如果你剛開(kāi)始接觸容器或者只想把 Docker 當(dāng)本地工具用這個(gè)舊版圖形客戶端仍然值得試一遍。2. Mac 上跑 Docker 的選型為什么還要留一份 Kitematic2.1 Docker 在 Mac 上為什么非要一層虛擬機(jī)Docker 容器本身用的是 Linux 內(nèi)核的 namespace 和 cgroup而 macOS 的內(nèi)核是 XNU不能直接運(yùn)行 Linux 容器。所以在 Mac 上跑 Docker本質(zhì)上繞不開(kāi)一層虛擬化先啟動(dòng)一個(gè)帶 Linux 內(nèi)核的虛擬機(jī)虛擬機(jī)里跑 Docker daemon再讓客戶端與 daemon 通信。Kitematic 0.17.11 那個(gè)年代的常見(jiàn)做法是用輕量虛擬機(jī)工具創(chuàng)建一臺(tái)名為 default 的虛擬機(jī)虛擬機(jī)上跑 Linux 和 Docker 引擎圖形界面只是前端。Kitematic 把創(chuàng)建虛擬機(jī)、啟動(dòng)引擎、連接客戶端這一整套流程封裝成按鈕和進(jìn)度條。你看不到 docker-machine 的細(xì)節(jié)但如果你打開(kāi)過(guò)系統(tǒng)監(jiān)控會(huì)看到一個(gè)虛擬機(jī)進(jìn)程一直占著內(nèi)存和 CPU。理解這一點(diǎn)很重要Kitematic 不是容器運(yùn)行時(shí)它是一個(gè)殼真正干活的是后面那臺(tái) Linux 虛擬機(jī)。所以當(dāng)你遇到“Kitematic 打不開(kāi)”“引擎啟動(dòng)失敗”這類(lèi)問(wèn)題時(shí)第一反應(yīng)不應(yīng)該是重裝 Kitematic而是去看那臺(tái)虛擬機(jī)還在不在、能不能啟動(dòng)。正好這個(gè)版本的 Kitematic 通常和 docker-machine 是同一套體系。裝完后打開(kāi)終端執(zhí)行 docker-machine ls經(jīng)常能看到一臺(tái)名為 default 的機(jī)器。它的狀態(tài)是 Running 還是 Stopped基本決定了 Kitematic 能不能工作。默認(rèn)配置下這臺(tái)虛擬機(jī)的內(nèi)存和 CPU 都很保守如果你要跑多容器應(yīng)用內(nèi)存不夠是常態(tài)。常見(jiàn)做法是先停掉虛擬機(jī)把內(nèi)存調(diào)到 2GB 以上再啟動(dòng)。docker-machine stop default VBoxManage modifyvm default --memory 2048 --cpus 2 docker-machine start default這里 VBoxManage 是虛擬機(jī)工具提供的命令--memory 2048 表示把內(nèi)存設(shè)為 2048MB--cpus 2 表示分配兩個(gè) CPU 核心。先 stop 再改參數(shù)是必須的因?yàn)樘摂M機(jī)運(yùn)行中改配置會(huì)不生效甚至把配置寫(xiě)壞。Kitematic 打開(kāi)時(shí)如果你繞過(guò)了這個(gè)步驟很多容器會(huì)啟動(dòng)很慢或者在編譯前端項(xiàng)目時(shí)直接卡死。調(diào)完內(nèi)存后在 Kitematic 里重啟容器通常體感會(huì)好很多。2.2 Kitematic、docker CLI、Docker Desktop 三者怎么選現(xiàn)在 Mac 上跑 Docker 的主流方式大致有三類(lèi)命令行 docker、Docker Desktop 這類(lèi)現(xiàn)代客戶端以及 Kitematic 0.17.11 這種老圖形界面。命令行 docker 靈活適合寫(xiě)腳本和持續(xù)集成但每次都要手敲參數(shù)Docker Desktop 功能全支持 compose、Kubernetes、BuildKit但體積大、啟動(dòng)慢而且某些老項(xiàng)目在它上面反而因?yàn)榄h(huán)境差異跑不起來(lái)。Kitematic 的優(yōu)勢(shì)是輕、直接、打開(kāi)就能看到容器。Kitematic 創(chuàng)建的容器和你在終端命令行里創(chuàng)建的容器沒(méi)有任何本質(zhì)差別。它只是把 docker run 的參數(shù)翻譯成表單提交給同一個(gè) Docker daemon。所以你完全可以一半操作在 Kitematic 里點(diǎn)一半操作在終端里敲。比如你在 Kitematic 里創(chuàng)建了一個(gè) nginx 容器回到終端執(zhí)行 docker ps能看到同一個(gè)容器。這種“圖形界面看狀態(tài)命令行做精細(xì)操作”的組合是我用 Kitematic 最常見(jiàn)的姿勢(shì)。如果你比較依賴 docker-compose可能會(huì)覺(jué)得 Kitematic 不夠用。0.17.11 這個(gè)版本畢竟更擅長(zhǎng)單個(gè)容器的創(chuàng)建與查看而不是多服務(wù)編排。但即使這樣它仍然能當(dāng) Compose 項(xiàng)目的“顯示器”用命令行把 compose 的服務(wù)啟動(dòng)起來(lái)然后在 Kitematic 里刷新容器列表看日志和端口映射。對(duì)于不想長(zhǎng)時(shí)間盯著終端的人來(lái)說(shuō)這種搭配反而比純命令行順手。還有一個(gè)邊界問(wèn)題終端里跑 docker 命令時(shí)如果提示 cannot connect to the Docker daemon大概率是環(huán)境變量沒(méi)有指向 Kitematic 管理的虛擬機(jī)。常見(jiàn)做法是執(zhí)行 eval $(docker-machine env default)讓當(dāng)前終端連接到 default 這臺(tái)機(jī)器。Kitematic 自己?jiǎn)?dòng)時(shí)已經(jīng)做好了這件事但終端是獨(dú)立的默認(rèn)不會(huì)繼承。把這一行加到 shell 配置里之后每次開(kāi)終端就能直接 docker ps。方式上手成本適合場(chǎng)景維護(hù)狀態(tài)docker CLI中等腳本、CI、精細(xì)控制持續(xù)更新Docker Desktop低新項(xiàng)目、多服務(wù)編排持續(xù)更新Kitematic 0.17.11極低看容器、看日志、快速驗(yàn)證已停更穩(wěn)定這張表是我日常做選型時(shí)的大致判斷。如果你的項(xiàng)目需要 BuildKit、多平臺(tái)構(gòu)建、Kubernetes 這類(lèi)新能力用 Kitematic 會(huì)很不舒服因?yàn)樗墓δ苓吔缤A粼谀莻€(gè)年代。反過(guò)來(lái)如果只是想本地跑一個(gè)數(shù)據(jù)庫(kù)、一個(gè) Nginx或者臨時(shí)起一個(gè) RedisKitematic 的輕量反而更省資源。所謂“要不要留一份 Kitematic”本質(zhì)不是新舊之爭(zhēng)而是你的工作流需不需要那個(gè)圖形入口。3. 安裝 Kitematic 0.17.11從 zip 解壓到跑通 hello-world3.1 解壓 zip 與安裝兩個(gè)命令解決拿到 Kitematic-0.17.11-Mac.zip 之后雙擊 zip 雖然也能解壓但我建議直接用命令行這樣能看到解壓結(jié)果也能順手處理 macOS 的隔離屬性。打開(kāi)終端進(jìn)入下載目錄執(zhí)行 unzip 解壓解壓出來(lái)通常是 Kitematic.app把它移動(dòng)到應(yīng)用程序目錄然后刪掉 quarantine 屬性這一步是為了繞過(guò) Gatekeeper 的攔截。cd ~/Downloads unzip Kitematic-0.17.11-Mac.zip mv Kitematic.app /Applications/ xattr -dr com.apple.quarantine /Applications/Kitematic.app open /Applications/Kitematic.app第一行是進(jìn)入下載目錄不要省如果你把 zip 放在別的位置把路徑換成實(shí)際路徑即可。unzip 解壓后建議用 ls 看一下目錄內(nèi)容確認(rèn)是不是真的有一個(gè) .app 文件。mv 是移動(dòng)到應(yīng)用程序目錄這樣 Launchpad 和聚焦搜索都能直接找到。xattr -dr com.apple.quarantine 是關(guān)鍵一行它把“來(lái)自網(wǎng)絡(luò)”的標(biāo)記刪掉否則新版本 macOS 會(huì)提示應(yīng)用已損壞或無(wú)法驗(yàn)證開(kāi)發(fā)者。最后 open 直接啟動(dòng)。如果你不想用 xattr也可以右鍵點(diǎn) Kitematic.app選擇“打開(kāi)”然后在系統(tǒng)彈窗里點(diǎn)“仍要打開(kāi)”。兩種方式本質(zhì)一樣都是繞過(guò) Gatekeeper 的一次性攔截。不過(guò)右鍵打開(kāi)之后以后每次啟動(dòng)可能還會(huì)再?gòu)椧淮斡?xattr 清掉隔離屬性后后續(xù)啟動(dòng)會(huì)更干凈。需要注意的是這條命令只對(duì)當(dāng)前這臺(tái)機(jī)器有效換一臺(tái)機(jī)器重新下載 zip還是需要再處理一次。3.2 第一次啟動(dòng)引擎檢測(cè)、虛擬機(jī)創(chuàng)建與鏡像源打開(kāi) Kitematic 后它會(huì)自動(dòng)檢測(cè)本機(jī)有沒(méi)有可用的 Docker 引擎。如果是干凈環(huán)境界面會(huì)走到虛擬機(jī)創(chuàng)建流程讓你等待引擎初始化。這一步經(jīng)常會(huì)給人一種“卡住”的錯(cuò)覺(jué)因?yàn)檫M(jìn)度條可能長(zhǎng)時(shí)間停在某個(gè)階段。建議先打開(kāi)活動(dòng)監(jiān)視器看有沒(méi)有虛擬機(jī)相關(guān)的進(jìn)程在跑。如果進(jìn)程存在但界面不動(dòng)通常是網(wǎng)絡(luò)問(wèn)題或虛擬機(jī)配置不兼容如果根本沒(méi)有相關(guān)進(jìn)程再考慮引擎是否被系統(tǒng)攔截。驗(yàn)證引擎是否正常最直接的方法是打開(kāi)終端執(zhí)行 docker-machine ls。如果能看到 default 這臺(tái)機(jī)器并且狀態(tài)是 Running就說(shuō)明 Kitematic 背后的引擎是好的。如果 docker-machine 命令不存在說(shuō)明你的環(huán)境還缺工具鏈常見(jiàn)做法是補(bǔ)裝對(duì)應(yīng)版本的工具。安裝過(guò)程中Kitematic 一般會(huì)提供引導(dǎo)你不需要手動(dòng)做太多事。docker-machine ls eval $(docker-machine env default) docker version第一行列出所有虛擬機(jī)第二行讓當(dāng)前終端連到 default 這臺(tái)機(jī)器第三行顯示客戶端和引擎的版本。看到 Server 和 Client 兩段信息都正常才算真正連通。eval 命令只會(huì)影響當(dāng)前終端窗口關(guān)掉終端就失效如果你不想每次都手動(dòng)執(zhí)行可以把第二行追加到 ~/.zshrc 或 ~/.bashrc 里。但要注意這臺(tái)虛擬機(jī)的 IP 地址可能變化追加到配置文件里之后要定期確認(rèn)環(huán)境變量是否仍然有效。鏡像源這一塊Kitematic 0.17.11 提供了設(shè)置入口。如果你拉鏡像特別慢常見(jiàn)做法是找一個(gè)所在網(wǎng)絡(luò)環(huán)境下可達(dá)的鏡像站填到 Docker 引擎的 Registry mirror 配置里。這里我不給你具體地址因?yàn)椴煌W(wǎng)絡(luò)環(huán)境可信度差很多。改完鏡像源之后記得重啟 Docker 引擎否則配置不會(huì)生效。如果你只是跑 hello-world其實(shí)不太受鏡像源影響所以建議先不調(diào)等真遇到拉不動(dòng)時(shí)再動(dòng)手。3.3 跑通第一個(gè)容器hello-world引擎啟動(dòng)后Kitematic 主界面上會(huì)有一個(gè)搜索框。在里面輸入 hello-world搜索結(jié)果會(huì)出現(xiàn)官方示例鏡像點(diǎn) Create 就會(huì)開(kāi)始拉取并創(chuàng)建容器。這個(gè)容器和命令行創(chuàng)建出來(lái)的完全一樣界面下方會(huì)顯示日志區(qū)域。如果一切正常你會(huì)在日志里看到一段帶感嘆號(hào)的提示文本說(shuō)明 Docker daemon 已經(jīng)把容器跑起來(lái)了。如果你想在這個(gè)環(huán)節(jié)順便驗(yàn)證一下命令行環(huán)境也可以不用圖形界面直接在終端執(zhí)行docker run --name hello-world-example hello-world--name 是給容器起一個(gè)固定名字方便后續(xù)用 docker logs、docker inspect 精確引用。hello-world 是一個(gè)一次性容器它打印完歡迎信息后就會(huì)退出不是常駐進(jìn)程。所以你在 Kitematic 里看到這個(gè)容器狀態(tài)為 Exited并不代表有問(wèn)題反而說(shuō)明流程已經(jīng)走通。退出碼為 0 就是正常的。如果日志里出現(xiàn)了 exec format error 或者找不到鏡像常見(jiàn)原因是拉到了和當(dāng)前 CPU 架構(gòu)不匹配的鏡像或者是網(wǎng)絡(luò)問(wèn)題導(dǎo)致鏡像層不完整。先確認(rèn)鏡像名拼寫(xiě)無(wú)誤再看本機(jī)架構(gòu)是不是 Apple Silicon。Kitematic 0.17.11 是 Intel 時(shí)代的產(chǎn)品在老 Intel Mac 上通常很順在 M 系列芯片上則需要額外關(guān)注鏡像架構(gòu)。hello-world 這類(lèi)系統(tǒng)鏡像一般會(huì)自帶多架構(gòu)支持但如果你的工程鏡像沒(méi)有就需要手動(dòng)指定平臺(tái)參數(shù)。4. Kitematic 核心操作鏡像、容器、端口映射與數(shù)據(jù)卷4.1 圖形界面創(chuàng)建 nginx 容器及等價(jià) docker 命令跑通 hello-world 之后可以試一個(gè)真正常駐的服務(wù)比如 Nginx。在 Kitematic 搜索框輸入 nginx選擇 latest 標(biāo)簽點(diǎn) Create。創(chuàng)建完成后進(jìn)入容器詳情頁(yè)找到端口設(shè)置區(qū)域把容器內(nèi)部的 80 端口映射到 Mac 的 8080 端口。設(shè)置好之后瀏覽器訪問(wèn) localhost:8080就能看到 Nginx 默認(rèn)頁(yè)面。這一串圖形操作對(duì)應(yīng)的命令行是docker run -d --name web -p 8080:80 nginx:latest-d 表示后臺(tái)運(yùn)行容器不會(huì)因?yàn)榻K端關(guān)閉而退出--name web 給容器起名叫 web-p 8080:80 表示把 Mac 上的 8080 端口轉(zhuǎn)發(fā)到容器內(nèi)的 80 端口nginx:latest 是鏡像名和標(biāo)簽。如果你在 Kitematic 里創(chuàng)建時(shí)把容器名寫(xiě)成了別的等價(jià)命令里 --name 也要跟著改。這個(gè)等價(jià)關(guān)系是理解 Kitematic 的關(guān)鍵界面上的每一個(gè)輸入框背后幾乎都能對(duì)應(yīng)到一個(gè) docker run 參數(shù)。如果你在界面里設(shè)置了環(huán)境變量比如 NGINX_HOSTlocalhost那么等價(jià)命令里會(huì)多一個(gè) -e 參數(shù)。環(huán)境變量在容器啟動(dòng)時(shí)被注入進(jìn)程里可以直接讀取。常見(jiàn)用法是給應(yīng)用配置數(shù)據(jù)庫(kù)地址、緩存地址、運(yùn)行模式。例如docker run -d --name web -p 8080:80 -e NGINX_HOSTlocalhost -e NGINX_PORT80 nginx兩個(gè) -e 可以分別定義不同的變量。這里 NGINX_HOST 和 NGINX_PORT 不是 Docker 的保留參數(shù)而是 Nginx 官方鏡像里的模板變量它會(huì)根據(jù)這些值生成配置。換成別的鏡像變量名可能需要跟著鏡像文檔走。UI 里設(shè)置環(huán)境變量的好處是不容易漏掉引號(hào)壞處是如果你不確定變量名排查起來(lái)比命令行更麻煩。在容器列表頁(yè)面你可以對(duì)容器做停止、啟動(dòng)、刪除操作。停止等價(jià)于 docker stop啟動(dòng)等價(jià)于 docker start刪除等價(jià)于 docker rm。這里有個(gè)容易混淆的地方刪除容器和刪除鏡像不是一回事。容器是鏡像運(yùn)行出來(lái)的實(shí)例刪掉容器不會(huì)把鏡像刪掉下次還能再創(chuàng)建。Kitematic 的界面里通常分開(kāi)顯示鏡像和容器操作前先看清當(dāng)前選中的是哪個(gè)對(duì)象。4.2 端口映射和數(shù)據(jù)卷參數(shù)在哪設(shè)注意什么端口映射是 Kitematic 里最常用的設(shè)置之一。圖形界面上通常會(huì)有一個(gè)端口列表左邊是 Mac 上的端口右邊是容器內(nèi)的端口。填寫(xiě)時(shí)要注意順序左邊是本機(jī)端口右邊是容器端口。如果你把 8080:80 寫(xiě)反成 80:8080訪問(wèn) localhost:80 時(shí)不一定有進(jìn)程監(jiān)聽(tīng)而容器里 8080 端口通常也沒(méi)服務(wù)結(jié)果就是連接被拒絕。端口沖突是常見(jiàn)的翻車(chē)點(diǎn)。如果你同時(shí)跑了兩個(gè)容器都要映射到 Mac 的 8080 端口后一個(gè)會(huì)啟動(dòng)失敗界面里會(huì)顯示端口綁定錯(cuò)誤。解決辦法是給第二個(gè)容器換一個(gè)本機(jī)端口比如 8081。如果你不確定哪些端口被占用可以在終端執(zhí)行 lsof -i :8080看看是哪個(gè)進(jìn)程占著。Kitematic 不會(huì)幫你自動(dòng)換端口它只會(huì)把錯(cuò)誤擺出來(lái)。數(shù)據(jù)卷的設(shè)置稍微隱蔽一點(diǎn)。在 Kitematic 里選中容器后進(jìn)入設(shè)置找到目錄或卷相關(guān)的區(qū)域選擇一個(gè) Mac 上的文件夾把它和容器內(nèi)路徑對(duì)應(yīng)起來(lái)。這樣做的意義是容器內(nèi)寫(xiě)文件時(shí)數(shù)據(jù)實(shí)際落到 Mac 的文件夾里容器刪掉后數(shù)據(jù)還在。命令行的表達(dá)方式是用 -v 參數(shù)。docker run -d --name web -p 8080:80 -v ~/demo-site:/usr/share/nginx/html:ro nginx-v 的參數(shù)格式是 本機(jī)路徑:容器路徑:權(quán)限。上面的例子把 Mac 上 ~/demo-site 目錄掛載到容器內(nèi) Nginx 的頁(yè)面目錄 /usr/share/nginx/htmlro 表示只讀容器內(nèi)不能反過(guò)來(lái)修改宿主機(jī)文件。如果去掉 ro容器內(nèi)就能寫(xiě)入這樣會(huì)帶來(lái)文件權(quán)限問(wèn)題。比如容器進(jìn)程以 root 運(yùn)行寫(xiě)入的文件在 Mac 上可能變成 root 所有你以后在 Finder 里刪都刪不掉。掛載路徑如果有空格一定要用引號(hào)包住否則 Docker 會(huì)把路徑拆成兩段最后報(bào)錯(cuò)。常見(jiàn)做法是先把項(xiàng)目目錄整理成沒(méi)有空格的路徑比如 ~/demo-site避免不必要的坑。掛載生效后修改宿主機(jī)文件容器內(nèi)會(huì)立即看到不需要重啟容器。這跟你用 docker cp 拷文件完全不同docker cp 是一次性拷貝掛載是持續(xù)同步。驗(yàn)證數(shù)據(jù)卷是否生效最簡(jiǎn)單的方法是先在宿主機(jī)寫(xiě)一個(gè)文件再進(jìn)容器里看一下echo h1hello kitematic/h1 ~/demo-site/index.html docker exec web ls -l /usr/share/nginx/html curl -I http://localhost:8080第一行在宿主機(jī)創(chuàng)建頁(yè)面文件第二行進(jìn)入容器列出目錄內(nèi)容第三行用 curl 請(qǐng)求本地端口。如果你看到 index.html 存在并且 curl 返回 200說(shuō)明掛載鏈路沒(méi)問(wèn)題。如果第二行報(bào)目錄不存在多半是容器鏡像里的路徑不是 /usr/share/nginx/html需要用 docker inspect 確認(rèn)實(shí)際路徑。4.3 日志與終端日常調(diào)試最常用的兩個(gè)入口Kitematic 的容器詳情頁(yè)通常有兩個(gè)很顯眼的面板Logs 和 Terminal。Logs 顯示的是容器進(jìn)程的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤也就是 docker logs 看到的內(nèi)容。排錯(cuò)時(shí)先看日志比瞎猜更高效。比如你啟動(dòng)一個(gè)容器后訪問(wèn)不到服務(wù)日志里如果有 “port already in use”就說(shuō)明容器內(nèi)端口被占用如果有 “Address already in use”則要懷疑端口映射配置。終端面板相當(dāng)于讓你直接進(jìn)入容器內(nèi)部等價(jià)于 docker exec -it 容器名 bash。這個(gè)功能在處理容器內(nèi)文件結(jié)構(gòu)時(shí)很有用。但要注意不是所有鏡像都自帶 bash某些精簡(jiǎn)鏡像只有 sh。如果終端打開(kāi)后報(bào) “bash: not found”把命令換成 sh 再試一次。docker logs --tail 100 web docker exec -it web bashdocker logs 是查看容器日志的通用命令--tail 100 表示只看最后 100 行適合容器運(yùn)行很久、日志刷屏的情況。不加 --tail 會(huì)輸出全部日志可能很長(zhǎng)。docker exec 是進(jìn)入運(yùn)行中的容器執(zhí)行命令-i 表示保持標(biāo)準(zhǔn)輸入打開(kāi)-t 分配一個(gè)偽終端后面的 bash 是你要執(zhí)行的程序。退出容器時(shí)輸入 exit 即可。此外docker inspect 是比日志更底層的排查工具。它返回容器的完整配置包括端口綁定、環(huán)境變量、掛載卷、網(wǎng)絡(luò)模式。Kitematic 面板里顯示給你的信息很多都來(lái)自 inspect 的某個(gè)字段。在終端里執(zhí)行 docker inspect 可以確認(rèn)你在界面上設(shè)置的參數(shù)到底有沒(méi)有生效。如果界面設(shè)置后容器沒(méi)有明顯變化先 inspect再重啟容器。5. 避坑 Kitematic 0.17.11Mac 上 6 個(gè)常見(jiàn)問(wèn)題與排查5.1 安裝期Gatekeeper、VM 創(chuàng)建失敗、架構(gòu)不匹配先說(shuō)安裝期最常見(jiàn)的翻車(chē)?,F(xiàn)象是雙擊 Kitematic.app 后系統(tǒng)彈窗提示“應(yīng)用程序已損壞無(wú)法打開(kāi)”或者“無(wú)法驗(yàn)證開(kāi)發(fā)者”。原因是這個(gè)版本太老沒(méi)有經(jīng)過(guò)新版 macOS 的公證Gatekeeper 默認(rèn)不允許運(yùn)行。解決方式在前面已經(jīng)提過(guò)用 xattr 清除隔離屬性是相對(duì)徹底的辦法如果你不想用命令就右鍵打開(kāi)再點(diǎn)“仍要打開(kāi)”。處理完之后再啟動(dòng)通常就不會(huì)彈了。第二個(gè)問(wèn)題是打開(kāi) Kitematic 后一直卡在 Creating VM或者直接提示虛擬機(jī)啟動(dòng)失敗?,F(xiàn)象是進(jìn)度條長(zhǎng)時(shí)間不動(dòng)日志里出現(xiàn) VBox 相關(guān)的錯(cuò)誤。原因是新版 macOS 對(duì)內(nèi)核擴(kuò)展的管控越來(lái)越嚴(yán)老版本虛擬機(jī)工具裝不進(jìn)系統(tǒng)或者 CPU 虛擬化沒(méi)有被正常啟用。解決時(shí)先到系統(tǒng)設(shè)置里確認(rèn)虛擬化相關(guān)的開(kāi)關(guān)是否打開(kāi)然后把虛擬機(jī)工具重裝一遍如果仍然失敗說(shuō)明這個(gè)版本的 Kitematic 和你當(dāng)前的 macOS 跨度太大最省時(shí)間的辦法是換用 Docker Desktop 或更新的圖形客戶端。第三個(gè)問(wèn)題是在 Apple Silicon 上跑出 exec format error?,F(xiàn)象是容器創(chuàng)建后立刻退出日志提示無(wú)法執(zhí)行某個(gè)二進(jìn)制格式甚至報(bào)出 qemu 相關(guān)字樣。原因是鏡像和宿主機(jī)的 CPU 架構(gòu)不匹配。Kitematic 0.17.11 是 Intel 時(shí)代的產(chǎn)物如果 Mac 是 M 系列芯片老鏡像里大量 x86_64 內(nèi)容可能沒(méi)辦法原生運(yùn)行。解決方式是在拉鏡像時(shí)優(yōu)先選擇 arm64 版本或者干脆別在這臺(tái)機(jī)器上堅(jiān)持用這個(gè)老版本。老工具在老硬件上穩(wěn)定在新型號(hào)上并不一定。5.2 運(yùn)行期端口沖突、數(shù)據(jù)丟失、拉鏡像慢第四個(gè)問(wèn)題是端口映射后訪問(wèn)不到?,F(xiàn)象是容器看起來(lái)在運(yùn)行docker ps 也能看到端口映射但瀏覽器訪問(wèn) localhost:8080 就是打不開(kāi)。原因通常是映射方向?qū)懛戳税?8080:80 寫(xiě)成了 80:8080。解決方式是先確認(rèn)界面或命令行里的參數(shù)順序左邊一定是 Mac 的端口右邊才是容器端口。如果確認(rèn)沒(méi)寫(xiě)反再用 curl 在本機(jī)試一下排除瀏覽器緩存干擾。第五個(gè)問(wèn)題是容器重啟后數(shù)據(jù)丟失。現(xiàn)象是你在容器里創(chuàng)建了一個(gè)數(shù)據(jù)庫(kù)或者寫(xiě)了一個(gè)文件容器 stop 之后再 start數(shù)據(jù)還在一旦把容器刪除再重新創(chuàng)建數(shù)據(jù)全沒(méi)了。原因是數(shù)據(jù)寫(xiě)在容器自帶的可寫(xiě)層里docker rm 會(huì)連帶刪除這一層。解決方式是不要依賴容器內(nèi)部存儲(chǔ)把數(shù)據(jù)目錄掛載到 Mac 上。在 Kitematic 里給容器添加數(shù)據(jù)卷或者在命令里加 -v 參數(shù)之后刪除容器重建只要掛載路徑不變數(shù)據(jù)就不會(huì)丟。第六個(gè)問(wèn)題是拉取鏡像速度極慢或者超時(shí)?,F(xiàn)象是創(chuàng)建鏡像時(shí)進(jìn)度條幾乎不動(dòng)最后提示 net/http: TLS handshake timeout。原因是默認(rèn)鏡像倉(cāng)庫(kù)在當(dāng)前網(wǎng)絡(luò)環(huán)境下連接不穩(wěn)定。解決方式有兩條路一是給 Docker 引擎配置可用的鏡像源在 Kitematic 的引擎設(shè)置里填 registry mirror填完必須重啟引擎二是通過(guò)離線方式導(dǎo)入鏡像。如果你有另一臺(tái)機(jī)器已經(jīng)拉好了鏡像可以用 docker save 導(dǎo)出成 tar 包再拿過(guò)來(lái) docker load 導(dǎo)入。docker save nginx:latest -o nginx.tar docker load -i nginx.tardocker save 把鏡像保存成本地文件-o 指定輸出文件名docker load 讀取 tar 包并導(dǎo)入鏡像。這種方式不依賴網(wǎng)絡(luò)速度適合內(nèi)網(wǎng)環(huán)境或跨機(jī)器復(fù)制。Kitematic 的界面里不會(huì)直接提供這個(gè)功能所以我會(huì)在終端里處理鏡像導(dǎo)入再回到界面里創(chuàng)建容器。導(dǎo)入成功后容器列表里就能看到這個(gè)鏡像。6. 進(jìn)階用法把本地項(xiàng)目掛進(jìn)容器實(shí)現(xiàn)開(kāi)發(fā)熱更新Kitematic 0.17.11 做成日常開(kāi)發(fā)環(huán)境最關(guān)鍵的一步是把項(xiàng)目目錄掛載進(jìn)容器。以 Node.js 項(xiàng)目為例我把當(dāng)前目錄掛到容器內(nèi)的 /app容器里啟動(dòng)開(kāi)發(fā)服務(wù)器改代碼后頁(yè)面會(huì)自動(dòng)刷新完全不用手動(dòng)重啟容器。這個(gè)玩法在微信小程序、前端后臺(tái)、后端 API 的本地聯(lián)調(diào)里都適用。docker run -d --name dev-server \ -p 3000:3000 \ -v $PWD:/app \ -e NODE_ENVdevelopment \ node:18 \ npm run dev--name dev-server 是給容器起名-p 3000:3000 把宿主機(jī) 3000 端口映射到容器 3000 端口-v $PWD:/app 把當(dāng)前終端所在目錄掛載為容器內(nèi) /app-e NODE_ENVdevelopment 設(shè)置運(yùn)行環(huán)境node:18 作為基礎(chǔ)鏡像npm run dev 是容器啟動(dòng)后執(zhí)行的命令。掛載目錄之后你在 Mac 上對(duì)源代碼的每一次保存都會(huì)立刻同步到容器內(nèi)開(kāi)發(fā)服務(wù)器監(jiān)聽(tīng)到文件變化后會(huì)觸發(fā)熱更新。驗(yàn)證方法很簡(jiǎn)單瀏覽器打開(kāi) http://localhost:3000看到頁(yè)面后修改項(xiàng)目里的一個(gè)標(biāo)題文本保存再回瀏覽器頁(yè)面會(huì)自己刷新。如果項(xiàng)目沒(méi)有配置熱更新至少也能看到容器日志里出現(xiàn)文件變化觸發(fā)的重新編譯記錄。這時(shí)候再回到 Kitematic點(diǎn)開(kāi)容器的日志面板你會(huì)看到和終端里一樣的輸出日常調(diào)試就不用來(lái)回切窗口了。我個(gè)人的習(xí)慣是Kitematic 0.17.11 的 zip 包會(huì)一直備份著遇到老項(xiàng)目、低配機(jī)器、臨時(shí)演示環(huán)境時(shí)優(yōu)先用它遇到需要 compose 或 Kubernetes 的新項(xiàng)目才切換到現(xiàn)代客戶端。不要為了追新把一個(gè)已經(jīng)跑通的環(huán)境反復(fù)重裝很多看起來(lái)像玄學(xué)的問(wèn)題其實(shí)都出在環(huán)境被折騰壞了。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取