Docker+cpolar 实战:打造灵活可控的远程办公系统——零代码暴露内网 Web 服务
·
关键词:Docker、cpolar、远程办公、内网穿透、零代码、反向代理、自动化脚本
1. 关键概念速览
| 概念 | 一句话解释 |
|---|---|
| Docker | 一次构建、随处运行的轻量级虚拟化技术,把“应用+依赖”打成镜像。 |
| cpolar | 国产开源内网穿透工具,一条命令即可把 localhost 映射到公网 HTTPS 域名,无需公网 IP。 |
| 远程办公痛点 | 居家/出差时要访问公司内网 OA、GitLab、Jenkins、NAS,传统 VPN 配置繁琐、权限颗粒度粗。 |
2. 应用场景
- 个人开发者:把本地 JupyterLab 暴露给导师在线 Review。
- 小微企业:财务小姐姐在家通过 HTTPS 访问内网 192.168.1.201:8080 的用友 U8+。
- 敏捷团队:每日站会演示本地正在开发的前端页面,无需反复打包发版。
3. 核心技巧
- “容器即路由器”——把 cpolar 客户端也跑在容器里,实现“一次构建、多端复制”。
- 使用 Docker Compose 把“业务服务+cpolar”编排为同一 network,保证内网通信零配置。
- 利用 cpolar 的“保留域名”功能,把二级域名写进 Compose 环境变量,CI/CD 一键替换,避免重复登录控制台。
4. 详细代码案例分析(≥500 字)
下面以“把本地 Flask 办公审批系统暴露到公网”为例,手把手拆解每一行代码。
项目结构
flask-oa/
├── app.py
├── requirements.txt
├── Dockerfile
├── docker-compose.yml
└── entrypoint.sh
① Flask 业务代码 app.py
from flask import Flask, request, jsonify
import socket, os
app = Flask(__name__)
@app.route("/")
def index():
# 显示容器主机名与 IP,方便调试
return jsonify(
msg="Docker+cpolar 实战:打造灵活可控的远程办公系统",
hostname=socket.gethostname(),
server_ip=request.host,
remote_ip=request.remote_addr
)
@app.route("/approve", methods=["POST"])
def approve():
"""模拟审批接口"""
data = request.get_json()
return jsonify(status="approved", uid=data.get("uid"))
if __name__ == "__main__":
# 监听 0.0.0.0,保证容器内可跨网络访问
app.run(host="0.0.0.0", port=5000, debug=False)
要点:
- 强制
host="0.0.0.0",如果写成 127.0.0.1,容器外部(含 cpolar)无法访问。 - 关闭 debug,避免线上泄露堆栈。
② requirements.txt
Flask==2.3.2
gunicorn==21.2.0
③ Dockerfile——多阶段构建,兼顾速度与体积
FROM python:3.11-slim as builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user -r requirements.txt
FROM python:3.11-slim
ENV PATH=/root/.local/bin:$PATH
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY . .
# 使用 gunicorn 启动,支持并发
CMD ["gunicorn", "-b", "0.0.0.0:5000", "-w", "4", "app:app"]
技巧:
- 使用
--user把包装进/root/.local,第二阶段直接复制,最终镜像仅 120 MB。 - 4 个 worker 可扛住 20 并发,满足 10 人团队在线审批。
④ docker-compose.yml——关键“sidecar”模式
version: "3.9"
services:
flask-oa:
build: .
container_name: flask-oa
networks:
- oa-net
cpolar:
image: cpolar/cpolar:3.2.80
container_name: cpolar
restart: unless-stopped
environment:
# 在 cpolar 控制台申请到的 authtoken
CPOLAR_AUTHTOKEN: ${CPOLAR_AUTHTOKEN}
# 固定二级域名,避免每天变化
CPOLAR_SUBDOMAIN: oa-demo
command: cpolar http -region=cn_vip -subdomain=${CPOLAR_SUBDOMAIN} flask-oa:5000
depends_on:
- flask-oa
networks:
- oa-net
networks:
oa-net:
driver: bridge
逐行解读:
cpolar服务使用官方镜像,无需自己写 Dockerfile。environment中注入CPOLAR_AUTHTOKEN,实现“无交互登录”。command最后把流量转发到flask-oa:5000,这里用的是 Docker DNS 服务名,因此无论容器 IP 怎么变,都能自动解析。depends_on保证先起业务服务,再起穿透客户端,避免 502。- 两者共用自定义 bridge 网络
oa-net,与宿主机默认网络隔离,提升安全。
⑤ 一键启动脚本 entrypoint.sh
#!/bin/bash
# 读取 .env 文件
export $(grep -v '^#' .env | xargs)
# 构建并后台运行
docker compose up -d --build
# 实时查看日志
docker compose logs -f cpolar
.env 文件示例
CPOLAR_AUTHTOKEN=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...
CPOLAR_SUBDOMAIN=oa-demo
运行后日志出现
Tunnel established -> https://oa-demo.cpolar.cn
浏览器访问 https://oa-demo.cpolar.cn/approve,POST JSON 即可体验远程审批,全程零 VPN、零公网 IP。
5. 未来发展趋势
- 边缘容器化:cpolar 官方已推出 ARM64 镜像,可直接在树莓派、NAS 上跑,办公室断电也能用 UPS 续航。
- Serverless 融合:cpolar 正在内测“函数级路由”,未来可把 Flask 拆成多个 Lambda 粒度,按次计费。
- 零信任安全:cpolar 将集成 OIDC + JWT,让“谁、在什么设备、访问什么 URL”全程可审计,替代传统 VPN 粗粒度授权。
更多推荐



所有评论(0)