关键词:Docker、cpolar、远程办公、内网穿透、零代码、反向代理、自动化脚本


1. 关键概念速览
概念一句话解释
Docker一次构建、随处运行的轻量级虚拟化技术,把“应用+依赖”打成镜像。
cpolar国产开源内网穿透工具,一条命令即可把 localhost 映射到公网 HTTPS 域名,无需公网 IP。
远程办公痛点居家/出差时要访问公司内网 OA、GitLab、Jenkins、NAS,传统 VPN 配置繁琐、权限颗粒度粗。

2. 应用场景
  1. 个人开发者:把本地 JupyterLab 暴露给导师在线 Review。
  2. 小微企业:财务小姐姐在家通过 HTTPS 访问内网 192.168.1.201:8080 的用友 U8+。
  3. 敏捷团队:每日站会演示本地正在开发的前端页面,无需反复打包发版。

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

逐行解读:

  1. cpolar 服务使用官方镜像,无需自己写 Dockerfile。
  2. environment 中注入 CPOLAR_AUTHTOKEN,实现“无交互登录”。
  3. command 最后把流量转发到 flask-oa:5000这里用的是 Docker DNS 服务名,因此无论容器 IP 怎么变,都能自动解析。
  4. depends_on 保证先起业务服务,再起穿透客户端,避免 502。
  5. 两者共用自定义 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. 未来发展趋势
  1. 边缘容器化:cpolar 官方已推出 ARM64 镜像,可直接在树莓派、NAS 上跑,办公室断电也能用 UPS 续航。
  2. Serverless 融合:cpolar 正在内测“函数级路由”,未来可把 Flask 拆成多个 Lambda 粒度,按次计费。
  3. 零信任安全:cpolar 将集成 OIDC + JWT,让“谁、在什么设备、访问什么 URL”全程可审计,替代传统 VPN 粗粒度授权。
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