# 同一局域网下，如何用手机浏览器访问电脑 Docker 容器中的 Web 服务<no value>
# 同一局域网下，如何用手机浏览器访问电脑 Docker 容器中的 Web 服务？

当我们在docker中部署了web应用(例如web 管理面板, api接口, 基于noVNC的可视化桌面等)时想用手机浏览器访问这些页面, 那此时就要通过以下操作来使手机可以访问web应用

---

## 目录

- [一、核心工作原理与端口映射](#一核心工作原理与端口映射)
- [二、第一步：获取电脑的局域网 IP](#二第一步获取电脑的局域网-ip)
- [三、第二步：放行电脑防火墙端口](#三第二步放行电脑防火墙端口)
- [四、第三步：手机浏览器访问与验证](#四第三步手机浏览器访问与验证)
- [五、避坑指南：开启代理（梯子/VPN）导致打不开怎么办？](#五避坑指南开启代理梯子vpn导致打不开怎么办)
- [六、常见问题排查（FAQ）](#六常见问题排查faq)
- [七、总结](#七总结)

---

## 一、核心工作原理与端口映射

手机访问电脑 Docker 的核心在于 **端口映射（Port Mapping）**：
1. **容器与宿主机：** 容器有独立的内部网络。启动容器时，通过 `-p` 宿主机端口:容器端口 把服务暴露给电脑。
2. **监听范围：** Docker 默认会将端口绑定在 `0.0.0.0`，这意味着**局域网内的其他设备也可以通过电脑的局域网 IP 访问该端口**。

### 端口作用示例：

如果容器映射了以下 3 个端口：
- `5900:5900`：**原生 VNC 远程桌面端口**(必须安装 VNC 客户端软件（如 RealVNC、TightVNC、TigerVNC）才可以查看)
- `6080:6080`：**基于网页的 noVNC 远程桌面端口**(容器内部的虚拟独立桌面(例如docker内启动的chrome浏览器),看不到真实电脑的桌面)
- `6657:6657`：**项目的主网页服务 / API 端口**

则访问规则为：
- **电脑本机访问：** `http://localhost:6657/`
- **手机局域网访问：** `http://<电脑局域网IP>:6657/`（例如 `http://192.168.1.100:6657/`）
- **手机看图形桌面：** `http://<电脑局域网IP>:6080/`

---

## 二、第一步：获取电脑的局域网 IP

### Windows 系统
1. 按键盘快捷键 `Win + R`，输入 `cmd` 并回车。
2. 在命令行中输入：`ipconfig`
3. 找到你当前联网的网卡（如“无线局域网适配器 WLAN”或“以太网”），记录下 **IPv4 地址**（通常形如 `192.168.1.X` 或 `192.168.31.X`）。

### macOS / Linux 系统
打开终端执行：

```bash
ifconfig | grep "inet "
# 或
ip a
```

找到对应的内网 IP（如 `192.168.x.x`）。

---

## 三、第二步：放行电脑防火墙端口

Windows 防火墙默认会拦截来自局域网外部设备的访问请求。如果不放行对应端口，手机访问时会一直提示“连接超时”。

### 推荐方法：PowerShell 单行命令放行

以**管理员身份**打开 PowerShell，复制并执行以下命令（以放行 `6657` 和 `6080` 端口为例）：

```powershell
# 放行 6657 网页服务端口
New-NetFirewallRule -DisplayName "Allow Docker 6657" -Direction Inbound -LocalPort 6657 -Protocol TCP -Action Allow

# 放行 6080 Web桌面端口
New-NetFirewallRule -DisplayName "Allow Docker 6080" -Direction Inbound -LocalPort 6080 -Protocol TCP -Action Allow
```

> ⚠️ **注意：** 命令请**整行复制执行**，不要拆分成多行，避免因断行引发 `-Direction: The term '-Direction' is not recognized` 报错。

### 检查网络配置类型（Windows）：

确保当前 Wi-Fi 网络配置为 **“专用网络（Private Network）”**。如果是“公用网络”，Windows 防火墙会启用极其严格的入站拦截策略。

---

## 四、第三步：手机浏览器访问与验证

1. **连接同一 Wi-Fi：** 确保手机连接的无线网络和电脑处于同一个路由器下（避免连接访客 Wi-Fi）。
2. **打开手机浏览器：** 在地址栏输入电脑的 IP 和端口：`http://192.168.1.100:6657/`（请将 `192.168.1.100` 替换为你电脑的实际 IP）
3. 如果项目包含网页版图形桌面（noVNC），可访问：`http://192.168.1.100:6080/`

---

## 五、避坑指南：开启代理（梯子/VPN）导致打不开怎么办？

很多开发者在日常使用中会开启代理软件（如 Clash、v2rayN、Shadowrocket 等），此时极易遇到以下网络问题：

### 1. 访问时是填代理 IP 吗？
**不是！依然填电脑的局域网 IP（192.168.x.x）。**  
代理节点是公网上的远端服务器，远端服务器无法识别也无法直接路由到你家里的局域网设备。

### 2. 手机开启代理后网页打不开
如果手机开启了“全局代理”或 VPN 虚拟网卡（TUN 模式），手机会将 `192.168.x.x` 的请求错误地转发给境外代理服务器，从而导致“连接超时”或“找不到服务器”。
- **解决方案：** 在手机上**临时关闭代理**后再刷新网页；或者在手机代理软件中开启 **“绕过局域网 (Bypass LAN)”** / 切换至 **“规则分流模式 (Rule)”**。

### 3. 电脑开启了 TUN / 全局路由模式
若电脑代理软件开启了深度的 TUN 虚拟网卡接管，可能会屏蔽局域网入站连接。如果手机连接不上，可尝试临时关闭电脑端的 TUN 模式排查。

---

## 六、常见问题排查（FAQ）

| 问题现象                          | 可能原因                     | 解决办法                                   |
|----------------------------------|------------------------------|--------------------------------------------|
| 手机提示“连接超时 / 无法访问”     | 1. 电脑防火墙拦截<br>2. 手机开了全局代理<br>3. 手机与电脑不在同一 Wi-Fi | 1. 以管理员身份执行第二步的防火墙命令。<br>2. 关闭手机代理。<br>3. 确认手机和电脑连接的是同一路由器的非访客网络。 |
| 电脑本机能打开，局域网都打不开    | Docker 端口仅绑定了本地回环  | 检查启动参数，避免配置为 `-p 127.0.0.1:6657:6657`，应使用默认的 `-p 6657:6657`（绑定至 `0.0.0.0`）。 |
| 不在家（在外使用 4G/5G 流量）想要访问 | 超出局域网范围               | 需配合内网穿透（如 FRP、Cloudflare Tunnel）或组网虚拟局域网工具（如 Tailscale、ZeroTier）。 |

---

## 七、总结

实现局域网移动端访问的核心步骤：
1. 确认容器启动参数包含 `-p`（端口映射）。
2. **查 IP：** 电脑执行 `ipconfig` 获取局域网 IPv4。
3. **开防火墙：** 使用 `New-NetFirewallRule` 单行命令放行端口。
4. **连 Wi-Fi 访问：** 手机连入同 Wi-Fi，关代理后输入 `http://192.168.x.x:端口/` 即可。