编程语言研究书库

搭好工作环境 — shell、包管理器、Docker Desktop、Podman、minikube 与 kind

搭好工作环境 — 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" 实际是"下载镜像(如果本地没有)→ 创建容器 → 启动 → 收集输出"四件事7。 这两个命令通了,说明 Engine 是好的。

然后是图形界面自检:Docker Desktop 的仪表盘(dashboard)里能看到刚才创建的两个容器 (hello-world 和另一个测试镜像 rancher/cowsay),状态都是 Exited(已退出)—— 容器跑完主进程就停,这是正常状态,不是故障8。书里特意提醒: 关掉仪表盘窗口不会停掉 Docker,真要停要选 Quit Docker Desktop9。

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" 打开即可10。收益很具体: 文件 I/O 更快、容器拿到接近原生 Linux 的速度,资源分配、文件挂载、网络集成 都由 Docker Desktop 自动管理10。

2.6 Podman:无守护进程的 Docker 替代品

Podman 是一个开源的、无守护进程(daemonless)的容器引擎, 大部分命令与 Docker 的命令行兼容,最大的不同是支持 rootless 模式—— 不需要 root 权限就能跑容器,安全性更好11。

书中列的优缺点对照,值得整表接住:

维度Podman 的优势Podman 的劣势
架构无后台守护进程,攻击面更小、开销更低12—
权限原生 rootless12—
兼容性多数 Docker 命令直接通用12—
图形界面—主要靠命令行,没有 Docker Desktop 那样的集成界面13
平台—Windows/macOS 上的支持需要额外配置13
生态—第三方集成和开发工具的原生支持不如 Docker13

注意 macOS/Windows 上装 Podman 要多两步:podman machine init 和 podman machine start——因为非 Linux 系统没有原生内核,Podman 也要先起一台 轻量虚拟机14。

2.7 本地 Kubernetes:minikube

minikube 在你的工作站上起一个(默认)单节点的 Kubernetes 集群, 通过 kubectl(操作 Kubernetes 的命令行工具,它是全书的"遥控器")来访问; 它也能起多节点集群15。

主线例子继续。装好后依次验证:

  $ 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 年初) 的版本,你装时数字会更高16。机制(apply → pod → expose → service → tunnel)不会变。

多节点也只要一条命令:minikube start --nodes 3 -p demo 起一个叫 demo 的三节点集群, kubectl get nodes 能看到一个 control-plane 加两个工作节点17。

2.8 kind:跑在 Docker 容器里的集群

kind(Kubernetes IN Docker)是另一个本地集群工具——它的集群本身运行在 Docker 容器里, 所以装它的前提是 Docker 已经在跑18。kind create cluster 起默认集群, kind create cluster --name demo 再起第二个;作者机器上 kind version 输出 kind v0.27.0 go1.24.0 darwin/arm6419。

访问服务的玩法和 minikube 不同:kind 用 kubectl port-forward(端口转发)—— kubectl port-forward nginx 8080 80 把本机 8080 转到 Pod 的 80, 浏览器开 http://localhost:8080 就能看到欢迎页20。

两个工具怎么选?书里没给硬性裁决,但给了事实基础:minikube 更像"一台真虚拟机里的集群" (有自己的节点端口,tunnel 直连);kind 更像"容器里的一窝容器"(靠端口转发访问)。 CI 流水线上 kind 更快更省;要学 node/port 概念,minikube 更直观。

2.9 Docker Desktop 自带的 Kubernetes

还有第三条路:Docker Desktop 设置里勾选 Enable Kubernetes,Apply & restart, 它会把单节点集群拉起来21。书里只给了一个限制:它只支持单节点; 要多节点就用 kind 或 minikube21。

3. 作者的判断与证据

这一章是操作手册,判断集中在"推荐什么":

判断依据
强烈推荐 Docker Desktop(macOS/Windows 10+)与操作系统虚拟化框架深度集成,是三种桌面系统上最快最稳的跑法22
Windows 上配合 WSL 2近原生 I/O,无需单独 Linux VM10
用包管理器装一切装/升/卸都是一条命令,可脚本化3
命令统一 Bash 语法容器生态的通用语;PowerShell 大多兼容2
Podman 作替代品介绍列了优缺点对照,没站队;事实上作者的示例全用 Docker1113

