TECH
AI Loop 本机开发环境实战:Windows + WSL + Podman 从 0 到 1
面向 AI Coding 的本机环境搭建指南。本文从选型决策、架构关系、0-1 搭建到复杂系统扩展,讲清如何让 AI 承担更多执行工作,让人类聚焦选择与决策。
修订记录
| 版本 | 时间 | 说明 |
|---|---|---|
| v1 | 2026-02-27 | 初稿,覆盖 Podman 原理、Desktop 机制与 Windows 实战配置 |
| v2 | 2026-02-27 | 重构为 AI Loop 主线:先讲价值与选型,再给 0-1 实操、脚本契约、A3 分工与复杂系统扩展 |
| v3 | 2026-02-27 | 收敛开头结论:只保留价值与路径,技术实现约束下沉到后文章节 |
| v4 | 2026-03-02 | 补充 Windows + WSL + Podman 重装后的实战坑位:rootful/rootless 视图、代理注入、compose provider、镜像仓库迁移与一键修复路径 |
| v5 | 2026-03-02 | 主题归类调整为 AI Coding 主线:topic 调整为 ai-apps,并保留 cloud 标签作为基础设施维度 |
| v6 | 2026-03-05 | 内容目录迁移到 ai-way,主题调整为 topic: ai-way |
先看结论
如果只想先抓关键结论,记住这 5 点:
- AI 时代的效率瓶颈不只在“写代码”,更在“环境启动 + 回归验证”。
- 本机算力足够时,本机 DevOps 快环通常比远端共享环境更高效。
- 推荐
CLI 主导 + Desktop 辅助,把环境控制面做成脚本契约,才能支撑 AI 稳定循环。 - A3 阶段的目标是:AI 负责可判定执行,人类负责判断、取舍和发布决策。
- 本文提供一条从 0 到 1 的可落地路径,并可扩展到 Hadoop + MySQL + PostgreSQL 的复杂场景。
实现细节(如连接上下文、rootful/rootless、依赖分层)会放在后文“原理、扩展与排障”章节展开,不在开头打断主线。
阅读导航
- 为什么先做本机 AI Dev Loop
- 选型与取舍:为什么是 Windows + WSL + Podman
- 架构图:人、AI Agent、代码、环境、测试怎么协作
- A3 成功标准与职责边界
- 从 0 到 1:把运行面搭起来
- 建立脚本契约:让 AI 可稳定执行
- 前端点击验证:AI 什么时候做,人什么时候接管
- 扩展到复杂系统:Hadoop + MySQL + PostgreSQL
- Podman 原理速通:关键概念一次讲清
- 高频故障速查与落地规范
1. 为什么先做本机 AI Dev Loop
很多团队已经把代码生成速度提升了,但迭代总时长并没有同步下降。原因是开发链路里还有三类慢点:
- 依赖环境启动慢,且跨项目互相污染。
- 测试链路断裂,尤其是“后端通过但前端关键路径未验证”。
- 回归失败后定位慢,日志和上下文经常不一致。
本文目标不是“换个容器工具”,而是搭建一套本机可复用的 AI Loop:
- AI 能自动执行可判定任务(启动、测试、回归、日志归因)。
- 人类从重复执行中脱身,主要做目标定义与决策判断。
- 在进入最终测试或生产环境前,尽量把大多数问题在本机快环内消化。
2. 选型与取舍:为什么是这条路线
2.1 宿主系统:为什么是 Windows
这台开发机是 Windows(i9 + 64GB),本机算力足够承载较完整的开发与验证链路。对这种硬件条件来说,“在本机快速拉起依赖并回归”有明显收益:
- 减少等待共享环境与排队资源。
- 降低网络波动对迭代节奏的影响。
- 提高问题重现与定位速度。
如果你使用 macOS,整体方法同样成立,差异主要在工具安装与虚拟化实现细节。
2.2 容器引擎:为什么从 Docker 迁移到 Podman
核心原因是 Docker Desktop 的许可证与成本约束;其次是工程收益:
- Podman 的 daemonless 设计减少中心进程单点依赖。
- rootless 能力在多项目并行开发中更灵活。
- Docker 命令与镜像生态兼容度高,迁移门槛可控。
2.3 操作模式:为什么是 CLI 主导 + Desktop 辅助
AI 要高频稳定执行,关键在“可脚本化、可复现、可回放”。CLI 更符合这个目标。Desktop 的价值主要是给人使用:
- 可视化观察容器状态和日志。
- 连接/上下文快速确认。
- 故障定位时的辅助入口。
2.4 路线对比(简版)
| 路线 | 优势 | 风险/限制 | 适配 A3 |
|---|---|---|---|
| CLI 主导 + Desktop 辅助 | 最利于 AI 自动化,链路可脚本化 | 需要先建立脚本契约 | 高 |
| Desktop 主导 | 上手直观 | 状态容易依赖手工操作,自动化弱 | 中 |
| 多入口混用(CLI/GUI/多 WSL 随机切) | 短期方便 | 高概率 context 漂移,难排障 | 低 |
3. 架构关系图:人、AI Agent、代码、环境、测试
下面这张图描述了完整闭环。它本质上就是 AI-Coding 时代的本地 DevOps 快环:
flowchart TB
H[👤 人类: 目标定义 / 取舍 / 发布决策]
H --> S[📋 Spec 与约束]
S --> A[🤖 AI Agent]
A -. 产出 .-> R[📦 代码仓库]
A --> K[📜 脚本契约: up / test / logs / down / reset]
K --> F[⚡ 快通道: WSL 直接执行<br/>L1 lint · L2 单元测试]
K --> C[Core: MySQL / PG / Redis]
K --> X[Extended: Hadoop 等]
C --> P[App: API / Web / Worker]
X --> P
P --> G[🐳 全通道: 容器验证<br/>L3 集成测试 · L4 E2E]
F --> T[✅ 验证结果汇总]
G --> T
T -- 自动反馈 --> A
T -. 需人类干预或放行 .-> H
H -. 随时审查代码/脚本/运行状态 .-> A
图里有四个重点:
- 人类输入从”执行命令”变成”定义目标、做判断、做放行”,并可随时审查 AI 产出。
- AI 通过脚本契约驱动环境与测试,而不是直接自由操作每个命令。
- 验证分双通道:快通道(L1+L2 在 WSL 直接跑,秒级反馈)和全通道(L3+L4 走容器,分钟级但环境可信)。
- 复杂依赖分层运行,快环与全量回归拆开执行。
4. A3 成功标准与职责边界
A3 的目标是:AI 可以稳定完成执行闭环,人类做最终判断。
4.1 验证分层
| 层级 | 内容 | 默认执行者 | 是否可自动判定 |
|---|---|---|---|
| L1 | lint/typecheck/format | AI | 是 |
| L2 | 单元测试/契约测试 | AI | 是 |
| L3 | 集成测试(真实 DB/依赖) | AI | 是 |
| L4 | 前端关键路径脚本化点击 | AI | 是(关键路径) |
| L5 | 体验、价值、风险判断 | 人类 | 否 |
4.2 人机分工
AI 负责:
- 启停环境、执行测试、收集日志、尝试小步修复。
- 生成可审计的变更说明和回归结果。
人类负责:
- 需求取舍、架构选择、风险评估、发布放行。
- 对不可判定问题做最终判断。
4.3 强制交接条件
出现以下任一情况,AI 应停止自动修复并交给人类:
- 同类错误连续修复失败 3 次以上。
- 测试结果反复波动(flaky)且无法稳定复现。
- 涉及数据迁移、权限策略、对外协议变更或成本风险。
5. 从 0 到 1:搭建基础运行面(Windows + WSL + Podman)
本章只做最小可用,不追求一次到位。每一步都按“目标 -> 命令 -> 预期输出 -> 失败处理”执行。
5.1 预检查(PowerShell)
目标:确认 WSL 可用、虚拟化正常、发行版状态清晰。
wsl --status
wsl -l -v
预期输出:
- WSL2 可用。
- 至少有一个开发发行版(如 Ubuntu)。
失败处理:
- 先安装或修复 WSL,再继续容器环境搭建。
- 避免在 WSL 未就绪时直接初始化 Podman machine。
5.2 初始化 Podman machine
podman machine init --cpus 8 --memory 24576 --disk-size 200
podman machine start podman-machine-default
podman machine list
预期输出:
podman-machine-default状态为running。
失败处理:
- 若 machine 已存在,跳过
init,直接start。 - 若启动失败,先检查
wsl -l -v中该发行版状态。
5.3 固定默认连接(避免 context 漂移)
podman system connection list
podman system connection default podman-machine-default-root
podman system connection list
预期输出:
Default指向podman-machine-default-root(或你团队统一约定的连接)。
5.4 首次验收
podman info
podman version
podman run --rm quay.io/podman/hello
podman ps -a
预期输出:
podman info正常返回。- hello 容器可拉起并退出。
podman ps -a可看到最近运行记录。
5.5 C 盘空间保护(可选但推荐)
Windows 下 machine VHDX 默认可能在系统盘,建议尽早迁移到非系统盘。
podman machine stop podman-machine-default
wsl --export podman-machine-default E:\temp\podman-machine-default.tar
wsl --unregister podman-machine-default
wsl --import podman-machine-default D:\WSL\podman-machine-default E:\temp\podman-machine-default.tar --version 2
podman machine start podman-machine-default
6. 建立可复用脚本契约(AI 可执行的接口)
如果没有稳定脚本接口,AI 只会变成“会敲命令的人”,而不是可重复执行的工程助手。
6.1 最小脚本集合
建议至少定义以下入口:
scripts/dev/up.sh:启动core依赖与应用。scripts/dev/test.sh:执行 L1-L4 验证。scripts/dev/logs.sh:按服务聚合日志。scripts/dev/down.sh:停止但不删数据。scripts/dev/reset.sh:清理并重建(高成本动作)。
6.2 契约规则(关键)
- 所有脚本必须返回明确退出码(
0成功,非0失败)。 - 输出中要有可被 AI 和 CI 解析的关键字段(例如
PASS/FAIL、失败服务名)。 reset不应作为默认动作,防止每轮循环都重建全量依赖。
6.3 与 Spec-Coding / TDD 的对应关系
- Spec-Coding:先定义需求、边界和验收条件,再让 AI 实现。
- TDD:先有可判定测试,再进入实现与修复循环。
- 脚本契约:把“方法论”固化为统一执行入口,避免环境操作随意发散。
7. 前端点击验证:AI 什么时候合适,什么时候需要人类
你的判断是对的。前端验证不应只靠人工点,也不能完全取消人工判断。
7.1 推荐分工
AI 适合:
- 关键路径脚本化点击(登录、核心表单、核心查询)。
- 回归冒烟执行和失败截图归档。
- 失败后根据日志与截图做小步修复尝试。
人类适合:
- 体验质量判断(交互节奏、可读性、业务语义是否正确)。
- 高风险场景确认(金额、权限、关键数据展示)。
- 发布决策与异常兜底策略。
7.2 建议把前端验证也纳入脚本契约
npm run test:e2e:smoke
npm run test:e2e:critical
AI 默认执行 smoke;critical 和最终验收由人类决定是否触发。
8. 扩展到复杂系统:Hadoop + MySQL + PostgreSQL 的分层策略
在开发过程中,确实没必要每次都重启所有依赖。建议采用双层策略:
core:MySQL、PostgreSQL、Redis、应用服务,默认常驻。extended:Hadoop 等重依赖,按需启用。
8.1 Compose 分层示意
services:
mysql:
image: mysql:8.4
postgres:
image: postgres:16
app:
build: .
depends_on: [mysql, postgres]
hadoop-master:
image: your-hadoop-master:latest
profiles: ["extended"]
8.2 运行策略
# 快环:日常开发
podman compose up -d
# 全量:需要验证大数据链路时
podman compose --profile extended up -d
只在以下场景使用 reset:
- 基础镜像或依赖大版本升级。
- schema/初始化脚本发生破坏性变更。
- 环境污染已影响结果可信度。
9. Podman 原理速通:关键概念讲清楚
9.1 daemonless 的含义
Podman 不依赖长期常驻的中心 daemon。命令触发后按需执行,这让本地多项目场景更灵活,也减少了“一个 daemon 挂掉影响全部容器”的风险。
9.2 rootful 与 rootless
二者不是“好坏之分”,而是两个不同运行上下文:
rootless:容器进程以普通用户运行,默认隔离更强,权限更小。rootful:容器进程以 root 上下文运行,更容易拿到端口、网络、特权能力。
在 WSL + Podman machine 里,这通常对应两条连接:
podman-machine-default(user socket,rootless)。podman-machine-default-root(root socket,rootful)。
所以你在 rootful 下创建的容器,不会自动出现在 rootless 视图里。
Desktop 空列表的高频原因,不是容器没了,而是 GUI 正连在另一个上下文。
9.3 connection/socket 决定“你能看到什么”
Podman Desktop、Windows 终端、WSL 终端可能连接到不同 socket。容器“消失”多数不是丢失,而是看到了另一个上下文。
9.4 Podman Desktop 的真实定位
Desktop 是管理面,不是运行时。它很适合观察与排障,但自动化执行仍应以脚本与 CLI 为主。
10. 高频故障速查(症状 -> 检查 -> 修复)
10.1 Desktop 空列表
podman machine list
podman system connection list
podman ps -a
重点看 Default 连接是否正确,machine 是否 running。
10.2 端口映射存在但 Windows 访问不到
- 看容器是否
Up。 - 看服务进程是否已监听内部端口。
- 分别做主机探测和容器内探测。
一个很常见的“误判点”是:你以为自己在测 Windows 访问,其实是在测 WSL 访问;或者反过来。建议用一个最小烟雾测试把问题切开。
最小烟雾测试(建议用 rootful 默认连接):
podman run -d --name test-nginx -p 28080:80 docker.io/library/nginx:alpine
podman ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
podman port test-nginx
然后分两侧验证:
# Windows 侧:优先用 127.0.0.1,避免部分环境下 localhost 先走 ::1(IPv6)导致“看起来连不上”
curl.exe -I http://127.0.0.1:28080/
# 或:
Test-NetConnection 127.0.0.1 -Port 28080 | Select-Object -ExpandProperty TcpTestSucceeded
# WSL 侧:如果你开启了 mirrored 网络模式,WSL 内用 127.0.0.1/localhost 访问暴露端口可能会超时
# 这不是“容器没启动”,而是访问路径变了。用 WSL 的网卡 IP 测更稳。
WSL_IP="$(ip -4 -br addr show eth9 | awk '{print $3}' | cut -d/ -f1)"
curl -I "http://${WSL_IP}:28080/"
如果你发现:
- Windows 侧
127.0.0.1:28080正常,但 WSL 侧127.0.0.1:28080超时,而 WSL 侧${WSL_IP}:28080正常:大概率是 WSL 的networkingMode=mirrored导致的行为差异。此时要么改脚本/验收到“按所在侧选地址”,要么把 WSL 网络模式切回 NAT。 - Windows 侧
localhost:28080不稳定但127.0.0.1:28080正常:优先把客户端配置(浏览器/代理/脚本)从localhost换成127.0.0.1规避 IPv6 优先级差异。 - Windows 侧
127.0.0.1:28080也超时,同时你看到 WSL 提示“使用镜像网络模式时,wsl2.localhostForwarding设置无效”:说明你当前的 WSL 镜像网络模式不支持(或不启用)Windows <-> WSL 的localhost端口转发。此时如果你的目标是“Windows 浏览器访问容器端口”,建议直接切回 NAT。
清理烟雾容器:
podman rm -f test-nginx
10.3 compose 偶发失败
podman compose down
podman network ls
podman compose up -d
先清残留再重建,不要直接怀疑业务代码。
10.4 C 盘空间持续增长
检查 VHDX 所在路径与大小,必要时迁移至非系统盘。
10.5 重装后 podman machine start 失败(端口漂移 / user-mode networking)
症状:
podman machine start报错,提示 machine 没进入 running。- 日志中出现
detected port conflict、machine did not transition into running state。 podman-net-usermode相关启动链路失败。
检查:
podman machine list
podman machine inspect podman-machine-default
podman --log-level=debug machine start
最小修复(先恢复可用):
podman machine set --user-mode-networking=false podman-machine-default
podman machine start
再固化默认上下文:
podman machine set --rootful=true podman-machine-default
podman system connection default podman-machine-default-root
podman system connection list
10.6 Windows 有代理,但 Podman machine 拉镜像失败
典型症状:
- Windows 代理是
127.0.0.1:7078(例如 Clash)。 - Podman machine 继承该代理后,
podman pull失败:connect 127.0.0.1:7078 refused。
原因:
127.0.0.1在 Windows、WSL、Podman machine 是不同网络命名空间。- Windows 本地回环代理地址不一定在 machine 内可达。
建议策略(避免破坏全局代理):
- 不改 Windows/WSL 全局代理。
- 只在 Podman 作用域设置可达代理(例如
172.x.x.x:7078)。 - 用“命令级代理”或 Podman 服务级 drop-in,不污染其他开发链路。
10.7 重装后 podman compose 提示找不到 provider
症状:
podman compose ...报looking up compose provider failed。- 提示找不到
docker-compose/podman-compose。
修复:
podman machine ssh --username root "python3 -m ensurepip --upgrade && pip3 install podman-compose"
10.8 Bitnami 官方标签缺失(manifest unknown)
症状:
docker.io/bitnami/kafka:2.8.1、docker.io/bitnami/mysql:8.0等标签拉取失败。
原因:
- 部分历史标签迁移或下架,
bitnami/*与bitnamilegacy/*存在差异。
修复建议:
- 在 compose 中优先改用可用镜像源(例如
docker.io/bitnamilegacy/kafka:2.8.1、docker.io/bitnamilegacy/mysql:8.0)。 - 不再依赖临时本地 tag 映射作为长期方案。
10.9 serjs/go-socks5-proxy:latest 启动即退出
症状:
- 日志报
REQUIRE_AUTH is true, but PROXY_USER and PROXY_PASSWORD are not set。
修复:
- 若用于内网调试,显式设置
REQUIRE_AUTH=false。 - 若用于共享环境,改为配置用户名密码并启用认证。
11. 给团队的最小落地规范
- 统一默认连接(明确 rootful 或 rootless,避免混用)。
- 统一脚本契约(
up/test/logs/down/reset)。 - CI 与本机复用同一套脚本,保证行为一致。
- 默认跑快环(core),按需跑全量环(extended)。
- 明确人工放行门槛,避免“自动化通过 = 可以发布”的误判。
12. 结语
这套路线的目标不是“让 AI 取代人”,而是让 AI 取代重复执行,让人类集中在选择和决策。
当环境可脚本化、验证可判定、边界可治理后,AI 才能稳定承担越来越多工作,团队才能在快速迭代中保持质量与可控性。
参考链接
- Podman Desktop 官方文档:https://podman-desktop.io/docs
- Podman 官方文档(machine):https://docs.podman.io/en/latest/markdown/podman-machine.1.html
- Podman 官方文档(system connection):https://docs.podman.io/en/latest/markdown/podman-system-connection.1.html
评论