13 KiB
13 KiB
WorkPod 部署维护手册
版本:1.0 | 更新日期:2026-04-07
1. 系统概览
WorkPod 是基于 Docker 的轻量级开发环境容器系统,提供 Web 终端 (ttyd) 和 SSH 双入口,支持多实例部署。
1.1 架构总览
┌─────────────────────────────────────────────────────┐
│ 宿主机 (Windows) │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌───────────┐ │
│ │ workpod-alpine│ │ ws-flux-dev │ │ 基础设施 │ │
│ │ :2222 / :7681│ │ :2201 / :7701│ │ mysql/redis│ │
│ └──────────────┘ └──────────────┘ └───────────┘ │
│ ↑ ↑ │
│ Alpine 3.23 + Node24 + JDK17/Maven │
│ ~438MB ~438MB │
└─────────────────────────────────────────────────────┘
1.2 实例清单
| 实例 | 类型 | SSH | Web | 镜像 | 内存限制 |
|---|---|---|---|---|---|
| workpod-alpine | 基础实例 | :2222 | :7681 | workpod-alpine:latest (438MB) | 4G |
| ws-flux-dev | Flux 项目 | :2201 | :7701 | ws-flux-dev:latest (438MB) | 4G |
| workpod-test | 测试实例 | :2223 | :7682 | ae5a15cc0c94 (旧镜像) | 4G |
2. 快速操作
2.1 日常启停
# 启动全部实例
cd E:/wk-lab/workpod/instances/base && docker compose up -d
cd E:/wk-lab/workpod/instances/flux && docker compose up -d
# 停止单个实例
docker compose -f instances/base/docker-compose.yml down
docker compose -f instances/flux/docker-compose.yml down
# 重启(推荐:先 down 再 up)
docker compose -f instances/base/docker-compose.yml down && docker compose -f instances/base/docker-compose.yml up -d
2.2 连接方式
# ====== 基础实例 ======
Web 终端: http://localhost:7681 # 用户 jc / 密码 1234567
SSH: ssh root@localhost -p 2222 # 密码 workpod123
进入容器: MSYS_NO_PATHCONV=1 docker exec -it workpod-alpine bash
# ====== Flux 实例 ======
Web 终端: http://localhost:7701 # 用户 jc / 密码 1234567
SSH: ssh root@localhost -p 2201 # 密码 workpod123
进入容器: MSYS_NO_PATHCONV=1 docker exec -it ws-flux-dev bash
2.3 一键检查状态
# 容器状态
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
# 资源占用
docker stats --no-stream --format "table {{.Name}}\t{{CPUPerc}}\t{{MemUsage}}\t{{NetIO}}"
# 镜像列表
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
3. 构建与更新
3.1 镜像构建
# 基础镜像(Alpine 3.23 + Node 24 + Claude Code)
cd E:/wk-lab/workpod
docker build -t workpod-alpine:latest .
# Flux 扩展镜像(基础镜像 + LABEL,JDK 通过 volume 挂载)
docker build -t ws-flux-dev:latest -f Dockerfile.flux .
构建产物 (~438MB):
- alpine:3.23 基础 (~7MB)
- 运行时工具 curl/git/ssh/ttyd/tmux/bash (~80MB)
- Node.js v24.14.1 (musl) + claude-code + coding-helper (~200MB)
- entrypoint.sh + ttyd-session.sh (<10KB)
3.2 更新 Claude Code / coding-helper
# 重新构建即可获取最新版(@latest 标签)
docker build --no-cache -t workpod-alpine:latest .
docker build --no-cache -t ws-flux-dev:latest -f Dockerfile.flux .
# 重启容器生效
docker compose -f instances/base/docker-compose.yml down && docker compose -f instances/base/docker-compose.yml up -d
docker compose -f instances/flux/docker-compose.yml down && docker compose -f instances/flux/docker-compose.yml up -d
3.3 滚动更新(不中断服务)
# 1. 构建新镜像
docker build -t workpod-alpine:latest .
# 2. 创建新容器(旧容器仍在运行)
docker compose -f instances/base/docker-compose.yml up -d --no-deps --build workpod-alpine
# 3. 确认健康后删除旧容器(自动完成,compose 管理)
4. 运维操作
4.1 日志查看
# 实时日志
docker logs -f workpod-alpine
docker logs -f ws-flux-dev
# 最近 50 行
docker logs --tail 50 workpod-alpine
# 按时间过滤
docker logs --since 2026-04-07T08:00:00 workpod-alpine
日志策略: json-file 驱动,单文件最大 10MB,保留 3 个文件(每实例最多 30MB)
4.2 进入容器调试
# 交互式 shell(推荐 login shell 以加载 PATH)
MSYS_NO_PATHCONV=1 docker exec -it workpod-alpine bash -lc 'echo $PATH; java -version; node -v'
# 执行单条命令
MSYS_NO_PATHCONV=1 docker exec workpod-alpine bash -lc 'claude --version'
注意: Windows Git Bash 下必须加
MSYS_NO_PATHCONV=1,否则路径转换会导致错误。
4.3 文件传输
# 宿主机 → 容器
docker cp ./local-file.txt workpod-alpine:/workspace/
# 容器 → 宿主机
docker cp workpod-alpine:/workspace/output.txt ./
4.4 tmux 会话管理
容器内 ttyd 使用 tmux 管理终端会话:
# 在 Web 终端或 SSH 中操作
tmux ls # 列出所有会话
tmux attach -t session_name # 加入会话
tmux new -s my_session # 新建会话
# URL 快速访问指定会话
http://localhost:7681/?session=my_session
4.5 数据持久化
| 实例 | 宿主机路径 | 容器路径 | 用途 |
|---|---|---|---|
| base | data/workspace |
/workspace |
工作目录 |
| flux | E:/wk-flux |
/workspace |
Flux 项目源码 |
| flux | data/home/flux-dev |
/root |
用户配置 (.gitconfig 等) |
5. 故障排查
5.1 容器无法启动
# 查看启动日志
docker logs workpod-alpine
# 常见问题:
# exit 127 → 命令未找到(镜像损坏或 entrypoint 缺失)
# exit 1 → 健康检查失败(sshd 或 ttyd 未启动)
# exit 255 → 信号处理异常
workpod-test 退出码 127 排查:
该实例使用旧镜像 ID ae5a15cc0c94,可能缺少 entrypoint。修复方法:
# 方案 A:改用最新基础镜像
# 编辑 instances/test/docker-compose.yml,将 image 改为 workpod-alpine:latest
# 方案 B:重新构建并替换
cd E:/wk-lab/workpod
docker build -t workpod-test:latest .
# 然后修改 test/docker-compose.yml 的 image 字段
5.2 端口冲突
# 查看端口占用
netstat -ano | grep :7681
# 端口分配表(避免冲突)
# 2222 / 7681 — workpod-alpine (基础)
# 2201 / 7701 — ws-flux-dev (Flux)
# 2223 / 7682 — workpod-test (测试)
# 新实例建议用 22xx / 77xx / 78xx
5.3 健康检查失败
# 手动检查端口
MSYS_NO_PATHCONV=1 docker exec workpod-alpine netstat -tlnp
# 应看到:
# tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN sshd
# tcp 0 0 0.0.0.0:7681 0.0.0.0:* LISTEN ttyd
# 如果 sshd/ttyd 未运行,查看进程
MSYS_NO_PATHCONV=1 docker exec workpod-alpine ps aux
5.4 内存不足
# 查看内存使用
docker stats --no-stream
# 当前限制:每个实例 4GB 上限 / 1GB 预留
# 如需调整,编辑对应 docker-compose.yml 的 deploy.resources.limits.memory
5.5 PATH 环境变量丢失
entrypoint.sh 启动时会自动检测工具链并写入 /etc/profile.d/dev-tools.sh。如果 docker exec 中找不到命令:
# 使用 login shell (-lc) 加载完整环境
MSYS_NO_PATHCONV=1 docker exec -it workpod-alpine bash -lc 'java -version'
# 或手动 source
MSYS_NO_PATHCONV=1 docker exec -it workpod-alpine bash -c 'source /etc/profile && java -version'
6. 清理维护
6.1 日常清理命令
# 清理悬空镜像(已停止容器的孤立层)
docker image prune -f
# 清理未使用的镜像(除运行中容器外的所有未标记镜像)
docker image prune -a -f # ⚠️ 会删除未运行的镜像
# 清理停止的容器
docker container prune -f
# 清理未使用的网络
docker network prune -f
# 全面清理(悬停资源 + 停止容器 + 未使用网络 + 构建缓存)
docker system prune -f
# 深度清理(包含未使用的镜像)⚠️ 慎用
docker system prune -a -f
6.2 日志清理
# 手动清空某容器日志(不重启)
truncate -s 0 $(docker inspect --format='{{.LogPath}}' workpod-alpine)
# 或设置全局日志限制(需编辑 daemon.json)
# /etc/docker/daemon.json:
# { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }
6.3 废弃资源清理记录
| 时间 | 操作 | 释放空间 |
|---|---|---|
| 2026-04-07 | docker image prune -f |
802.8MB (28个悬空层) |
待清理:
workpod:latest(2.6GB) — 旧 Ubuntu 版基础镜像dev-box:latest(2.79GB) — 旧开发箱镜像workpod-alpine:size-test(436MB) — 大小测试镜像
# 清理上述废弃镜像(确认无容器引用后)
docker rmi workpod:latest dev-box:latest workpod-alpine:size-test
# 预计释放 ~5.8GB
7. 远程服务器部署
7.1 服务器信息
| 项目 | 值 |
|---|---|
| 服务器 IP | 39.99.243.191 |
| SSH 别名 | flux_dev |
| 部署路径 | /opt/workpod/ |
7.2 远程实例
| 实例 | SSH 端口 | Web 端口 | 域名 |
|---|---|---|---|
| workpod-1 | 2221 | 7681 | wk.1216.top |
| workpod-alpine | 2222 | 7683 | wk2.1216.top |
| workpod-ada | 2224 | 7685 | ada.1216.top |
| workpod-yxl | 2226 | 7686 | yxl.1216.top |
7.3 远程运维命令
# 通过 ssh-proxy 操作远程服务器
ssh-proxy exec -n flux_dev -c "docker ps --format 'table {{.Names}}\t{{.Status}}'"
ssh-proxy exec -n flux_dev -c "docker logs --tail 30 workpod-1"
ssh-proxy exec -n flux_dev -c "docker system prune -f"
8. 安全备忘
| 项目 | 当前配置 | 风险等级 | 建议 |
|---|---|---|---|
| privileged 模式 | 仅基础实例开启 | 高 | 确认是否必需,否则移除 |
| root 用户运行 | 全部实例 | 中 | 开发环境可接受 |
| SSH 密码登录 | PermitRootLogin yes | 内网可接受 | 生产环境禁用 |
| ttyd 认证 | Basic Auth (jc:1234567) | 低-内网 | 可配置强密码 |
| API Key 传递 | docker-compose env | 低 | 不写入文件系统 |
| JDK/Maven 挂载 | ro 只读 | 低 | 安全做法 |
9. 目录结构速查
E:/wk-lab/workpod/
├── Dockerfile # 基础镜像构建 (多阶段)
├── Dockerfile.flux # Flux 扩展镜像
├── entrypoint.sh # 容器入口脚本
├── ttyd-session.sh # tmux 会话管理
├── auth-proxy.js # 认证代理 (可选)
├── wk.1216.conf # Nginx 反向代理配置
├── SPECS.md # 技术规格文档
├── instances/ # ★ 实例中心
│ ├── .template/ # 实例模板
│ ├── registry.yaml # 实例注册表
│ ├── base/docker-compose.yml # 基础实例
│ ├── flux/docker-compose.yml # Flux 实例
│ └── test/docker-compose.yml # 测试实例
├── docs/ # 文档
│ ├── 00-规范/
│ ├── 01-架构/
│ ├── 02-技术文档/
│ ├── 03-运维/ # ← 本文档
│ └── 04-审核/
├── config/ # 配置模板
├── static/ # auth-proxy 静态页
├── data/ # 运行时数据
│ ├── workspace/ # 基础实例工作区
│ └── home/ # 用户 home 目录
└── _archive/ # 历史版本归档
附录:常用命令速查卡
# ════════════ 构建 ════════════
docker build -t workpod-alpine:latest .
docker build -t ws-flux-dev:latest -f Dockerfile.flux .
# ════════════ 启停 ════════════
docker compose -f instances/base/docker-compose.yml up -d
docker compose -f instances/flux/docker-compose.yml up -d
docker compose -f instances/base/docker-compose.yml down
# ════════════ 查看 ════════════
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
docker stats --no-stream
docker logs -f workpod-alpine
# ════════════ 进入 ════════════
MSYS_NO_PATHCONV=1 docker exec -it workpod-alpine bash
ssh root@localhost -p 2222 # workpod123
# http://localhost:7681 # jc / 1234567
# ════════════ 清理 ════════════
docker image prune -f # 悬空镜像
docker system prune -f # 全面清理
docker rmi <image> # 删除指定镜像
# ════════════ 远程 ════════════
ssh-proxy exec -n flux_dev -c "docker ps"