飞牛里运行的docker服务越来越多,端口记不住服务管理麻烦怎么办?再装一个网页面板Dockge管 compose,比每次 SSH 敲命令省事。但是Dockge 只认自己目录里的项目。列表里看得见旧容器,不能直接接管docker服务。
安装Dockge「导入」原有docker服务后,点更新,相对路径会全部指到空目录。Vaultwarden 报证书找不到;同一套导入方式下,Immich、小雅这类 ./data 也会丢目录,或在空文件夹里写出一份新空库。不是某一个服务特殊。
先看结论
- Dockge 适合在网页里改
compose.yaml、启停、看日志。它不是 Portainer,不管 Swarm。 - 旧服务要整份项目搬进
stacks/<名字>/,让这个目录里同时有 compose 和data、ssl这些相对路径指向的东西。 - 不要用符号链接,也不要把原目录再 bind 进一个空的
stacks/<名字>。面板里能看见文件,更新却在宿主机空目录上跑。 - 「更新」不是定时自动升级,需要当场拉镜像并重建。密码库、相册不要追
latest。不要点删除。 - 最大风险:更新写到空目录,旧库还在原地,新容器对着空数据启动。
Dockge 干什么
Uptime Kuma 同一作者。一个栈就是一份 compose:编辑、启动、停止、日志、更新。官方说明它是 stack-oriented 的 compose 管理器。
| 适合 | 不适合 |
|---|---|
| 飞牛上以后新加服务,丢一份 yaml 就能起 | 替代飞牛应用中心去拆官方套件 |
| 改端口、看某个容器日志 | 管没有 compose 的单个 docker run |
| 把已经用手写 compose 拉起的栈收回网页 | 开公网给外人点启停 |
它挂 docker.sock,等于能管这台机上所有容器。只局域网或 Tailscale 打开,不要映射公网。
开始前要准备什么
| 项目 | 要求 | 怎么确认 |
|---|---|---|
| 系统 | 飞牛,Docker 已能跑 | docker ps 有输出 |
| 磁盘 | 程序和栈放固态,例如 /vol2/1000/Docker | 目录在固态卷上;1000 换成你的用户目录 |
| 已有栈 | 知道每个项目的目录和 compose 文件名 | find /vol2/1000 -name 'docker-compose.yml' -o -name 'compose.yaml' |
| 备份 | 更新前复制整份项目目录 | 至少拷走 data/、证书目录、.env |
| 权限 | SSH 能操作 Docker | 网页能开还不够,搬家要在宿主机上做 |
端口本机用的是官方默认 5001。先确认没被占用:
ss -lnt | grep 5001 || echo "5001 free"
操作步骤
1. 按官方结构安装
为什么做: 左右两边的 stacks 路径必须是同一条绝对路径。官方 compose 生成器写明:相对路径会写到错误位置。
本机飞牛 Docker Hub 被墙,镜像经 docker.1ms.run 拉完再 tag。目录不要放机械盘。
mkdir -p /vol2/1000/Docker/dockge/data /vol2/1000/Docker/stacks
/vol2/1000/Docker/dockge/docker-compose.yml:
services:
dockge:
image: louislam/dockge:1
container_name: dockge
restart: unless-stopped
ports:
- "5001:5001"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /vol2/1000/Docker/dockge/data:/app/data
- /vol2/1000/Docker/stacks:/vol2/1000/Docker/stacks
environment:
- DOCKGE_STACKS_DIR=/vol2/1000/Docker/stacks
dns:
- 192.168.50.1
- 223.5.5.5
docker pull docker.1ms.run/louislam/dockge:1
docker tag docker.1ms.run/louislam/dockge:1 louislam/dockge:1
cd /vol2/1000/Docker/dockge && docker compose up -d
curl -sS -o /dev/null -w "%{http_code}\n" http://127.0.0.1:5001/
正常结果: 返回 200。浏览器打开 http://NAS的局域网IP:5001,第一次是创建管理员。
失败时先查: 5001 是否被占;docker logs dockge。Dockge 自己的 compose 不要放进 stacks,避免它管自己。

