本地服务没有公网IP怎么给外网演示?本文手把手教你在Ubuntu环境下,使用Docker快速部署Nginx容器,并结合cpolar内网穿透工具,将本地8080端口安全暴露到公网。文章涵盖了从环境安装、镜像拉取到随机/固定域名配置的全流程,并补充了生产环境下的Volume挂载与安全避坑指南,告别来回传压缩包的低效协作。
本文由《云栈运维云原生》编辑整理
内容来源:CSDN 博主 @学无止尽5 ( felix-jy.blog.csdn.net )
本文在原文基础上补充了生产环境运维规范、工具选型对比及安全加固建议,转载请注明来源。
每天在技术群里摸鱼,总能看到有人问类似的问题:我在本地跑了个服务,测试页面调得差不多了,怎么让异地的客户或者前端同学看一眼效果?
老实说,都 2024 年了,如果你的解决方案还是“打个 zip 包发过去让他自己跑”,或者“花钱买台云服务器重新部署一遍”,那效率真的有点低。前者容易因为环境不一致跑不起来,后者纯属杀鸡用牛刀,改一行代码还得重新传一遍。
根本痛点只有一个:你的本地服务没有公网 IP,外面的人进不来。
今天咱们就来点实在的,手把手教你在没有公网 IP 的情况下,用 Docker 跑起 Nginx,再套个内网穿透工具,直接把本地服务暴露出去。整个过程不超过 10 分钟,主打一个简单粗暴。

1. 别在宿主机瞎折腾,先装 Docker
作为一个合格的运维/开发,别动不动就在宿主机上直接装环境,用 容器化 隔离才是正经事。本教程环境是 Linux Ubuntu,先把 Docker 搞定。
在终端中依次执行:
添加 Docker 源
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
安装 Docker 包
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
验证安装是否成功
sudo docker run hello-world
看到 Hello from Docker! 就说明底座搭好了。
2. 拉取 Nginx 镜像
直接上官方最新版:
sudo docker pull nginx:latest

拉完之后瞅一眼本地镜像列表,确认东西在:
sudo docker images

3. 一键起飞:运行 Nginx 容器
镜像有了,直接跑起来。这里我们把宿主机的 8080 端口映射给容器的 80 端口。
$ sudo docker run --name nginx-test -p 8080:80 -d nginx
参数很简单:
- --name mynginx:给容器起个名,我这里叫 mynginx。
- -p 8080:80:端口映射,别和本地其他服务冲突就行。
- -d nginx:后台静默运行。

顺手查一下存活状态:
sudo docker ps

看到 Up 就稳了。打开浏览器访问 本机ip:8080,熟悉的 Welcome to nginx 页面出现,本地测试搞定。

4. 重点来了:用 cpolar 打通公网
现在只能你自己看,怎么让外网访问?这时候就需要内网穿透工具登场了。这里我们用 cpolar,图它个配置简单,不用自己备服务器。
一键安装脚本:
curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash
加入开机自启并启动:
sudo systemctl enable cpolar
sudo systemctl start cpolar
装好后,在浏览器访问 http://局域网ip:9200,用 cpolar 账号登录 Web 管理界面。

4.1 搞个临时公网地址(随机域名)
进仪表盘后,点左侧的 隧道管理 -> 创建隧道:
- 隧道名称:mynginx(别重名就行)
- 协议:http
- 本地地址:8080
- 域名类型:随机域名
- 地区:China Top
点 创建。

去 状态 -> 在线隧道列表 里看一眼,它会给你生成两个公网地址(HTTP 和 HTTPS)。把这个链接发给你的客户,他就能直接看到你本地的页面了。


4.2 嫌地址太丑?上固定域名
随机域名有个毛病,24小时变一次,当个一次性消耗品还行。要是想长期用,建议搞个固定的二级子域名。
去 cpolar 官网后台,点 预留 -> 保留二级子域名,地区选 China VIP,自己编个名字(比如 nginx123),点保留。


拿着这个名字,回到你本地的 9200 管理界面,编辑刚才那个隧道:
- 域名类型:改选 二级子域名
- Sub Domain:填你刚保留的
nginx123
- 地区:China VIP


更新之后,你的公网地址就变成了固定域名,以后怎么重启都不变了。


5. 运维老司机的几句碎碎念
如果你只是拿来给客户做个临时 Demo,上面的步骤完全够用了。但作为一个有追求的工程师,在云栈社区的日常讨论中,我们通常不建议把这种“玩具级”配置直接扔上生产环境。
这套方案有几个明显的坑,你要心里有数:
- 配置不挂载,重启两行泪:上面的
docker run 连个 Volume 都不挂。容器一删,你的 Nginx 配置直接灰飞烟灭。正确的姿势是把 nginx.conf 和 html 目录挂载到宿主机。
- 安全防护等于裸奔:公网暴露本地服务,意味着扫描器也能扫到你。建议在 Nginx 里加上基础的安全响应头,隐藏版本号,并且在宿主机用 UFW 把防火墙收紧。
- 工具鄙视链:cpolar 确实简单,对新手友好。但如果你懂点 网络 知识,手里又恰好有一台便宜的公网 VPS,自己搭个 frp 显然是更硬核、更稳定且完全免费的选择;或者如果你有自己的域名,白嫖 Cloudflare Tunnel 也是极好的。
不管黑猫白猫,能快速搞定需求的方案就是好方案。你平时做本地穿透最喜欢用哪个工具?frp、ngrok 还是 Tailscale?欢迎在评论区教教我。
关注《云栈运维云原生》,系统永不宕机,部署一键完成。