飞牛里运行的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,避免它管自己。

第一次打开 Dockge,创建管理员
图:本机 2026-08-26。语言可改成简体中文。

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/<名>。面板里能打开编辑器,点更新就翻车。

导入旧服务:挂进去是错的,整份搬走才对
图:左边是本机踩过的做法。右边才是官方「把 compose 放进 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/空文件夹」。那种面板能看、更新必炸。

导入并搬家后的栈列表
图:本机四个栈都在 stacks 里之后。
点进 Immich 可以改 compose
图:已管理的栈能看到容器健康状态和右侧 yaml。

没有 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 对不上,或对着空目录启动
Immichcompose / .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。

参考资料