docker: mihomo从rootless快速切换rootful tun模式

1. 目标与决策

目标:mihomo 以 rootful 容器运行并启用 TUN 模式,在网络层接管全部流量,此后取消 NixOS 系统代理、浏览器代理、各桌面软件/服务的单独代理配置。

核心决策:

  • 必须 rootful:TUN 需要创建虚拟网卡、改路由表、接管 DNS,rootless 容器在用户命名空间内做这些事限制多、稳定性差。
  • 迁移代价:rootful 与 rootless 的镜像存储、容器、网络命名空间完全隔离,已拉取的镜像不共享,需重新 pull 或 docker save/load 迁移。
  • 迁移时序:mihomo 在 rootless 里占着 7890,rootful 无法绑定同一端口。必须先停 rootless 的 mihomo,再在 rootful 启动,期间代理会短暂中断。

2. 最快路径

# 1) 先验证 rootful 视角下 已有的127 代理确实可达
curl -x http://127.0.0.1:7890 -sI https://registry-1.docker.io/v2/ | head -1
# 期望看到 HTTP/1.1 401 或 200;若 connection refused,跳到下面 fallback

# 2) 趁窗口把两个新镜像拉到 rootful
sudo docker pull metacubex/mihomo:v1.19.32
sudo docker pull ghcr.io/metacubex/metacubexd:v1.273.1

# 3) 确认落地
sudo docker images | grep -E "v1.19.32|v1.273.1"

# 4) 停 rootless mihomo,释放 7890 和 TUN
docker compose -f <rootless路径>/docker-compose.yml down
# 确认端口已释放
ss -tlnp | grep 7890 || echo "7890 free"

# 5) rootful 起容器,--pull never 禁止任何自动 pull
cd <rootful路径>/mihomo
sudo docker compose up -d --pull never

# 6) 验证
sleep 5
sudo docker logs clash --tail 30        # 看 TUN 是否创建成功、无 route/dns 报错
curl -s https://ipinfo.io/ip            # 应为代理出口 IP
curl -s http://192.168.1.120:8080/v1/models   # 内网直连不受影响