告别半夜被重启:用 docker-updater 手动掌控容器更新

玩 Docker 的时间一长,都会遇到同一个烦恼:容器越装越多,隔三差五就有镜像更新。更新吧,一个个 docker pull 加重启太繁琐;不更新吧,心里又不踏实。有人用 Watchtower 全自动更新,结果半夜服务被重启还蒙在鼓里。docker-updater 走的是中间路线:它只负责告诉你"谁有更新",更不更新、什么时候更,全由你点鼠标决定。

docker-updater 是什么

简单说,它是一个自托管的轻量级 Web 页面,专门管 Docker 容器的更新。工作原理是定期去镜像仓库查询每个容器所用镜像的最新摘要(digest),和本地已有的对比——只查元数据,不下载镜像,所以检查过程很快、几乎不占带宽。

和 Watchtower 的核心区别可以用一张表说清:

对比项docker-updaterWatchtower
更新方式手动点按钮确认检测到新镜像自动更新
更新时机你说了算它说了算(可能半夜重启服务)
更新前能看变更说明能,直接看 GitHub Release不能
想暂缓某个容器支持,按 7/14/30/90 天或无限期延期不支持
适合谁家庭服务器、NAS,不想被打扰的人能接受全自动、追求省心的人

如果你是那种"更新前想先看看这次改了啥"的人,docker-updater 就是为你准备的。

核心功能一览

  • 更新仪表盘:所有容器按状态分组——有更新待处理、已延期、已是最新、未检查,一目了然。
  • 单容器精细控制:每个容器可单独更新,也可延期一段时间再说,随时能取消延期。
  • 批量更新:想一次更完,勾选多个容器批量处理也行。
  • 变更说明查看:对规范打标签的镜像,能直接拉取它 GitHub 仓库最近几个 Release 的更新日志,升级前先看有没有破坏性变更。
  • 实时日志:点更新后弹窗显示拉取和重建的实时日志,刷新页面会自动重连,不怕看一半断掉。
  • 推送通知:支持 ntfy、Pushover、Discord、Slack 等几十种通知方式,有更新时手机会收到提醒。

部署实战:docker-compose 一把梭

找个目录(比如 ~/docker/docker-updater),新建 docker-compose.yml:

services:
  docker-updater:
    image: ghcr.io/liquidguru/docker-updater:latest
    container_name: docker-updater
    restart: unless-stopped
    ports:
      - "9292:9090"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data:/app/data
    environment:
      - CHECK_TIME=03:00
      - TIMEZONE=Asia/Shanghai
      - DOCKER_HOST=unix:///var/run/docker.sock

然后:

mkdir -p ~/docker/docker-updater/data
cd ~/docker/docker-updater
docker compose up -d

几个环境变量说明一下:

变量作用
CHECK_TIME每天定时检查更新的时刻,HH:MM 格式
TIMEZONE上面那个时刻按哪个时区算,国内填 Asia/Shanghai
NOTIFY_URL推送通知地址,不填会自动生成一个私有的 ntfy 主题
DOCKER_HOSTDocker 通信地址,一般保持默认

上手使用

浏览器打开 http://你的主机IP:9292,等它完成第一轮检查(刚装好要几分钟),切到 Updates 标签页,就能看到哪些容器有新版本。每个容器后面有两个常用操作:点 update 直接更新;点 What's new 先看这次版本的更新说明,确认没问题再动手。

更新过程是"重建"而非"热补丁":它会停掉旧容器、用完全相同的配置(卷、端口、环境变量、网络、重启策略都会保留)拉起新容器。服务会有短暂中断,介意的话挑低峰期操作。

如果你暂时不想更某个容器,点延期就行,7 天、14 天、30 天、90 天或者无限期都可以,延期期间它不会再烦你。

注意事项

  1. docker.sock 的权限:挂载 /var/run/docker.sock 等于给了这个容器指挥宿主机 Docker 的权力,只在你信任的家庭内网环境用,别暴露到公网。
  2. 通知只在定时检查时触发:手动点检查或刚启动时的扫描不会发通知,避免手机被刷屏。
  3. 时区别忘了改:TIMEZONE 不改的话,CHECK_TIME=03:00 会按镜像默认时区执行,和你想的可能差好几个小时。
  4. 本地构建的镜像会被跳过:自己 docker build 出来的镜像没有仓库摘要,它会自动忽略,不用担心误报。

总结

  • 容器数量上了两位数,手动 docker pull 逐个更新不现实,全自动更新又怕半夜"惊喜",docker-updater 正好卡在中间。
  • 部署就一个 compose 文件,Web 界面点几下就能管完全部容器的更新,还能在更新前看 Release 说明。
  • 配合 ntfy 推送,有更新手机第一时间知道,点一下更新,干净利落。

下一篇 Docker 系列文章,我们讲讲容器更新的另一个好搭档:怎么给常用服务配健康检查,让更新后出问题能第一时间发现。