用 WUD 提醒 Docker 镜像更新

WUD 提醒 Docker 镜像变化。收到提醒后,先看发行说明、保存备份,再逐个更新并测试,不自动重建全部服务。

更新于 2026-10-13

想知道 VPS 上的容器镜像是否更新,又不想让监控工具自动重建应用,可以先用 WUD 做提醒。下面的配置固定为 WUD 9.4.1,管理界面只监听本机,Docker API 经过只读代理,状态保存在独立数据卷。出现新标签后,仍要阅读发行说明、备份和测试,不必立即更新全部容器。

接入前先确定它能控制什么

这份示例按普通 Linux rootful Docker 的 /var/run/docker.sock 路径配置。Rootless Docker 的 socket 路径、宿主机安全策略和权限可能不同,先核对实际环境,不要用放开 socket 权限或给所有容器加 privileged 来解决连接错误。

在独立目录保存 compose.yaml。示例使用项目名 wud;服务器已有同名项目或 WUD 数据卷时,先保存现有配置并核对卷,不要覆盖配置或执行下文的新卷初始化。代理没有对宿主机发布端口,只连接内部 monitor 网络;WUD 另接 egress 网络访问镜像仓库。挂载 socket 的 :ro 只限制文件挂载,不会把 Docker API 自动变成只读。这里真正拒绝写操作的是代理的 POST=0 和关闭的 ALLOW_* 开关。

name: wud
services:
  socket-proxy:
    image: tecnativa/docker-socket-proxy@sha256:1f5038b54f06c3e18422902cf00ba21803d1c97805aae032e5e6673d532d3459
    restart: unless-stopped
    environment:
      CONTAINERS: "1"
      IMAGES: "1"
      INFO: "1"
      VERSION: "1"
      EVENTS: "1"
      PING: "1"
      POST: "0"
      BUILD: "0"
      COMMIT: "0"
      EXEC: "0"
      AUTH: "0"
      SECRETS: "0"
      SYSTEM: "0"
      SWARM: "0"
      ALLOW_START: "0"
      ALLOW_STOP: "0"
      ALLOW_RESTARTS: "0"
      ALLOW_PAUSE: "0"
      ALLOW_UNPAUSE: "0"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - monitor
  wud:
    image: getwud/wud:9.4.1
    user: "1000:1000"
    restart: unless-stopped
    environment:
      WUD_AUTH_ADMIN_USER: ${WUD_ADMIN_USER:?填写管理用户名}
      WUD_AUTH_ADMIN_PASSWORD: ${WUD_ADMIN_PASSWORD:?填写独立强密码}
      WUD_STORE_PATH: /store
      WUD_WATCHER_LOCAL_HOST: socket-proxy
      WUD_WATCHER_LOCAL_PORT: "2375"
      WUD_WATCHER_LOCAL_WATCHBYDEFAULT: "false"
    ports:
      - "127.0.0.1:3000:3000"
    volumes:
      - wud-data:/store
    networks:
      - monitor
      - egress
volumes:
  wud-data:
networks:
  monitor:
    internal: true
  egress:

在同目录的 .env 中填写 WUD_ADMIN_USER 和 WUD_ADMIN_PASSWORD,把文件权限设为 0600,不要提交到公开仓库。示例让 WUD 以 UID/GID 1000:1000 运行,因此新建数据卷的 /store 必须先有对应的写权限。仅在确认这是新建的 WUD 数据卷后初始化:

chmod 600 .env
docker compose config --quiet
docker compose run --rm --no-deps --user 0:0 --entrypoint sh wud -c 'chown 1000:1000 /store && chmod 700 /store'
docker compose up -d
docker compose ps

这里挂的是 /store,同时显式设置 WUD_STORE_PATH=/store,避免挂了一个目录,数据库却写在另一个地方。9.4.1 的状态文件是这个目录中的 wud.sqlite。管理账号环境变量会在启动时确保该账号并更新其凭据,不能把它们当成只在第一次启动时生效的变量。

WATCHBYDEFAULT=false 表示不默认观察所有容器。在需要观察的服务上添加 wud.watch: "true" 标签,再按该服务自己的流程重建;添加标签也可能重建容器,先确认备份与停机条件。不要为了给监控加标签,一次重建全部应用。

界面入口是服务器本机的 http://127.0.0.1:3000,远程查看走既有 SSH 隧道或受控管理网络。不要把代理的 Docker API 端口直接开放到公网。只读 API 仍能读取容器信息,代理网络也只应接入可信的管理组件。此配置没有设置重建业务容器的自动更新触发器;仓库需要认证时,另为对应仓库配置必要范围的凭据,不交出个人全权限令牌。

仓库访问失败,不代表已经是最新版

核对实际容器、当前标签和仓库。先确认 WUD 能看到预期的容器,再看它是否成功查询仓库;容器卡片出现,不等于远端版本已经查询成功。网络错误、权限错误与“没有新版本”是不同结果,页面空白或仓库不可访问,不能解释成所有服务已经最新。

日期标签、主版本标签、完整版本和摘要有不同维护含义。一个更长的字符串不一定是更高版本;对照项目真实的命名和发行方式判断。

提醒后,到目标应用目录操作

先记录现状:

docker compose images
docker compose ps

这些命令在准备更新的应用目录执行。读新版本是否迁移数据库、改配置、要求中间版本,保存 Compose、环境文件、旧镜像标识与一致数据副本,再按该应用的流程拉取和重建。

一次更新一个服务,检查页面、登录、上传和后台任务。旧镜像还在,不代表它可以读取已经迁移过的新数据库;回退可能还需要升级前数据。

WUD 的备份不包括所有业务

保存 WUD 的 compose.yaml、.env、仓库凭据和 wud-data 数据卷。复制 SQLite 数据前先正常停止 WUD,保存整个状态目录,不只挑一个正在写入的数据库文件。恢复时沿用同一个数据卷和对应写权限,再检查原观察目标与管理账号是否仍可用。

重建 WUD 容器和删除 WUD 数据卷是两回事。保留数据卷时,状态不应只依赖容器可写层;重新创建容器后应检查之前保存的目标仍在。Docker 的项目名会影响默认卷名,移动目录或改项目名时先核对实际挂载的卷,避免误用一个空卷。

WUD 显示很多容器,不表示打包它的目录就能恢复整台服务器。每个应用仍要保存自己的数据库和附件。维护记录留下实际完成的版本、备份位置和检查结果,下一次提醒出现时,再判断它是新的变化,还是上次尚未处理的任务。

测试更新时,需要多留多少空间

已有机器可保留旧镜像并完成恢复验证时,先用现有资源。需要独立环境测试升级时,按Docker VPS 的选择算好测试实例需要的配置和使用时间;监控发现新版本只是提醒,不能代替兼容性检查或数据库迁移评估。

WUD 本身可以和低负载应用共机,购买预算更应留给更新时的新旧镜像、数据库副本与恢复空间。需要复制测试环境,可查看 Evoxt 的实例与克隆功能,确认当前权限和费用;面板管理多个应用可比较 雨云 RCS 的 Docker 配置。先试一次升级、回退和数据恢复,再决定是否增加独立测试机。