告别半夜被重启:用 docker-updater 手动掌控容器更新
玩 Docker 的时间一长,都会遇到同一个烦恼:容器越装越多,隔三差五就有镜像更新。更新吧,一个个 docker pull 加重启太繁琐;不更新吧,心里又不踏实。有人用 Watchtower 全自动更新,结果半夜服务被重启还蒙在鼓里。docker-updater 走的是中间路线:它只负责告诉你"谁有更新",更不更新、什么时候更,全由你点鼠标决定。
docker-updater 是什么
简单说,它是一个自托管的轻量级 Web 页面,专门管 Docker 容器的更新。工作原理是定期去镜像仓库查询每个容器所用镜像的最新摘要(digest),和本地已有的对比——只查元数据,不下载镜像,所以检查过程很快、几乎不占带宽。
和 Watchtower 的核心区别可以用一张表说清:
| 对比项 | docker-updater | Watchtower |
|---|---|---|
| 更新方式 | 手动点按钮确认 | 检测到新镜像自动更新 |
| 更新时机 | 你说了算 | 它说了算(可能半夜重启服务) |
| 更新前能看变更说明 | 能,直接看 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_HOST | Docker 通信地址,一般保持默认 |
上手使用
浏览器打开 http://你的主机IP:9292,等它完成第一轮检查(刚装好要几分钟),切到 Updates 标签页,就能看到哪些容器有新版本。每个容器后面有两个常用操作:点 update 直接更新;点 What's new 先看这次版本的更新说明,确认没问题再动手。
更新过程是"重建"而非"热补丁":它会停掉旧容器、用完全相同的配置(卷、端口、环境变量、网络、重启策略都会保留)拉起新容器。服务会有短暂中断,介意的话挑低峰期操作。
如果你暂时不想更某个容器,点延期就行,7 天、14 天、30 天、90 天或者无限期都可以,延期期间它不会再烦你。
注意事项
- docker.sock 的权限:挂载
/var/run/docker.sock等于给了这个容器指挥宿主机 Docker 的权力,只在你信任的家庭内网环境用,别暴露到公网。 - 通知只在定时检查时触发:手动点检查或刚启动时的扫描不会发通知,避免手机被刷屏。
- 时区别忘了改:
TIMEZONE不改的话,CHECK_TIME=03:00会按镜像默认时区执行,和你想的可能差好几个小时。 - 本地构建的镜像会被跳过:自己
docker build出来的镜像没有仓库摘要,它会自动忽略,不用担心误报。
总结
- 容器数量上了两位数,手动
docker pull逐个更新不现实,全自动更新又怕半夜"惊喜",docker-updater 正好卡在中间。 - 部署就一个 compose 文件,Web 界面点几下就能管完全部容器的更新,还能在更新前看 Release 说明。
- 配合 ntfy 推送,有更新手机第一时间知道,点一下更新,干净利落。
下一篇 Docker 系列文章,我们讲讲容器更新的另一个好搭档:怎么给常用服务配健康检查,让更新后出问题能第一时间发现。