使用Watchtower自动更新DOCKER镜像|多平台|多镜像|自定义更新时间

我们为什么需要Docker镜像自动更新

我们运行的docker容器进程是以docker镜像为基础的,在docker镜像的基础上加了一层可写层就变成了运行的docker容器进程。Docker镜像存储在本地或者远程镜像仓库Dockerhub是docker官方的镜像仓库,应该也是最大的镜像仓库。

现在问题出现了,镜像仓库的基础docker镜像是经常更新的,每次更新了Docker基础镜像我都要手动去服务器上重新拉取镜像并重启应用,耗时又费力,聪明的你可能已经想到了,写个bash脚本检测Dockerhub仓库的镜像更新即可,放进crontab两分钟运行一次不就解决了。好好好,你这么强脚本你写吧,我直接用现成的,我怕我写的脚本在GITHUB拿不到20K的star哈哈,而且我写的脚本可能没有watchtower这个镜像的功能全。不是咱写脚本不行,是不想重复造轮子。看看这些功能,自己写就头皮发麻。

watchtower功能如下

  • 自动更新容器:监控容器,并在有新docker镜像时自动更新。
  • 拉取最新镜像:检测到镜像更新后,自动拉取最新版本。
  • 容器重启:停止旧容器,启动新的容器,保证服务持续运行。
  • 特定标签更新:支持只更新指定标签(如 latest)的镜像。
  • 通知支持:通过 Slack、邮件等方式发送更新通知。
  • 定时检查:按照配置的时间间隔定期检查镜像更新。
  • 跳过指定容器:可以配置忽略特定的容器,防止自动更新。
  • 挂载卷和网络配置保留:更新时保留容器的卷挂载和网络配置。
  • 多平台支持:兼容 Linux、macOS 和 Windows 平台的 Docker 环境。
  • 安全更新:能够自动应用安全更新,保持容器的安全性

Watchtower完成DOCKER镜像自动更新步骤

我这边以ubuntu官方镜像为例子给大家演示各种watchtower的使用方法以及watchtower使用例子

1、使用watchtower监控docker run命令启动的容器

首先启动被监控自动更新镜像的ubuntu容器,注意这里将启动的ubuntu容器命名为ubuntu-container,后续会用到。

docker run -d \
  --name ubuntu-container \
  ubuntu \
  sleep infinity

被监控容器启动之后,就可以启动用来监控的容器watchtower了,没错,watchtower并不需要apt或者yum来安装,也是一个docker容器,官方镜像的名称是containrrr/watchtower,watchtower必须与docker的api来交互获得容器启动信息以及重启容器的权限,所以所有的watchtower容器必须使用 -v 选项挂载 docker.sock

现在使用docker run 命令启动watchtower,并监控容器名为ubuntu-container的镜像更新。注意docker hub在中国现在已经被封了,请购买vps搭建docker hub的代理或者google搜docker hub代理,配置好后才能下载containrrr/watchtower。

docker run -d \
  --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /root/.docker/config.json:/config.json \
  containrrr/watchtower \
  ubuntu-container

现在watchtower已经在监控ubuntu镜像的更新了,如果ubuntu镜像更新,watchtower就会pull最新的ubuntu镜像,删除原本的容器,并使用新镜像启动ubuntu-container。由于容器是删除了,如果你没有使用挂载卷,数据会丢失;而如果你使用了挂载卷,数据会安全地保存在宿主机上,即使容器更新,数据也不会丢失。,watchtower默认情况下每24小时巡检一下被监视的ubuntu镜像是否更新。

2、使用watchtower监控docker-compose启动的容器

创建测试docker-compose.yml文件的主目录。

mkdir ~/watchtower
cd ~/watchtower

创建docker-compose.yml文件

vim docker-compose.yml

使用以下docker-compose.yml文件将会和docker run启动的ubuntu-container容器一样

version: "3"
services:
  ubuntu:
    image: ubuntu
    container_name: ubuntu-container
    command: sleep infinity

接下来在docker-compose.yml文件添加watchtower容器启动部分

. . .

  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /root/.docker/config.json:/config.json 
    command: ubuntu-container

这个docker-compose.yml将会启动和第一部分启动的相同的两个容器。在~/watchtower 目录运行以下命令启动ubuntu-container 和watertower监视容器。

docker compose up -d

目前为止,watchtower的基本用法你已经掌握,后续我将会继续写一些高级的用法并且包含一些例子,方便大家使用

  • 监控多个容器的基础镜像更新
  • 配置巡检镜像更新的时间

3、使用watchtower监控多个容器的镜像更新。

目前运行了两个容器,一个是ubuntu-contianer 另一个是监控ubuntu-container运行的容器watchtower,我现在另外两个容器,两个容器使用相同的基础镜像,但是我起了不同的容器名称test-container1 和 test-container2,如下所示

. . .

  custom-test:
    image: sammy/ubuntu-nodejs
    container_name: test-container1
    command: sleep infinity

  custom-edit:
    image: sammy/ubuntu-nodejs
    container_name: test-container2
    command: sleep infinity

. . .

接下来我更新watchtower的配置如下,

. . .

  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /root/.docker/config.json:/config.json 
    command: ubuntu-container test-container2

目前的配置watchtower将会监控ubuntu-container 和 test-container2的镜像更新,注意,这里并不监控test-container1 ,watchtower监控的是镜像更新,但是只是将镜像更新应用到声明了的运行中容器,如果没有在command这里声明,及时基础镜像更新了,watchtower也不会重启没有声明的应用。

另外,watchtower默认86400秒(1天)巡检一次是否又镜像更新,这个在大部分场景下响应慢了,我们可以设置这个巡检监控镜像更新的时间,如下所示。是将巡检间隔设置为了30秒,可以及时发下镜像的更新,但是频繁探测镜像仓库,可能对仓库形成一定的压力。

. . .

  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /root/.docker/config.json:/config.json 
    command: --interval 30 ubuntu-container test-container2

怎么使用watchtower清理镜像

command: –cleanup –interval 30 ubuntu-container test-container2

怎么暂停watchtower更新,我回滚了镜像不希望使用最新的镜像

直接停掉watchtower,或者去掉某个容器的镜像监控,或者使用only monitor选项

可不可以配置更新后邮件提醒

可以,支持邮件、slack等多种配置提醒方法,详细请参照 watchtower notification

更多功能请参照官方文档,感谢阅读。

Leave a Comment