2. 先看清「不由 Dockge 管理」是什么意思
为什么做: 装上就能在列表里看到旧容器,是因为它挂了 docker.sock。官方 FAQ:要管理已有栈,必须把 compose 放到 stacks 目录。
Dockge 认的是:
/vol2/1000/Docker/stacks/<栈名>/compose.yaml
<栈名> 最好和 compose 里的 name:、原来的 project 名一致。文件名是 docker-compose.yml 时,在同一目录加一条指向它的 compose.yaml 即可。
正常结果: 还没搬家时,旧栈是灰的,点进去写「这个堆栈不由 Dockge 管理」。这是预期,不是面板坏了。
3. 整份项目搬进 stacks,不要只挂进去
为什么做: Dockge 在宿主机上对 stacks/<名> 执行 docker compose。./data、./ssl 相对的是这条宿主机路径,不是你在容器里看见的那份文件。
本机先试过符号链接,再试过把原目录 bind 进空的 stacks/<名>。面板里能打开编辑器,点更新就翻车。

搬家前先看容器还在不在跑,记下每个栈的真实目录。下面用本机四个栈做例子,路径按你的改:
# 先停 Dockge,避免它占着空的 stacks 子目录
cd /vol2/1000/Docker/dockge && docker compose stop
# 整份挪进去。名字用原来的 compose project 名
mv /vol2/1000/Docker/immich /vol2/1000/Docker/stacks/immich
mv /vol2/1000/Docker/daidai /vol2/1000/Docker/stacks/daidai-panel
mv /vol2/1000/vaultwarden /vol2/1000/Docker/stacks/vaultwarden
mv /vol2/1000/xiaoya /vol2/1000/Docker/stacks/xiaoya-tvbox-only
每个目录里如果还没有 compose.yaml:
ln -s docker-compose.yml /vol2/1000/Docker/stacks/vaultwarden/compose.yaml
compose 或 .env 里若写死了旧绝对路径,改成相对路径或新绝对路径。本机 Immich 的照片库、缩略图、呆呆的数据目录都改过,否则更新仍去找旧位置。
然后从新目录把栈拉起来,再开 Dockge:
cd /vol2/1000/Docker/stacks/vaultwarden && docker compose up -d
cd /vol2/1000/Docker/stacks/immich && docker compose up -d
cd /vol2/1000/Docker/stacks/daidai-panel && docker compose up -d
cd /vol2/1000/Docker/stacks/xiaoya-tvbox-only && docker compose up -d
cd /vol2/1000/Docker/dockge && docker compose up -d
正常结果: 左边列表是「已启动」,点进去有编辑、重启、停止,不再灰。docker inspect 容器名 里 com.docker.compose.project.working_dir 等于 stacks/<名>。
失败时先查: 是不是只做了 ln -s 或在 Dockge 的 compose 里写了「原目录 → stacks/空文件夹」。那种面板能看、更新必炸。


