我们为什么需要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镜像是否更新。
注意:如果在watchtower启动时不指定容器名称ubuntu-container。则会监控所有启动的容器所使用镜像的更新。
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。
更多功能请参照官方文档,感谢阅读。