免费云开发容器实战复盘:端口暴露、隧道访问与空闲回收的三次踩坑记录
背景
最近我在华为云 AI 开发者空间领了一台免费体验版云开发容器,想把一个本地跑通的小项目搬上去对外演示。想法很简单:容器启动、装依赖、起服务、拿公网地址分享出去。结果一个下午踩了三个坑,每一个都值得记录下来,分享给同样在用云端开发容器的朋友。
踩坑一:服务只监听了 127.0.0.1,隧道地址打不开
现象:容器里 npm run dev 启动成功,终端里用 curl 127.0.0.1:3000 能拿到页面,但通过平台分配的公网隧道地址访问时一直超时。
排查:在容器里执行 ss -tlnp(或 netstat -tlnp)一看,服务绑在了 127.0.0.1:3000。云端容器的公网访问是经由隧道从容器网卡入口转发的,只会转发到 0.0.0.0 上监听的端口,127.0.0.1 的回环地址外部根本进不来。
解决:
- Vite 项目:启动时加
--host 0.0.0.0,或在vite.config.js里写死server: { host: '0.0.0.0' }; - Node 原生 http 服务:把
server.listen(port, '127.0.0.1')改成server.listen(port, '0.0.0.0'); - Python
http.server默认就是0.0.0.0,反而不会踩这个坑。
教训:在云端容器里,“本地能访问”不等于“外部能访问”,部署后第一步永远是检查监听地址。
踩坑二:端口通了,隧道地址却返回 403
现象:改完监听地址,隧道地址能连上了,但浏览器返回 403,被拒绝访问。
排查:分两层看。第一,体验版容器的出口经过平台的 AI 网关做访问校验,网关侧偶发不可用时会直接 403,等一会儿重试就恢复了;第二,更常见的是脚手架自带的 Host 检查——Vite、webpack-dev-server 默认只允许 localhost 域名的 Host 头,隧道地址的随机域名会被 dev server 直接拦截。
解决:
- Vite 配置加上
server: { host: '0.0.0.0', allowedHosts: true }(仅开发联调用,生产环境不要这样写); - 正式对外演示时,用 nginx 做一层反向代理,把 Host 检查和静态资源缓存都交给 nginx,更稳。
教训:403 不一定是没权限,先分清是网关层还是应用层拦的,再对症下药。
踩坑三:离开一会儿回来,服务“没了”
现象:中午吃饭回来,之前部署好的演示页面打不开了,隧道地址直接失效,容器控制台显示实例已释放。
排查:免费体验版容器有空闲回收机制,长时间无操作会被停机释放,分配的 IP 和隧道地址随之失效。这是体验资源的既定策略,不是故障。
解决:
- 重要进度及时
git push到远端仓库,容器里只留可重建的东西; - 把“装依赖、起服务、配 nginx”的步骤写成一个
setup.sh,重建容器后一键恢复; - 需要长期在线的演示服务,还是走正式的云服务器或容器服务,体验版只用来验证思路。
教训:免费体验资源的状态一律视为易失的,持久化靠仓库和脚本,不靠容器本身。
总结:上云演示前自查清单
- 服务监听
0.0.0.0,而不是127.0.0.1; - 关掉或放行 dev server 的 Host 检查;
- 隧道 403 先判断网关状态,稍后重试;
- 代码勤 push,部署步骤脚本化;
- 长期服务用正式资源,体验版只做验证。
把这份清单过一遍,基本能避开云端容器演示时八成以上的坑。希望对大家有帮助。
- 点赞
- 收藏
- 关注作者
评论(0)