添加中文文档

This commit is contained in:
2026-05-12 13:14:17 +00:00
parent 61d7ca6bba
commit 38bb076ac6
24 changed files with 6876 additions and 0 deletions

View File

@@ -0,0 +1,90 @@
# Apple Container 网络设置 (macOS 26)
Apple Container 的 vmnet 网络需要手动配置容器才能访问互联网。否则容器可以与宿主机通信但无法访问外部服务DNS、HTTPS、API
## 快速设置
运行以下两条命令(需要 `sudo`
```bash
# 1. 启用 IP 转发,以便宿主机路由容器流量
sudo sysctl -w net.inet.ip.forwarding=1
# 2. 启用 NAT以便容器流量通过你的互联网接口进行伪装
echo "nat on en0 from 192.168.64.0/24 to any -> (en0)" | sudo pfctl -ef -
```
> **注意:** 将 `en0` 替换为你的活跃互联网接口。使用 `route get 8.8.8.8 | grep interface` 检查。
## 持久化设置
这些设置在重启后会重置。要使其永久生效:
**IP 转发**——添加到 `/etc/sysctl.conf`
```
net.inet.ip.forwarding=1
```
**NAT 规则**——添加到 `/etc/pf.conf`(在任何现有规则之前):
```
nat on en0 from 192.168.64.0/24 to any -> (en0)
```
然后重新加载:`sudo pfctl -f /etc/pf.conf`
## IPv6 DNS 问题
默认情况下DNS 解析器先返回 IPv6 (AAAA) 记录,然后才返回 IPv4 (A) 记录。由于我们的 NAT 仅处理 IPv4容器内的 Node.js 应用将首先尝试 IPv6 然后失败。
容器镜像和运行器通过以下方式配置为优先使用 IPv4
```
NODE_OPTIONS=--dns-result-order=ipv4first
```
这在 `Dockerfile` 中设置,并通过 `-e` 标志在 `container-runner.ts` 中传递。
## 验证
```bash
# 检查 IP 转发是否已启用
sysctl net.inet.ip.forwarding
# 预期输出net.inet.ip.forwarding: 1
# 测试容器互联网访问
container run --rm --entrypoint curl nanoclaw-agent:latest \
-s4 --connect-timeout 5 -o /dev/null -w "%{http_code}" https://api.anthropic.com
# 预期输出404
# 检查桥接接口(仅当容器运行时存在)
ifconfig bridge100
```
## 故障排查
| 症状 | 原因 | 修复方案 |
|---------|-------|-----|
| `curl: (28) Connection timed out` | IP 转发未启用 | `sudo sysctl -w net.inet.ip.forwarding=1` |
| HTTP 正常HTTPS 超时 | IPv6 DNS 解析 | 添加 `NODE_OPTIONS=--dns-result-order=ipv4first` |
| `Could not resolve host` | DNS 未转发 | 检查 bridge100 是否存在,验证 pfctl NAT 规则 |
| 容器输出后挂起 | agent-runner 缺少 `process.exit(0)` | 重建容器镜像 |
## 工作原理
```
容器 VM (192.168.64.x)
├── eth0 → 网关 192.168.64.1
bridge100 (192.168.64.1) ← 宿主机网桥,由 vmnet 在容器运行时创建
├── IP 转发sysctl将数据包从 bridge100 路由 → en0
├── NATpfctl将 192.168.64.0/24 伪装 → en0 的 IP
en0你的 WiFi/以太网)→ 互联网
```
## 参考资料
- [apple/container#469](https://github.com/apple/container/issues/469) — macOS 26 上容器无网络
- [apple/container#656](https://github.com/apple/container/issues/656) — 构建期间无法访问互联网 URL