Featured image of post 容器(5):docker最佳实践指南——容器更新监测工具WUD(What's Up Docker)

容器(5):docker最佳实践指南——容器更新监测工具WUD(What's Up Docker)

使用WUD(What's Up Docker)监测容器的更新

缘起

这是介绍docker容器的第五篇文章。本系列其他文章链接如下:

上一篇文章提到了如何更新或升级容器。我在更新docker容器时发现,其中很多容器都已经两三年没更新了,版本跨越太多,这就导致有些容器没法直接更新。而有些容器则更新不多,可以直接更新。由于各个容器更新频率不同,而且创建的容器优比较多,我不想隔几天就手动去检查一下容器有没有更新可用。于是我就想到了一个问题:有没有工具可以自动监测容器的更新呢?

当然是有的,比如WatchTower,但WatchTower是自动更新容器的工具,我并不想让它自动更新,我只想知道容器有没有更新可用,所以就一直没用。最近,我发现有个叫WUD(What’s Up Docker)的工具可以监测容器的更新,并且简单易用,就打算尝试一下。

前提

  • 已安装Docker和docker-compose
  • 了解Docker的基本概念和基本用法
  • 使用docker-compose管理容器(如果你没有使用docker-compose管理容器,也不想使用docker-compose管理容器,那么本篇文章仅供参考)

WUD(What’s Up Docker)简介

WUD(What’s Up Docker)是一个开源的Docker容器更新监测工具,它可以监测Docker Hub上的容器镜像是否有更新,并且可以通过邮件、Slack等方式通知用户。

WUD安装与使用

安装WUD

WUD的安装十分简单,按照官方文档的说明即可。这里我们使用docker-compose来安装WUD,docker-compose.yml文件如下:

1
2
3
4
5
6
7
8
services:
  whatsupdocker:
    image: getwud/wud
    container_name: wud
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 3000:3000

启动后在浏览器中访问http://localhost:3000即可。

创建管理账户

但上述方法安装的WUD是没有管理账户的,在本地访问尚可,但如果想把服务暴露到公网,就需要创建一个管理账户。WUD提供了两种方法来创建管理账户:

  1. 使用环境变量将用户名和密码传递给WUD容器
  2. 使用OpenidConnect(OIDC)来创建管理账户

详见[官方文档](https://getwud.github.io/wud/#/configuration/authentications/)。

第一种方法非常简单便捷,我就直接使用了。我们只需要在docker-compose.yml文件中添加以下环境变量即可:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
services:
  whatsupdocker:
    image: getwud/wud
    container_name: wud
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 3001:3000
    environment:
      - WUD_AUTH_BASIC_ADMIN_USER=your_admin_name
      - WUD_AUTH_BASIC_ADMIN_HASH=your_admin_password_hash

其中密码是以hash的形式存储的,我们可以使用hrpasswd命令来生成密码的hash:

1
htpasswd -nib admin doe

如果你没有安装htpasswd命令,可以在这个网站上生成密码的hash。

需要注意的是,生成的hash值以用户名开头,我们只需要取出冒号后面的部分即可。冒号后面的部分可能含有$符号,所以我们需要用$$来替换掉$符号。比如原hash值为$apr1$2c4a3d5e$e0f8b7c6d7f8b7c6d7f8b7c6,那么我们需要将其替换为$$apr1$$2c4a3d5e$$e0f8b7c6d7f8b7c6d7f8b7c6

再重新启动WUD容器,进入浏览器,可以看到如下登录界面: wud_login

输入你的用户名和密码就可以登录了,注意输入的是密码,不需要输入hash值。

WUD监测容器更新

通过网页界面可以监测容器的更新状态,登录后可以看到如下界面:

wud_main

可见WUD检测到了37个容器,其中10个有更新的版本可用。点击进去可用查看详情:

wud_web2

可以看到容器的当前版本号以及最新的版本号,我们可以根据需求来决定是否更新容器。

设置WUD监测规则

在WUD中,我们看到的容器状态可能是这样的:

wud_web3

这里面有两个问题:

  1. 我们的容器使用的标签(tag)是数字形式的,但WUD会监测所有标签,包括一些不规则的标签,例如图中authelia最新的标签是feat-i18n-lang-attr。如果我们只希望监测数字形式的标签,就需要设置监测规则。
  2. 当我们部署一个服务时,可能会使用多个容器来部署这个服务,例如chevereto的服务就需要两个容器来部署,一个是chevereto-free,一个是chevereto-free-database。我们不需要监测所有的容器,只需要监测chevereto-free这个容器就可以了。否则如果监测到chevereto-free-database有更新了,而chevereto-free暂无更新可用,我们只更新chevereto-free-database,可能导致兼容性的问题。我们也需要设置监测规则来避免这种情况。

包含某些标签

对于第一种情况,我们可以在对应容器docker-compose.yml文件中添加wud.tag.include来告诉WUD我们只希望监测哪些标签。比如我们只希望监测数字形式如xx.yy.zz形式的标签,那么我们可以添加如下配置:

1
2
3
4
5
services:
  some_service:
    image: some_image
    labels:
      - wud.tag.include=^\d+\.\d+\.\d+$$

这种方式是正则表达式的方式来匹配标签的,^表示开头,\d表示数字,+表示一个或多个,\.表示点号,$$表示结尾。这样就可以匹配到数字形式的标签了。

xx.yy.zz形式的标签中,一般xx表示主版本号,yy表示次版本号,zz表示修订号。我们可以根据需求来设置监测规则,比如只监测主版本号和次版本号的更新,忽略掉修订号,那么我们可以将正则表达式改为:

1
2
3
4
5
services:
  some_service:
    image: some_image
    labels:
      - wud.tag.include=^(\d+\.\d+)\.\d+$$ => $$1

这样我们把xx.yy用括号括起来表示为一个分组,然后在=>后面指定了我们只希望监测xx.yy的更新。这样就可以只监测主版本号和次版本号的更新了。

不监测某些容器

对于第二种情况,我们可以在对应容器docker-compose.yml文件中添加wud.watch来告诉WUD我们是否监测这个容器。比如我们不希望监测chevereto-free-database这个容器,那么我们可以添加如下配置:

1
2
3
4
5
6
7
services:
  chevereto-free-app:
    image: chevereto-free
  chevereto-free-database:
    image: chevereto-free-database
    labels:
      - wud.watch=false

这样就可以不监测chevereto-free-database这个容器了。

comments powered by Disqus