背景
管理 Docker 容器,大部分时候靠命令行就够了。docker ps、docker logs、docker compose up -d,熟记这几个命令就能应付日常。但容器数量一多,或者要频繁查看日志、重启服务、修改配置,每次 SSH 上去敲命令就变得很烦。
这个时候需要 Docker 管理面板。
Portainer 是同类中最知名的选择(20k+ Star),但它的 CE 版功能有限——OIDC/SSO 要买 Business 版,不支持 Git 仓库部署,也没有漏洞扫描。如果你只需要一个简单面板,Portainer 够用。如果你想要更多,可以看看 Dockhand。
Dockhand 是什么
Dockhand 是一个开源的 Docker 管理面板(BSL 1.1 许可证,个人和内部使用免费),用 Web 界面替代 docker CLI 完成日常操作。开发者是 Finsys,默认端口 3424,部署起来大概 30 秒。
核心功能分几块:

容器管理 — 启动、停止、删除容器,查看进程和环境变量,交互式 Web 终端(不用 SSH),文件浏览器。这些大部分面板都有,没什么特别的。
Compose 堆栈管理 — 这是它的强项。内置可视化 Compose 编辑器,不用手写 YAML;支持从 Git 仓库部署堆栈,配置 Webhook 后 push 即部署;还能从其他容器管理器「收养」已有的 Compose 堆栈。
多环境管理 — 支持本地 Unix Socket 和远程 TCP 连接(TLS 加密)。它还带一个叫 Hawser 的代理组件,可以穿透 NAT/防火墙,不需要暴露 Docker API 端口就能管理远程机器。

安全相关 — OIDC/SSO 免费版就有(Portainer 要 Business 版才给)。支持多因素认证(TOTP)。还有一个实用的功能叫”安全拉取”:新镜像先拉到临时标签,用 Grype/Trivy 扫描 CVE,通过后再覆盖运行容器。
零遥测 — 没有使用跟踪、没有分析、没有后台连接。这一点对注重隐私的人比较重要。

快速部署
Docker CLI(最快)
docker run -d \
--name dockhand \
--restart unless-stopped \
-p 3424:3000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v dockhand_data:/app/data \
fnsys/dockhand:latest
启动后访问 http://你的IP:3424。
Docker Compose(推荐)
大部分人用 Compose 更合适,方便管理:
version: '3.8'
services:
dockhand:
image: fnsys/dockhand:latest
container_name: dockhand
restart: unless-stopped
ports:
- "3424:3000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- dockhand_data:/app/data
volumes:
dockhand_data:
默认用 SQLite 存储数据。如果要上生产环境,建议换成 PostgreSQL:
version: '3.8'
services:
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: dockhand
POSTGRES_PASSWORD: changeme
POSTGRES_DB: dockhand
volumes:
- postgres_data:/var/lib/postgresql/data
dockhand:
image: fnsys/dockhand:latest
ports:
- "3424:3000"
environment:
DATABASE_URL: postgres://dockhand:***@postgres:5432/dockhand
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- dockhand_data:/app/data
depends_on:
- postgres
restart: unless-stopped
volumes:
postgres_data:
dockhand_data:
首次启动
装好之后第一次打开,认证默认是关闭的。需要先去 Settings > Authentication 启用认证,创建管理员用户。这一步很容易忘,我第一次装完直接就能操作,还以为是 Bug,后来发现是设计如此。
踩坑记录
1. Docker Socket 权限
Dockhand 默认以非 root 用户运行。如果直接绑定 /var/run/docker.sock 可能会遇到 permission denied。
解决方案:找到宿主机 docker 组的 GID,然后通过 --group-add 传入。
# 查看宿主机 docker 组的 GID
stat -c '%g' /var/run/docker.sock
在 Compose 文件里加上 group_add 配置:
services:
dockhand:
# ...
group_add:
- "999" # 替换为你的 docker 组 GID
更安全的做法是加一个 Docker Socket Proxy 做中间层,只暴露必要的 API 接口。
2. 认证默认未启用
如前面所说,第一次启动后直接就能访问所有功能,不需要登录。这不是漏洞,是设计——方便本地快速试用。但记得要去 Settings 开启认证。如果你部署在公网上,一定要先做这一步再暴露端口。
3. SQLite 切 PostgreSQL 不能自动迁移
如果用 SQLite 跑了一段时间再想切到 PostgreSQL,Dockhand 不会自动迁移数据。需要全新开始。所以如果一开始就打算长期用,建议直接上 PostgreSQL。
4. 防火墙避坑
Docker 会绕过 UFW,-p 3424:3000 会把端口暴露在 0.0.0.0 上。如果不打算从外网访问,建议绑定到本地地址:
-p 127.0.0.1:3424:3000
然后用反向代理(Traefik、Nginx、Caddy)加认证和 HTTPS。
5. NAS 上的磁盘用量采集
如果容器跑在 NAS 上,Dockhand 的磁盘用量采集(df 命令)在网络存储挂载点多的情况下可能会卡住。设置环境变量 SKIP_DF_COLLECTION=true 可以关掉这个功能。
和其他面板对比
| 功能 | Dockhand(免费版) | Portainer CE | Dockge |
|---|---|---|---|
| Compose 可视化编辑 | ✅ | ✅ | ✅ |
| Git 仓库部署 | ✅ | ❌ | ❌ |
| Webhook 自动同步 | ✅ | ❌ | ❌ |
| 多环境远程管理 | ✅ | ✅ | ❌ |
| OIDC/SSO 免费 | ✅ | ❌(Business) | ❌ |
| 漏洞扫描 | ✅ | ❌ | ❌ |
| 零遥测 | ✅ | ❌ | ✅ |
| 部署复杂度 | 极简(30秒) | 简单 | 简单 |
Dockhand 免费版已经包含了 OIDC/SSO、漏洞扫描、Git 集成、多因素认证。Portainer 要把这些功能凑齐得买 Business 版(每个节点收费)。Dockge 更轻量但功能少很多,不支持远程管理,没有 Web 终端。
总结
Dockhand 适合两类人:一是觉得 Portainer 免费版功能不够用的人,二是想用 Git + Webhook 做自动化部署的人。
它的许可证是 BSL 1.1,个人和内部使用免费,2029 年会转 Apache 2.0,不用担心被锁定。部署也很简单,跑一个容器就行。
如果你是个人用,免费版的功能已经完全够了——无限环境、OIDC/SSO、漏洞扫描、Git 集成全都包含。商用的话可以根据规模选 SMB 或 Enterprise 版。