使用 WatchTower 使容器自动化更新（简单用法）

随着 Docker 的普及，基本上 90% 的项目都会提供 Docker 来部署应用并且隔离。部署之前有一些基础经验还好，还能预先设定之后怎么进行更新、数据怎么进行保存。但是有一些对 Docker 几乎不了解的用户来说，可能只能跟着用户文档复制粘贴运行，后续更新相当茫然，只能重新部署一次。
偶然在 Github 发现了 WatchTower 这个项目，我想这可能就是容器更新的最佳解决方案了。

简单介绍

Watchtower 是一个容器管理工具，推荐的安装方式也是使用 Docker。它能够监视 Docker 中的容器，并在其所依赖的镜像更新之后自动更新容器并恢复数据。

一些优点

自动更新，不需要人工进行干预，更新时候会保存所有的数据信息。

简单易用，默认运行方式也是直接 Docker 运行，不需要其他多余配置。

自定义程度高，支持配置时间点、更新镜像策略、更新容器策略等。

轻量级且和现有的服务无缝集成，不需要其他多余的配置

简单上手

WatchTower 默认只需要执行下以下 Docker 命令就可以运行起来。默认为五分钟去检查一次，启动之后日志里面也会包含每次运行的时间、预计下次运行时间。

Copy
docker run -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower

这里我们启动时还可以加上一些其他的设置。

设置下默认时区，这里我只直接设置为东八区。

后台运行。

设置重启策略，即使 docker 重启了也还会继续运行。

Copy
# -d 后台运行
# -e TZ="Asia/Shanghai" 设置时区为东八区。
# -v /var/run/docker.sock:/var/run/docker.sock 让 WatchTower 可以查询到容器信息。
docker run -d \
--name watchtower \
-e TZ="Asia/Shanghai" \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower

扩展设置

除了基础的应用，列出了一些比较常用的扩展配置：

--run-once 只执行一次。

--cleanup 执行完成之后清理未使用的镜像。

--include-stopped 停止的容器也去检查下。

--schedule 使用 cron 定时策略执行。

--interval 使用间隔时间去执行，和 --schedule 这个配置选择一个。

结合以上，可以整理出来一些常用的方式

手动执行一次对容器镜像的更新，更新的时候包含已停止的容器，并且更新完之后执行一次清理。

Copy
docker run --rm \
--name watchtower \
-e TZ="Asia/Shanghai" \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--run-once \
--cleanup \
--include-stopped

后台运行，每天早上五点执行一次检查（需要注意这里使用的 cron 是六位的，和 linux 系统默认支持的有所不同）。

Copy
docker run -d \
--name watchtower \
-e TZ="Asia/Shanghai" \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--cleanup \
--include-stopped \
--schedule "0 0 5 * * *"

后台运行，每小时执行一次检查（这里的单位是 s，所以一小时设置为 3600）。

Copy
docker run -d \
--name watchtower \
-e TZ="Asia/Shanghai" \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--cleanup \
--include-stopped \
--interval 3600