基于 Go 1.26 + Vue 3 + TypeScript 构建的 Docker 运行时管理平台,提供直观的 Web 界面来管理 Docker 容器、Compose 项目、镜像、Swarm 集群、存储卷和网络等资源。
- 多 Endpoint 管理:支持同时管理多个 Docker 实例,支持 Unix Socket 和 TCP(含 TLS)连接方式
- 容器全生命周期管理:创建、启动、停止、删除、日志查看、WebSocket 终端、文件管理
- Compose 项目编排:项目 CRUD、一键 up/down、远程 YAML 拉取,基于 Docker SDK 直接操作(无需宿主机安装 docker-compose)
- 镜像与仓库管理:镜像拉取/推送/打标签、多仓库配置(Docker Hub / Harbor)
- Swarm 集群管理:集群初始化/加入/离开、节点管理、服务编排与扩缩容
- 存储与网络管理:卷和网络的创建/删除/清理、卷文件浏览器
- 完善的安全体系:RBAC 三级角色、2FA(TOTP)、Passkey、审计日志
- 响应式设计:支持桌面端与移动端访问,自动适配屏幕尺寸
| 层级 | 技术 |
|---|---|
| 后端 | Go 1.26、Gin、GORM、MySQL/SQLite、Docker SDK |
| 前端 | Vue 3、TypeScript、Vite、Pinia、Element Plus |
| 部署 | Docker Compose(单容器 App,MySQL 可选 profile) |
.
├── backend
│ ├── cmd/server # 后端入口
│ ├── internal # 业务代码(handler/service/repo/model 等)
│ ├── migrations # 数据库迁移脚本(按版本递增)
│ ├── configs # 配置文件(example/docker/local)
│ └── scripts/init.sql # 手工初始化脚本(可选)
├── web
│ ├── src/views # 页面
│ ├── src/components # 组件
│ ├── src/api # 前端 API 封装
│ └── src/store # Pinia 状态管理
└── docker-compose.yml # 本地一键启动
首页
容器管理
Compose
镜像管理
├── 镜像管理
└── 仓库
集群(Swarm)管理
├── 节点管理
└── 服务管理
存储 & 网络
├── 存储管理
└── 网络管理
系统管理
├── Docker 服务端管理
├── 用户管理
├── 审计日志
├── 安全设置
└── 系统设置
- Docker 和 Docker Compose 已安装可用
- 宿主机可访问 Docker Socket(默认
/var/run/docker.sock) - 本地开发(非容器)需要:Go
1.26.0、Node.js>= 18(可选 MySQL8.x,也可直接使用 SQLite)
# 克隆项目
git clone <仓库地址>
cd docker-manager-ui
# 一键启动(默认不启动 MySQL)
docker compose up -d --build
# 如需同时启动 MySQL(可选)
docker compose --profile mysql up -d --build启动后的访问地址:
| 服务 | 地址 | 说明 |
|---|---|---|
| 统一入口 | http://localhost:8080 | 前后端合并后的单入口(推荐访问) |
| 后端 API | http://localhost:8080/api/v1 | API 前缀 |
| MySQL | localhost:3306(仅 mysql profile 时) |
用户 root,密码 root,库 docker_manager |
Compose 默认会为应用挂载数据卷到 /app/docker-manager-ui/data,用于持久化:
- 初始化生成的配置文件(
config.yaml) - 初始化管理员种子文件(一次性,使用后自动清理)
- SQLite 数据库文件(当数据库类型选择
sqlite时)
停止服务:
docker compose down首次启动访问任意页面会自动跳转到 /init 初始化页。在该页面需完成:
- 数据库类型选择(MySQL / SQLite)
- 数据库连接信息填写(MySQL)或 SQLite 文件名填写
- JWT、Passkey 等基础安全配置
- 初始化管理员账号信息
提交后系统会自动写入 /app/docker-manager-ui/data/config.yaml 并自动重启服务。
如果初始化时选择 MySQL,请确保使用 --profile mysql 启动,并在初始化页将 MySQL 主机填写为 docker-manager-mysql(默认)。
适用于需要调试或二次开发的场景。
# 1. 准备后端配置(首次)
cd backend
cp configs/config.example.yaml configs/config.local.yaml
# 2. 选择数据库模式
# A. MySQL 模式:database.type=mysql,并填写 mysql.dsn(后端启动时会自动建库)
# B. SQLite 模式:database.type=sqlite,默认会在项目根创建 docker-manager-ui.sqlite3
# 3. 启动后端
go run ./cmd/server
# 4. 启动前端(新终端窗口)
cd web
npm install
npm run dev提示:后端启动时会自动完成数据库初始化: 首次按 ORM 模型自动建表并写入基线版本,后续自动执行
backend/migrations下新增的增量 SQL。backend/scripts/init.sql仅用于极端场景下的手工建库,不是运行时必需步骤。
Vite 开发服务器将
/api请求(含 WebSocket)代理到http://localhost:8080,前后端可独立启动,前端直接访问localhost:5173即可调通 API。
默认建议管理员用户名为 admin,但首次部署请在 /init 页面自行设置管理员密码与邮箱。
初始化完成后,后端会使用该信息创建首个管理员账号。
- 打开浏览器访问
http://localhost:8080(Docker)或http://localhost:5173(本地开发) - 输入用户名和密码
- 点击「登录」按钮
- 如果管理员启用了强制安全设置,首次登录后需前往个人中心完成 2FA 或 Passkey 的绑定
系统支持基于 TOTP 的两步验证:
- 前往 个人中心 页面
- 在两步验证区域点击「绑定」
- 使用 Google Authenticator、Microsoft Authenticator 等应用扫描二维码
- 输入应用上显示的 6 位验证码完成绑定
- 绑定后每次登录都需要输入验证码
系统支持 WebAuthn/Passkey 无密码登录:
- 前往 个人中心 页面
- 在 Passkey 区域点击「注册通行密钥」
- 按照浏览器提示完成生物识别或安全密钥验证
- 注册成功后可在登录页使用 Passkey 直接登录
页面右上角提供主题切换按钮,支持三种模式:
- 浅色模式:明亮的界面风格
- 深色模式:暗色的界面风格
- 跟随系统:自动跟随操作系统的主题设置
登录后默认进入首页仪表盘,展示当前选中 Endpoint 的 Docker 运行时概览:
- 资源统计:容器、镜像、卷、网络等资源数量
- 容器状态分布:运行中 / 已停止 / 其他状态的容器占比
- 系统信息:Docker 版本、操作系统、内核版本等
切换 Docker Endpoint:点击页面顶部的 Endpoint 下拉选择器,选择目标 Docker 实例,切换后页面数据自动刷新。
路径:侧栏菜单 → 容器管理
- 支持按容器名称搜索
- 支持按状态(运行中/已停止/全部)筛选
- 每个容器卡片显示:名称、镜像、状态、端口映射、创建时间
- 操作按钮:启动、停止、重启、删除
点击页面右上角「创建容器」按钮,支持两种创建方式:
参数化创建 — 通过表单逐项填写:
| 配置区域 | 可配置项 |
|---|---|
| 基础配置 | 容器名称、镜像、重启策略 |
| 端口映射 | 宿主机端口 ↔ 容器端口 |
| 卷挂载 | 本地路径/命名卷 → 容器路径、读写模式 |
| 环境变量 | KEY=VALUE 键值对 |
| 网络配置 | 选择已有网络或使用默认网络 |
| 高级设置 | 资源限制(CPU/内存)、命令覆盖、入口点等 |
原始命令创建 — 直接粘贴 docker run 命令,系统自动解析为容器配置并创建。
点击容器名称进入详情页,包含以下标签页:
- 概览:基础信息(ID、镜像、状态、IP)、端口映射、挂载点、环境变量
- 日志:实时查看标准输出/错误输出,支持时间范围筛选和搜索
- 终端:通过 WebSocket 连接容器内部终端(
/bin/sh或/bin/bash),支持终端大小自适应 - 文件管理:浏览容器内文件系统,支持文件上传、下载、删除
删除的容器进入回收站,默认保留 7 天,保留期内可恢复,超期自动永久删除。
路径:侧栏菜单 → Compose
展示当前 Endpoint 下的所有 Compose 项目(名称、状态、容器数量),支持一键 up / down / 重启。
- 编辑器模式:直接在内置 YAML 编辑器中编写
docker-compose.yml - 远程拉取:输入远程 YAML 文件的 URL,系统自动拉取内容
Compose 功能通过 Docker SDK 直接与 Docker Engine API 交互,无需宿主机安装
docker-compose或docker compose插件,适用于 distroless 等精简容器环境。
查看和编辑 YAML 配置、查看项目下所有容器状态、执行 up / down / restart 操作。
与容器回收站类似,删除的 Compose 项目进入回收站,默认保留 7 天。
路径:侧栏菜单 → 镜像管理 → 镜像管理
展示当前 Endpoint 下的所有本地镜像(名称/标签、大小、创建时间)。
支持的操作:
- 拉取镜像:输入镜像名称和标签(如
nginx:latest),从配置的仓库拉取 - 删除镜像:移除本地镜像
- 打标签:为已有镜像添加新的标签名
- 推送镜像:将本地镜像推送到指定仓库
点击镜像名称可查看该镜像的所有标签及版本信息。
路径:侧栏菜单 → 镜像管理 → 仓库
- 支持 Docker Hub 和 Harbor 类型
- Docker Hub 支持配置代理地址(国内加速镜像)
- 可配置仓库地址、认证凭据
- 拉取镜像时可选择从指定仓库拉取
路径:侧栏菜单 → 集群(Swarm)管理
Swarm 服务管理菜单仅在当前节点角色为 Manager 时显示。
路径:集群(Swarm)管理 → 节点管理
- 初始化集群:点击「初始化集群」按钮,配置监听地址,完成后当前节点成为 Manager
- 加入集群:输入 Manager 节点的加入令牌和地址,选择角色(Manager / Worker)
- 节点列表:查看所有节点的角色、状态(Ready / Down)、可用性,支持移除离线节点
- 离开集群:当前节点退出 Swarm 集群
路径:集群(Swarm)管理 → 服务管理
服务列表:展示集群中所有服务的名称、镜像、副本数、更新状态。
创建服务:
| 配置区域 | 可配置项 |
|---|---|
| 基础配置 | 服务名称、镜像、副本数 |
| 端口映射 | 发布端口、目标端口、协议(TCP/UDP) |
| 卷挂载 | 挂载源、目标路径、读写模式 |
| 环境变量 | KEY=VALUE 键值对 |
| 网络配置 | 选择 Overlay 网络 |
| 更新策略 | 并发更新数、更新延迟、失败处理策略 |
| 资源限制 | CPU 和内存限制/预留 |
| 调度约束 | 节点标签约束、放置偏好 |
其他操作:
- 编辑服务:修改配置并触发滚动更新
- 扩缩容:调整副本数量,集群自动调度
- 暂停/恢复:暂停将副本缩至 0 但保留定义,恢复时恢复到暂停前的副本数
- 导出 YAML:将服务配置导出为 YAML 格式
- 失败实例清理:清理服务中失败或已退出的容器实例
路径:侧栏菜单 → 存储 & 网络 → 存储管理
- 卷列表:展示所有存储卷(名称、驱动、挂载点、创建时间)
- 创建卷:输入卷名称,选择驱动类型(默认
local),可选配置驱动参数 - 卷文件浏览器:以树形结构浏览卷内文件,支持文件预览、上传和下载
- 清理未使用的卷:一键删除所有未被任何容器使用的卷
路径:侧栏菜单 → 存储 & 网络 → 网络管理
- 网络列表:展示所有 Docker 网络(名称、驱动类型、子网、网关、关联容器数)
- 创建网络:选择驱动(bridge / overlay / macvlan 等),可选配置子网和网关
- 删除网络:系统默认网络(bridge、host、none)不可删除
- 清理未使用的网络:一键删除所有未被任何容器使用的自定义网络
路径:侧栏菜单 → 系统管理
管理系统连接的 Docker 实例:
- 添加 Endpoint:
- Unix Socket:填写 Socket 路径(如
/var/run/docker.sock) - TCP:填写主机地址和端口(如
tcp://192.168.1.100:2376) - TCP + TLS 需上传 CA 证书、客户端证书和客户端密钥
- 测试连接确认可用后保存
- Unix Socket:填写 Socket 路径(如
- 编辑/删除:修改配置或移除 Endpoint(默认 Endpoint 不可删除)
- 用户 CRUD:创建用户、分配角色(admin / operator / viewer)
- 重置密码、启用/禁用用户账号
记录系统中所有关键操作,支持按时间范围、操作人、操作类型等条件筛选,支持分页浏览。
系统级安全策略配置(仅 admin 可操作):
- 强制两步验证:启用后所有用户必须绑定 TOTP
- 强制 Passkey:启用后所有用户必须注册通行密钥
- 安全策略启用后,未完成绑定的用户登录后会被引导至个人中心完成设置
站点级别的系统配置:站点名称与 Logo、ICP 备案信息、版权声明文字。
系统采用 RBAC(基于角色的访问控制)模型,内置三种角色:
- admin(系统管理员):拥有全部权限,可管理用户、Endpoint 与安全策略
- operator(运维角色):面向日常运维,可操作容器、Compose、镜像、集群与存储网络,不可管理用户与安全策略
- viewer(只读角色):仅可查看资源与状态,不允许执行创建、修改、删除等写操作
| 功能 | admin | operator | viewer |
|---|---|---|---|
| 仪表盘 | ✓ | ✓ | ✓ |
| 容器读取 | ✓ | ✓ | ✓ |
| 容器操作 | ✓ | ✓ | ✗ |
| Compose 读取 | ✓ | ✓ | ✓ |
| Compose 操作 | ✓ | ✓ | ✗ |
| 镜像读取 | ✓ | ✓ | ✓ |
| 镜像操作 | ✓ | ✓ | ✗ |
| Swarm 读取 | ✓ | ✓ | ✓ |
| Swarm 操作 | ✓ | ✓ | ✗ |
| 存储网络读取 | ✓ | ✓ | ✓ |
| 存储网络操作 | ✓ | ✓ | ✗ |
| Endpoint管理 | ✓ | ✓ | ✗ |
| 用户管理 | ✓ | ✗ | ✗ |
| 安全设置 | ✓ | ✗ | ✗ |
| 审计日志 | ✓ | ✗ | ✗ |
| 系统设置 | ✓ | ✗ | ✗ |
# 全栈(Docker Compose)
docker compose up -d --build
docker compose down
# 多架构镜像构建并推送(交互式)
./build_and_push_image
# 后端
cd backend
go run ./cmd/server # 本地运行
go run ./cmd/server -config configs/config.local.yaml # 指定配置
go test ./... # 运行全部测试
go test ./internal/docker/ -run TestHostNormalizer # 运行单个测试
gofmt -w . # 格式化(提交前必须执行)
# 前端
cd web
npm install
npm run dev # 开发服务器 http://localhost:5173
npm run build # 类型检查(vue-tsc --noEmit)+ Vite 构建在项目根目录执行:
./build_and_push_image脚本会交互式要求输入:
- 目标 CPU 架构(枚举,可单选或多选)
- 仓库地址(仅 registry,例如
ghcr.io;留空默认 Docker Hub) - 镜像仓库名(可包含命名空间)
- 镜像 Tag
说明:脚本固定执行推送(
docker buildx build --push)。当前枚举支持linux/amd64、linux/arm64;Dockerfile会按目标平台编译 Go 二进制,避免不同 CPU 架构镜像内二进制不匹配。
| 配置文件 | 用途 |
|---|---|
backend/configs/config.local.yaml |
本地开发配置(可按团队约定提交) |
backend/configs/config.example.yaml |
示例模板(已提交) |
data/config.yaml |
初始化流程生成的运行时配置(由容器挂载卷持久化) |
关键配置项:
| 配置项 | 说明 | 示例值 |
|---|---|---|
database.type |
数据库类型(mysql/sqlite) |
mysql |
mysql.dsn |
MySQL 连接串(MySQL 模式生效) | root:root@tcp(127.0.0.1:3306)/docker_manager?charset=utf8mb4&parseTime=True&loc=Local |
sqlite.path |
SQLite 文件路径(SQLite 模式生效) | docker-manager-ui.sqlite3(在项目根目录创建) |
jwt.access_secret |
访问令牌密钥 | 替换为强随机字符串 |
jwt.refresh_secret |
刷新令牌密钥 | 替换为强随机字符串 |
jwt.access_ttl_min |
访问令牌有效期(分钟) | 180 |
jwt.refresh_ttl_hour |
刷新令牌有效期(小时) | 24(1 天) |
security.passkey_rp_id |
Passkey RP ID | localhost |
security.passkey_rp_origin |
Passkey RP Origin | http://localhost:5173 |
server.port |
后端监听端口 | 8080 |
安全提示:示例配置中的 JWT 密钥仅用于演示,生产环境务必替换为强随机值。
原因:WebSocket 连接可能被代理拦截。
解决方案:
- 确保反向代理(如 Nginx)已正确配置 WebSocket 转发
- 检查浏览器是否允许 WebSocket 连接
- 确认后端服务正常运行且端口可达
说明:Compose 功能通过 Docker SDK(github.com/docker/docker)直接调用 Docker Engine API,自行解析 docker-compose.yml 并按 depends_on 拓扑排序依次创建网络、卷和容器。
优势:
- 无需宿主机安装
docker-compose或docker compose插件 - 适用于 distroless、Alpine 等精简容器环境
- 通过 Docker Engine API 远程操作,支持多 Endpoint 场景
当前支持的 Compose 特性:
- services(image、ports、volumes、environment、depends_on、networks、restart、labels 等常用字段)
- networks(driver、ipam、external)
- volumes(driver、external)
- depends_on 拓扑排序启动
暂不支持:
build(需在本地构建镜像后使用 image 引用)extends、profiles、configs、secrets等高级特性
解决方案:
- 等待页面自动刷新,或手动刷新页面
- 检查目标 Endpoint 连接是否正常(前往系统管理 → Docker 服务端管理检查状态)
原因:管理员启用了强制两步验证策略,但用户尚未绑定 TOTP。
解决方案:
- 登录后系统会自动跳转到个人中心
- 按照页面提示完成 TOTP 绑定后即可正常使用
解决方案:
- 确认目标 Docker Daemon 已开启 TCP 监听
- 如果启用了 TLS,确保上传了正确的 CA 证书、客户端证书和密钥
- 检查网络连通性和防火墙规则
- Docker Daemon 配置参考:
/etc/docker/daemon.json
- JWT 密钥:务必替换默认的 JWT 签名密钥为强随机值
- 默认密码:首次登录后立即修改 admin 默认密码
- Docker Socket:确保后端容器挂载了宿主机的 Docker Socket
- TLS 加密:建议使用 HTTPS 和 TLS 保护前端和 API 通信
- 数据库备份:MySQL 模式定期备份数据库;SQLite 模式定期备份数据库文件
- Passkey 配置:生产环境需正确配置
passkey_rp_id和passkey_rp_origin与实际域名一致
- 后端需要访问宿主机 Docker:请确保挂载
/var/run/docker.sock。 - 业务接口默认从请求头
X-Docker-Endpoint-Id读取目标 Endpoint(也支持部分接口通过参数传入)。 - Compose 功能基于 Docker SDK 实现,无需宿主机安装 docker-compose 二进制,可在 distroless 容器中正常运行。
- 示例配置中的 JWT 密钥仅用于演示,生产环境务必替换为强随机值。
- Passkey 当前为基础接入流程,生产建议补齐完整 WebAuthn 验签链路。
本项目使用 MIT License 开源,允许个人和企业在保留原始版权与许可声明的前提下自由使用、修改、分发和再发布。
- linux.do:面向开发者与技术爱好者的开源技术社区,涵盖 Linux、容器、服务器、开发工具、AI 与效率工作流等话题,适合交流实践经验与获取一线使用反馈。