这些推荐属于"业界共识 + 作者经验",不是实验结论;实测证据是书中每个工具都给出了 作者机器上的真实版本号和命令输出(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 用户,并明确说已废弃、推荐 Desktop23。

5. 可带走的

  1. 装东西的顺序:shell → 包管理器(brew/choco/winget/apt)→ 编辑器 → 容器引擎 → 本地 K8s。
  2. docker version 输出有 Client/Server 两半:Server 才是 Engine;两半都对才算装好24。
  3. docker container run hello-world = 下载镜像 + 创建容器 + 运行 + 输出,一个命令四件事7。
  4. 容器跑完主进程就 Exited,是正常状态;关仪表盘不停 Docker,要 Quit 才算停89。
  5. Windows 上开 WSL 2 引擎,Docker Desktop 默认集成,无需单独 Linux VM10。
  6. Podman 的卖点是无守护进程 + rootless;代价是桌面体验和生态集成,大部分命令与 Docker 通用1112。
  7. 本地 K8s 三选一:Desktop 内置(单节点最省事)、minikube(节点概念最真)、kind(最快最省,CI 常用)151821。
  8. 访问集群里的服务两条路:minikube service(开隧道给 NodePort)和 kubectl port-forward(本机端口直转 Pod)2520。
  9. kubectl 是统一的遥控器,换集群不换命令,只换 context(kubectl config get-contexts)26。

6. 原文地图

主题原书章原文位置
shell 选择、Bash 语法统一The Linux command shelltext/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 shelltext/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 shelltext/25-fm-the-linux-command-shell.txt:73(搜「built on PowerShell」)
VS Code 扩展、CursorInstalling Docker Desktop on macOS, Windows, or Linuxtext/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.0Installing Docker Desktop on macOS, Windows, or Linuxtext/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 四件事、cowsayInstalling Docker Desktop on macOS, Windows, or Linuxtext/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、QuitUsing Docker with WSL 2 on Windowstext/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 Windowstext/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 Podmantext/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/startInstalling Podmantext/31-fm-installing-podman.txt:33(搜「podman machine init」)
minikube 定位、版本、start 输出Installing minikubetext/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 minikubetext/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」)
多节点 minikubeInstalling minikubetext/32-fm-installing-minikube.txt:213(搜「--nodes 3」)
kind 定位、版本、多集群Installing kindtext/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 kindtext/33-fm-installing-kind.txt:129(搜「port-forward」)
Desktop 内置 K8s 单节点限制Installing Podmantext/31-fm-installing-podman.txt:13(搜「single-node cluster is supported」)
章小结Summarytext/34-fm-summary.txt:19(搜「package manager」)

Footnotes

  1. 出处:「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」)。 ↩ ↩2

  2. 出处:「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." ↩ ↩2 ↩3

  3. 出处:「The Linux command shell」第 39–45 段(text/25-fm-the-linux-command-shell.txt:40,搜「package manager」;:43,搜「winget」)。 ↩ ↩2

  4. 出处:「The Linux command shell」第 46–70 段(text/25-fm-the-linux-command-shell.txt:56,搜「install.sh」;:61,搜「Homebrew 4.4.23」)。 ↩

  5. 出处:「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 查看。 ↩

  6. 出处:「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」)。 ↩

  7. 出处:「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." ↩ ↩2

  8. 出处:「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」)。 ↩ ↩2

  9. 出处:「Using Docker with WSL 2 on Windows」第 11–15 段(text/29-fm-using-docker-with-wsl-2-on-windows.txt:12,搜「will not stop」)。 ↩ ↩2

  10. 出处:「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」)。 ↩ ↩2 ↩3 ↩4

  11. 出处:「Installing Podman」第 16–21 段(text/31-fm-installing-podman.txt:17,搜「daemonless」;:20,搜「rootless mode」)。 ↩ ↩2 ↩3

  12. 出处:「Installing Podman」第 95–104 段(text/31-fm-installing-podman.txt:98,搜「Daemonless architecture」;:101,搜「Rootless operation」;:102,搜「Docker CLI compatibility」)。 ↩ ↩2 ↩3 ↩4

  13. 出处:「Installing minikube」第 1–10 段(text/32-fm-installing-minikube.txt:2,搜「Limited GUI」;:5,搜「Platform support」;:8,搜「Ecosystem and integration」)。Podman 的劣势清单因转码顺序紧接在 minikube 文件开头。 ↩ ↩2 ↩3 ↩4

  14. 出处:「Installing Podman」第 22–46 段(text/31-fm-installing-podman.txt:33,搜「podman machine init」;:36,搜「podman machine start」)。 ↩

  15. 出处:「Installing minikube」第 14–24 段(text/32-fm-installing-minikube.txt:20,搜「single-node」;:20,搜「kubectl」;:21,搜「multi-node」)。 ↩ ↩2

  16. 出处:「Installing minikube」第 44–83 段(text/32-fm-installing-minikube.txt:56,搜「v1.35.0」;:70,搜「v1.32.0」;:82,搜「Done! kubectl is now configured」)。 ↩

  17. 出处:「Installing minikube」第 206–226 段(text/32-fm-installing-minikube.txt:213,搜「--nodes 3」;:222,搜「demo-m02」)。 ↩

  18. 出处:「Installing kind」第 16–23 段(text/33-fm-installing-kind.txt:17,搜「multi-node Kubernetes cluster locally」)。 ↩ ↩2

  19. 出处:「Installing kind」第 38–72 段(text/33-fm-installing-kind.txt:44,搜「v0.27.0」;:50,搜「create cluster」;:64,搜「--name demo」)。 ↩

  20. 出处:「Installing kind」第 127–139 段(text/33-fm-installing-kind.txt:129,搜「port-forward」;:133,搜「Forwarding from 127.0.0.1:8080」)。 ↩ ↩2

  21. 出处:「Installing Podman」第 1–14 段(text/31-fm-installing-podman.txt:3,搜「Apply & restart」;:12,搜「single-node cluster is supported」)。该节因转码顺序位于 Podman 文件开头。 ↩ ↩2 ↩3

  22. 出处:「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」)。 ↩

  23. 出处:「Docker products」第 46–48 段(text/17-fm-docker-products.txt:47,搜「deprecated」)。 ↩

  24. 出处:「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」)。 ↩

  25. 出处:「Installing minikube」第 167–182 段(text/32-fm-installing-minikube.txt:170,搜「minikube service」;:177,搜「52431」;:180,搜「127.0.0.1:52431」)。 ↩

  26. 出处:「Installing minikube」第 88–103 段(text/32-fm-installing-minikube.txt:96,搜「get-contexts」;:102,搜「asterisk」)。 ↩

On this page