没有 compose 的单个容器,例如本机百度网盘那个,Dockge 管不了,别硬编一份去套。
4. 看清「更新」在干什么
为什么做: 按钮不像名字那么温和。它是拉镜像再重建,不是后台静默升级。
写死版本号的服务,点了也不会升版本,只是按当前工作目录重建一遍。镜像写成 latest 才会被拉到新版。密码库、相册不要为了省事改成 latest。
正常结果: 重建后原来的网页还能开。相对路径服务查一下挂载仍指向 stacks/<名>/data 这类真目录。
失败时先查: 日志是不是 No such file or directory,宿主机 stacks/<名> 里是不是空的 data/ssl。
导入后一点更新,相对路径全空
本机 Vaultwarden 点了更新,日志还是原来的 1.37.1,却起不来:
error reading TLS file `ssl/fullchain.pem`: No such file or directory (os error 2)
同时在空的 stacks/vaultwarden/data 里出现一份新的小库。真库还在原来的项目目录里。
Immich、小雅当时没点更新,所以没当场挂。它们的 compose 同样是 ./data、./www-data、./thumbs。同一套「只挂进空 stacks」的导入,点更新会走同一条路:宿主机对着空目录重建。
| 服务 | 相对路径在指什么 | 更新后会怎样 |
|---|---|---|
| Vaultwarden | ./ssl、./data | 证书找不到;空目录写出新库 |
| 小雅 | ./data、./alist-data、./www-data | 配置和 token 对不上,或对着空目录启动 |
| Immich | compose / .env 里的库目录 | 指错就扫空库,或找不到上传目录 |
| 呆呆 | 若仍写绝对旧路径 | 更新后挂不到原来的脚本和数据库 |
判断是不是这个问题:
docker inspect 容器名 --format '{{index .Config.Labels "com.docker.compose.project.working_dir"}}'
docker inspect 容器名 --format '{{range .Mounts}}{{.Source}} -> {{.Destination}}{{println}}{{end}}'
ls -la /vol2/1000/Docker/stacks/你的栈名
工作目录已经是 stacks/<名>,但这个目录里没有原来的 data、证书,只有刚生成的空文件夹,就是挂载导入留下的。
处理:停容器,不要用空目录里那份新库。把真项目挪进 stacks/<名>,或改回从真目录 docker compose up -d。本机是整份搬走后再拉起,探活恢复 200。
不要把空目录里的新库拷回真目录覆盖。先看文件大小和修改时间。
常见问题与排错
列表里全是「不由 Dockge 管理」
现象: 旧容器都在,点进去不能编辑。
如何判断: stacks 目录是空的,compose 还在原来的位置。
处理: 按第 3 步整份搬家,不要只在面板里新建一个同名栈。
点更新后容器 Restarting
现象: docker ps 里状态来回重启。
先检查:
docker logs --tail=80 容器名
ls -la "$(docker inspect 容器名 --format '{{index .Config.Labels "com.docker.compose.project.working_dir"}}')"
如何判断: 日志里文件不存在;工作目录下的 data/ssl 是空的或新生成的。
处理: 停掉,用原来的项目目录启动。再按第 3 步搬家。不要继续点更新。
验证: 容器 healthy,原来的网页能开,挂载源路径能 ls 到旧文件。
页面能开,数据像被清空
现象: 服务起来了,库是空的、要重新初始化。
如何判断: stacks/<名>/data 里的库很小、时间是刚点更新的时候;旧目录里还有更大的库。
处理: 立刻停容器,别在空库上继续用。把 compose 指回旧 data,或把旧目录整份搬过来再启动。
飞牛 Docker 应用中心里的套件
现象: 想把飞牛商店装的应用也丢进 Dockge。
如何判断: 没有你自己写的 compose.yaml,目录也不在你规划的 Docker 文件夹里。
处理: 别导入。商店应用继续用飞牛自己的启停。
风险、备份与回滚
- 搬家会短暂停服务。密码库、相册先确认客户端还能用本地缓存,再动手。
- 更新前把整个
stacks/<名>拷一份到别的目录。至少要有data/、证书、.env。 - 不要点删除。 那是按 compose 拆容器。
- 不要给 Dockge 映射公网。谁能打开面板,谁就能停掉你的密码库。
- 回滚:在旧目录执行
docker compose up -d,确认网页和数据恢复,再处理 stacks 里的空目录。
回滚成功的标志:原来的地址能打开,库文件大小和时间对得上搬家前。
维护和更新
- 需要升级时,先改 compose 里的版本号,看过发布说明,再点更新或自己
docker compose pull && docker compose up -d。 - Vaultwarden、Immich 不要开 Watchtower,也不要在 Dockge 里改成
latest。 - 飞牛大升级后复查
docker.sock和 5001 端口。 - 最近核对:2026-08-26。本机 Dockge
louislam/dockge:1,四个栈整份住在/vol2/1000/Docker/stacks。