搭好工作环境 — shell、包管理器、Docker Desktop、Podman、minikube 与 kind¶
这一章讲一件事: 在一台空电脑上,把后面十八章要用的工具一次装对。 它看似是"安装手册",其实藏着一个判断:容器工具链是分层装配的—— 命令行是话筒,包管理器是螺丝刀,容器引擎是发动机,本地 Kubernetes 是试车场。 主线例子:从空电脑到浏览器里看到 nginx 欢迎页,全程照作者实测的命令走。
1. 先看全景:一张装配地图¶
按依赖顺序画出这一章的装配关系:
shell(Bash / PowerShell / zsh) ← 一切命令的话筒
│ 用 shell 调用 ↓
包管理器(brew / choco / winget / apt) ← 装下面所有工具
│ 装 ↓
代码编辑器(VS Code + 扩展,或 Cursor)
容器引擎:Docker Desktop(主)/ Podman(替)
│ 在引擎之上 ↓
本地 Kubernetes 三选一:
├─ Docker Desktop 内置(单节点,勾一下就开)
├─ minikube(单/多节点,作者实测 v1.35.0 + K8s 1.32.0)
└─ kind(集群本身跑在 Docker 容器里,v0.27.0)
│ 统一用 kubectl 这个遥控器操作 ↓
浏览器里看到 nginx 欢迎页 ← 本章验收标准
图说:每一层只依赖下面一层。装错顺序(比如先装 minikube 再装 Docker)会踩坑。
2. 核心原理¶
2.1 命令行 shell:Docker 的话筒¶
容器最初为 Linux 开发,所以 Docker 的原生命令行工具是 Unix shell(命令行解释器): 在 Linux 里通常是 Bash(Bourne Again Shell 的缩写,最主流的 Unix shell), 轻量发行版(如 Alpine)上只有更原始的 sh1。macOS 不是 Linux,但和 Linux 同为 Unix 一脉, 自带 Bash 或 Zsh1。
Windows 上情况不同,书里盘点了两条路:传统的命令提示符(cmd)太简单; PowerShell 是微软开发的强大脚本环境;Windows 10 之后还有 WSL(Windows Subsystem for Linux, Windows 上的 Linux 子系统)能直接跑 Bash2。全书的命令统一用 Bash 写法,大部分命令在 PowerShell 里也能直接跑2。
为什么这 matters: 容器生态的文档、脚本、CI 配置九成是 Bash 语法。 shell 不熟,后面每一章的命令都会变成背诵负担;shell 熟,所有命令都是"读出来的"。
2.2 包管理器:先装螺丝刀,再装一切¶
装软件最省事的方式是用包管理器(一个命令装/卸/升级软件的命令行工具)。
各平台的标配:macOS 用 Homebrew(brew),Windows 用 winget 或 Chocolatey,
Debian/Ubuntu 用系统自带的 apt3。装 Homebrew 本身只需跑它官网给的一条 curl 命令,
装完 brew --version 验证(作者机器上输出 Homebrew 4.4.23),
之后装任何工具都是 brew install <名字> 一句话4。
这个"先装包管理器"的建议不是仪式:后面 Docker 之外的每个工具(minikube、kind、Podman) 都能用它一条命令装好,并且升级和卸载同样是一条命令。
2.3 编辑器:VS Code 加扩展,外加一个 AI 选项¶
书里推荐的编辑器是 VS Code(Visual Studio Code,微软的开源编辑器), 并用它的命令行装了一批扩展(包括官方的 Docker 扩展,装完能在编辑器里直接看到 容器和镜像列表)5。有意思的是,这一版专门加了一段装 Cursor—— 一个内置 AI 辅助的 VS Code 衍生编辑器——理由是"AI 正在吃掉世界",这类工具已变成 开发环境的标准件6。这不是广告,是时代坐标:到 2026 年,"装环境"已经包含"装 AI 助手"这一步。
2.4 主线例子:从空电脑到 hello-world¶
现在开始主线例子,照作者实测的路径走。装完 Docker Desktop 后,第一步自检:
$ docker version
→ 输出分两部分:Client(你敲命令的这边)和 Server(Docker Engine,真正跑容器的那边)
→ 作者成书时 Server 版本是 27.4.0[^7]
$ docker container run hello-world
→ Docker 发现本地没有 hello-world:latest 镜像,自动去镜像注册表下载
→ 然后从镜像创建容器、运行,容器输出以 "Hello from Docker!" 开头的一段文字[^8]
第二个命令里藏着后面好几章的伏笔,书里把它逐句拆开了: "run" 实际是"下载镜像(如果本地没有)→ 创建容器 → 启动 → 收集输出"四件事8。 这两个命令通了,说明 Engine 是好的。
然后是图形界面自检:Docker Desktop 的仪表盘(dashboard)里能看到刚才创建的两个容器 (hello-world 和另一个测试镜像 rancher/cowsay),状态都是 Exited(已退出)—— 容器跑完主进程就停,这是正常状态,不是故障9。书里特意提醒: 关掉仪表盘窗口不会停掉 Docker,真要停要选 Quit Docker Desktop10。
2.5 Windows 上的 WSL 2:近原生的 Linux 通道¶
Windows 用户书里推荐 WSL 2(Windows Subsystem for Linux 第二代)。 默认情况下,Docker Desktop for Windows 已经与 WSL 2 深度集成,不再需要单独开一台 Linux 虚拟机; 在设置里确认 "Use the WSL 2 based engine" 打开即可11。收益很具体: 文件 I/O 更快、容器拿到接近原生 Linux 的速度,资源分配、文件挂载、网络集成 都由 Docker Desktop 自动管理11。
2.6 Podman:无守护进程的 Docker 替代品¶
Podman 是一个开源的、无守护进程(daemonless)的容器引擎, 大部分命令与 Docker 的命令行兼容,最大的不同是支持 rootless 模式—— 不需要 root 权限就能跑容器,安全性更好12。
书中列的优缺点对照,值得整表接住:
| 维度 | Podman 的优势 | Podman 的劣势 |
|---|---|---|
| 架构 | 无后台守护进程,攻击面更小、开销更低13 | — |
| 权限 | 原生 rootless13 | — |
| 兼容性 | 多数 Docker 命令直接通用13 | — |
| 图形界面 | — | 主要靠命令行,没有 Docker Desktop 那样的集成界面14 |
| 平台 | — | Windows/macOS 上的支持需要额外配置14 |
| 生态 | — | 第三方集成和开发工具的原生支持不如 Docker14 |
注意 macOS/Windows 上装 Podman 要多两步:podman machine init 和
podman machine start——因为非 Linux 系统没有原生内核,Podman 也要先起一台
轻量虚拟机15。
2.7 本地 Kubernetes:minikube¶
minikube 在你的工作站上起一个(默认)单节点的 Kubernetes 集群, 通过 kubectl(操作 Kubernetes 的命令行工具,它是全书的"遥控器")来访问; 它也能起多节点集群16。
主线例子继续。装好后依次验证:
$ minikube version
→ minikube version: v1.35.0(作者实测)
$ minikube start
→ 自动选了 docker driver;下载 Kubernetes v1.32.0 的预置镜像(约 452 MiB)
→ 结束行:"Done! kubectl is now configured to use "minikube" cluster"[^17]
$ kubectl get nodes
→ 一个节点,角色 control-plane(控制面),K8s 版本 1.32.0[^18]
$ kubectl apply -f setup/nginx.yaml → pod/nginx created
$ kubectl get pods
→ NAME READY STATUS RESTARTS AGE:nginx 1/1 Running 0 29s[^19]
$ kubectl expose pod nginx --type=NodePort --port=80
→ service/nginx exposed;Pod 的 80 端口映射到节点端口 30706[^20]
$ minikube service nginx
→ minikube 开了一条隧道,把节点端口 30706 转到本机 52431,并自动打开浏览器
→ 浏览器出现 nginx 欢迎页[^21]
注意两个版本号的坐标意义:minikube v1.35.0、Kubernetes v1.32.0 是作者成书时(2026 年初) 的版本,你装时数字会更高17。机制(apply → pod → expose → service → tunnel)不会变。
多节点也只要一条命令:minikube start --nodes 3 -p demo 起一个叫 demo 的三节点集群,
kubectl get nodes 能看到一个 control-plane 加两个工作节点22。
2.8 kind:跑在 Docker 容器里的集群¶
kind(Kubernetes IN Docker)是另一个本地集群工具——它的集群本身运行在 Docker 容器里,
所以装它的前提是 Docker 已经在跑23。kind create cluster 起默认集群,
kind create cluster --name demo 再起第二个;作者机器上 kind version 输出
kind v0.27.0 go1.24.0 darwin/arm6424。
访问服务的玩法和 minikube 不同:kind 用 kubectl port-forward(端口转发)——
kubectl port-forward nginx 8080 80 把本机 8080 转到 Pod 的 80,
浏览器开 http://localhost:8080 就能看到欢迎页25。
两个工具怎么选?书里没给硬性裁决,但给了事实基础:minikube 更像"一台真虚拟机里的集群" (有自己的节点端口,tunnel 直连);kind 更像"容器里的一窝容器"(靠端口转发访问)。 CI 流水线上 kind 更快更省;要学 node/port 概念,minikube 更直观。
2.9 Docker Desktop 自带的 Kubernetes¶
还有第三条路:Docker Desktop 设置里勾选 Enable Kubernetes,Apply & restart, 它会把单节点集群拉起来26。书里只给了一个限制:它只支持单节点; 要多节点就用 kind 或 minikube26。
3. 作者的判断与证据¶
这一章是操作手册,判断集中在"推荐什么":
| 判断 | 依据 |
|---|---|
| 强烈推荐 Docker Desktop(macOS/Windows 10+) | 与操作系统虚拟化框架深度集成,是三种桌面系统上最快最稳的跑法27 |
| Windows 上配合 WSL 2 | 近原生 I/O,无需单独 Linux VM11 |
| 用包管理器装一切 | 装/升/卸都是一条命令,可脚本化3 |
| 命令统一 Bash 语法 | 容器生态的通用语;PowerShell 大多兼容2 |
| Podman 作替代品介绍 | 列了优缺点对照,没站队;事实上作者的示例全用 Docker1214 |
这些推荐属于"业界共识 + 作者经验",不是实验结论;实测证据是书中每个工具都给出了 作者机器上的真实版本号和命令输出(v1.35.0、27.4.0、1.32.0),说明步骤被实际跑通过。
4. 边界与局限¶
- 版本号会很快过期。 27.4.0、v1.35.0、v1.32.0、v0.27.0 都是 2026 年初的快照; 照装时请以官网为准,别抄数字。
- 安装截图无法搬运。 原书大量 UI 截图(下载页、仪表盘、设置项),转码后只剩图注; 对应位置我们都改成了文字描述 + 命令,UI 长什么样需自行打开对照。
- Linux 原生引擎只给了链接。 纯 Linux 用户被指向官方文档装 Docker Engine, 本书后续所有实验仍以 Desktop 的交互为基准。
- Docker Toolbox 已死。 书中保留安装一节只为 legacy 用户,并明确说已废弃、推荐 Desktop28。
5. 可带走的¶
- 装东西的顺序:shell → 包管理器(brew/choco/winget/apt)→ 编辑器 → 容器引擎 → 本地 K8s。
- docker version 输出有 Client/Server 两半:Server 才是 Engine;两半都对才算装好7。
docker container run hello-world= 下载镜像 + 创建容器 + 运行 + 输出,一个命令四件事8。- 容器跑完主进程就 Exited,是正常状态;关仪表盘不停 Docker,要 Quit 才算停910。
- Windows 上开 WSL 2 引擎,Docker Desktop 默认集成,无需单独 Linux VM11。
- Podman 的卖点是无守护进程 + rootless;代价是桌面体验和生态集成,大部分命令与 Docker 通用1213。
- 本地 K8s 三选一:Desktop 内置(单节点最省事)、minikube(节点概念最真)、kind(最快最省,CI 常用)162326。
- 访问集群里的服务两条路:minikube service(开隧道给 NodePort)和 kubectl port-forward(本机端口直转 Pod)2125。
- kubectl 是统一的遥控器,换集群不换命令,只换 context(
kubectl config get-contexts)29。
6. 原文地图¶
| 主题 | 原书章 | 原文位置 |
|---|---|---|
| shell 选择、Bash 语法统一 | The Linux command shell | text/25-fm-the-linux-command-shell.txt:10(搜「first developed on Linux」) · text/25-fm-the-linux-command-shell.txt:35(搜「Bash syntax」) |
| 包管理器四平台对照 | The Linux command shell | text/25-fm-the-linux-command-shell.txt:43(搜「Homebrew」) · text/25-fm-the-linux-command-shell.txt:62(搜「Homebrew 4.4.23」) |
| Chocolatey 安装 | The Linux command shell | text/25-fm-the-linux-command-shell.txt:73(搜「built on PowerShell」) |
| VS Code 扩展、Cursor | Installing Docker Desktop on macOS, Windows, or Linux | text/28-fm-installing-docker-desktop-on-macos-windows-or-li.txt:1(搜「install-extension」) · text/28-fm-installing-docker-desktop-on-macos-windows-or-li.txt:18(搜「cursor.ai」) |
| Desktop 推荐、docker version 27.4.0 | Installing Docker Desktop on macOS, Windows, or Linux | text/28-fm-installing-docker-desktop-on-macos-windows-or-li.txt:44(搜「strongly recommend」) · text/28-fm-installing-docker-desktop-on-macos-windows-or-li.txt:80(搜「docker version」) · text/28-fm-installing-docker-desktop-on-macos-windows-or-li.txt:87(搜「27.4.0」) |
| hello-world 四件事、cowsay | Installing Docker Desktop on macOS, Windows, or Linux | text/28-fm-installing-docker-desktop-on-macos-windows-or-li.txt:94(搜「hello-world」) · text/28-fm-installing-docker-desktop-on-macos-windows-or-li.txt:99(搜「didn't find an image」) |
| 仪表盘、Exited、Quit | Using Docker with WSL 2 on Windows | text/29-fm-using-docker-with-wsl-2-on-windows.txt:3(搜「Containers tab」) · text/29-fm-using-docker-with-wsl-2-on-windows.txt:12(搜「will not stop」) |
| WSL 2 集成与收益 | Using Docker with WSL 2 on Windows | text/29-fm-using-docker-with-wsl-2-on-windows.txt:26(搜「near-native」) · text/29-fm-using-docker-with-wsl-2-on-windows.txt:35(搜「WSL 2 based engine」) |
| Podman 定义、优缺点 | Installing Podman | text/31-fm-installing-podman.txt:17(搜「daemonless」) · text/31-fm-installing-podman.txt:98(搜「Daemonless architecture」) · text/32-fm-installing-minikube.txt:2(搜「Limited GUI」) |
| Podman machine init/start | Installing Podman | text/31-fm-installing-podman.txt:33(搜「podman machine init」) |
| minikube 定位、版本、start 输出 | Installing minikube | text/32-fm-installing-minikube.txt:20(搜「single-node」) · text/32-fm-installing-minikube.txt:56(搜「v1.35.0」) · text/32-fm-installing-minikube.txt:61(搜「minikube start」) |
| nginx on minikube 全链路 | Installing minikube | text/32-fm-installing-minikube.txt:128(搜「nginx.yaml」) · text/32-fm-installing-minikube.txt:147(搜「NodePort」) · text/32-fm-installing-minikube.txt:170(搜「minikube service」) |
| 多节点 minikube | Installing minikube | text/32-fm-installing-minikube.txt:213(搜「--nodes 3」) |
| kind 定位、版本、多集群 | Installing kind | text/33-fm-installing-kind.txt:17(搜「multi-node」) · text/33-fm-installing-kind.txt:44(搜「v0.27.0」) · text/33-fm-installing-kind.txt:64(搜「--name demo」) |
| port-forward 访问 | Installing kind | text/33-fm-installing-kind.txt:129(搜「port-forward」) |
| Desktop 内置 K8s 单节点限制 | Installing Podman | text/31-fm-installing-podman.txt:13(搜「single-node cluster is supported」) |
| 章小结 | Summary | text/34-fm-summary.txt:19(搜「package manager」) |
-
出处:「The Linux command shell」第 9–20 段(
text/25-fm-the-linux-command-shell.txt:10,搜「first developed on Linux」;:13,搜「Most developers use the Bash shell」)。 ↩↩ -
出处:「The Linux command shell」第 28–37 段(
text/25-fm-the-linux-command-shell.txt:28,搜「PowerShell」;:35,搜「Bash syntax」)。原文:"In this book, all commands will use Bash syntax. Most of the commands also run in PowerShell." ↩↩↩ -
出处:「The Linux command shell」第 39–45 段(
text/25-fm-the-linux-command-shell.txt:40,搜「package manager」;:43,搜「winget」)。 ↩↩ -
出处:「The Linux command shell」第 46–70 段(
text/25-fm-the-linux-command-shell.txt:56,搜「install.sh」;:61,搜「Homebrew 4.4.23」)。 ↩ -
出处:「Installing Docker Desktop on macOS, Windows, or Linux」第 1–11 段(
text/28-fm-installing-docker-desktop-on-macos-windows-or-li.txt:1,搜「install-extension」)。原文列出安装 ms-azuretools.vscode-docker 等扩展并用code --list-extensions查看。 ↩ -
出处:「Installing Docker Desktop on macOS, Windows, or Linux」第 13–38 段(
text/28-fm-installing-docker-desktop-on-macos-windows-or-li.txt:13,搜「AI is eating the world」;:18,搜「cursor.ai」)。 ↩ -
出处:「Installing Docker Desktop on macOS, Windows, or Linux」第 73–87 段(
text/28-fm-installing-docker-desktop-on-macos-windows-or-li.txt:80,搜「docker version」;:87,搜「27.4.0」)。 ↩ -
出处:「Installing Docker Desktop on macOS, Windows, or Linux」第 89–103 段(
text/28-fm-installing-docker-desktop-on-macos-windows-or-li.txt:94,搜「hello-world」;:99,搜「didn't find an image」;:101,搜「Hello from Docker」)。原文:"Docker didn't find an image called hello-world:latest, and thus decided to download it from a Docker image registry. Once downloaded, Docker Engine created a container from the image and ran it." ↩↩ -
出处:「Using Docker with WSL 2 on Windows」第 1–10 段(
text/29-fm-using-docker-with-wsl-2-on-windows.txt:3,搜「Containers tab」;:7,搜「Exited」)。 ↩↩ -
出处:「Using Docker with WSL 2 on Windows」第 11–15 段(
text/29-fm-using-docker-with-wsl-2-on-windows.txt:12,搜「will not stop」)。 ↩↩ -
出处:「Using Docker with WSL 2 on Windows」第 22–41 段(
text/29-fm-using-docker-with-wsl-2-on-windows.txt:26,搜「near-native」;:35,搜「WSL 2 based engine」)。 ↩↩↩↩ -
出处:「Installing Podman」第 16–21 段(
text/31-fm-installing-podman.txt:17,搜「daemonless」;:20,搜「rootless mode」)。 ↩↩↩ -
出处:「Installing Podman」第 95–104 段(
text/31-fm-installing-podman.txt:98,搜「Daemonless architecture」;:101,搜「Rootless operation」;:102,搜「Docker CLI compatibility」)。 ↩↩↩↩ -
出处:「Installing minikube」第 1–10 段(
text/32-fm-installing-minikube.txt:2,搜「Limited GUI」;:5,搜「Platform support」;:8,搜「Ecosystem and integration」)。Podman 的劣势清单因转码顺序紧接在 minikube 文件开头。 ↩↩↩↩ -
出处:「Installing Podman」第 22–46 段(
text/31-fm-installing-podman.txt:33,搜「podman machine init」;:36,搜「podman machine start」)。 ↩ -
出处:「Installing minikube」第 14–24 段(
text/32-fm-installing-minikube.txt:20,搜「single-node」;:20,搜「kubectl」;:21,搜「multi-node」)。 ↩↩ -
出处:「Installing minikube」第 44–83 段(
text/32-fm-installing-minikube.txt:56,搜「v1.35.0」;:70,搜「v1.32.0」;:82,搜「Done! kubectl is now configured」)。 ↩ -
出处:「Installing minikube」第 104–117 段(
text/32-fm-installing-minikube.txt:106,搜「get nodes」;:116,搜「1.32.0」)。 ↩ -
出处:「Installing minikube」第 118–143 段(
text/32-fm-installing-minikube.txt:128,搜「nginx.yaml」;:136,搜「get pods」;:141,搜「Running」)。 ↩ -
出处:「Installing minikube」第 144–166 段(
text/32-fm-installing-minikube.txt:147,搜「NodePort」;:165,搜「30706」)。 ↩ -
出处:「Installing minikube」第 167–182 段(
text/32-fm-installing-minikube.txt:170,搜「minikube service」;:177,搜「52431」;:180,搜「127.0.0.1:52431」)。 ↩ -
出处:「Installing minikube」第 206–226 段(
text/32-fm-installing-minikube.txt:213,搜「--nodes 3」;:222,搜「demo-m02」)。 ↩ -
出处:「Installing kind」第 16–23 段(
text/33-fm-installing-kind.txt:17,搜「multi-node Kubernetes cluster locally」)。 ↩↩ -
出处:「Installing kind」第 38–72 段(
text/33-fm-installing-kind.txt:44,搜「v0.27.0」;:50,搜「create cluster」;:64,搜「--name demo」)。 ↩ -
出处:「Installing kind」第 127–139 段(
text/33-fm-installing-kind.txt:129,搜「port-forward」;:133,搜「Forwarding from 127.0.0.1:8080」)。 ↩↩ -
出处:「Installing Podman」第 1–14 段(
text/31-fm-installing-podman.txt:3,搜「Apply & restart」;:12,搜「single-node cluster is supported」)。该节因转码顺序位于 Podman 文件开头。 ↩↩↩ -
出处:「Installing Docker Desktop on macOS, Windows, or Linux」第 42–50 段(
text/28-fm-installing-docker-desktop-on-macos-windows-or-li.txt:44,搜「strongly recommend」;:46,搜「best experience」)。 ↩ -
出处:「Docker products」第 46–48 段(
text/17-fm-docker-products.txt:47,搜「deprecated」)。 ↩ -
出处:「Installing minikube」第 88–103 段(
text/32-fm-installing-minikube.txt:96,搜「get-contexts」;:102,搜「asterisk」)。 ↩