基础环境

系统:openEuler 22.03 (LTS-SP4) X86

软件:docker-26.1.3、 docker compose-2.27.0

关于Watchtower

Watchtower 是一个应用程序,监控正在运行的 Docker 容器,并监视这些容器的镜像版本的变化。如果 Watchtower 检测到容器的镜像已更改,它将自动拉取新镜像,关闭现有容器,使用最初部署时的相同选项重新启动它,实现容器的优雅升级。

安装docker

(1)配置yum源下载docker。

1
2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/\$releasever/7/g' /etc/yum.repos.d/docker-ce.repo

(2)安装最新版docker和docker compose。

1
2
3
# 下载依赖及docker、docker compose
yum install -y container-selinux
yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

(3)修改Docker的数据目录为“/data/dockerData”,并配置docker镜像源。

1
2
3
4
echo '{
"data-root": "/data/dockerData",
"registry-mirrors": ["https://dhub.kubesre.xyzcu"]
}' > /etc/docker/daemon.json

(4)启动Docker服务,并设置为开机自启动。

1
2
systemctl start docker
systemctl enable docker

安装Watchtower

方式一:通过docker命令安装

1
2
3
4
5
6
7
docker run -itd --name watchtower \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-e TZ=Asia/Shanghai \
containrrr/watchtower \
--interval 60 \
--cleanup

--restart=always 设置容器开机自启

-v /var/run/docker.sock:/var/run/docker.sock 读取docker守护进程的API

-e TZ=Asia/Shanghai 使用本地时区

--interval 60 设置轮询间隔为60秒

--cleanup 更新后删除旧镜像

方式二:使用compose文件安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: always
environment:
- TZ=Asia/Shanghai
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --interval 60 --cleanup
user: "0"
networks:
watchtower-net:
ipv4_address: 172.20.17.11

networks:
watchtower-net:
driver: bridge
ipam:
config:
- subnet: 172.20.17.0/24

Watchtower更多应用

1.watchtower 监控更新远程 Docker主机

(1)在远程主机上启用远程 API 访问。

1
2
3
4
5
6
7
8
9
10
11
12
 #修改docker服务文件
vi /usr/lib/systemd/system/docker.service
#在该行后加入 -H tcp://0.0.0.0:2375
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
#重启服务和docker
systemctl daemon-reload
systemctl restart docker

#添加防火墙策略
sudo firewall-cmd --add-port=2375/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

(2)在本机创建watchtower,监控远程主机的docker容器

1
2
3
4
5
6
docker run -d --name watchtower-1 \
-e TZ=Asia/Shanghai \
containrrr/watchtower \
--interval 60 \
--cleanup \
--host "tcp://10.0.1.2:2375"

2.按标签筛选

按标签筛选进行容器的更新,需要在创建容器时,给容器打上包含com.centurylinklabs.watchtower.enable的标签,com.centurylinklabs.watchtower.enable=false表示禁用对容器的监控和更新,com.centurylinklabs.watchtower.enable=true表示启用对容器的监控和更新,此类情况只适用于创建新容器时。

1
2
3
4
5
#禁用对容器的监控和更新
docker run -itd \
--label=com.centurylinklabs.watchtower.enable=false --name test-httpd httpd
#启用对容器的监控和更新
docker run -d --label=com.centurylinklabs.watchtower.enable=true --name test-httpd httpd

3.禁用容器名称筛选

要禁用特定容器,需要在watchtower创建时加入--disable-containers参数,并在该参数后加上容器名称,如httpd,运行时就会不监控名称中含有httpd的容器。

1
2
3
4
5
6
7
8
9
docker run -d \
--name watchtower \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-e TZ=Asia/Shanghai \
containrrr/watchtower \
--interval 60 \
--cleanup \
--disable-containers httpd

4. 常用命令参数

部分常用参数设置如下表所示。

参数 示例 说明
—schedule “0 9 *” docker run -itd --name watchtower --restart always -v /var/run/docker.sock:/var/run/docker.sock -e TZ=Asia/Shanghai containrrr/watchtower --cleanup --schedule "0 9 * * *" 每天九点执行更新调度
—run-once docker run -rm --name watchtower --restart always -v /var/run/docker.sock:/var/run/docker.sock -e TZ=Asia/Shanghai containrrr/watchtower --cleanup --run-once 手动更新一次,并将watchtower删除
容器名 docker run -itd --name watchtower --restart always -v /var/run/docker.sock:/var/run/docker.sock -e TZ=Asia/Shanghai containrrr/watchtower --cleanup nginx httpd 指定更新容器nginx、httpd
—monitor-only docker run -itd --name watchtower --restart always -v /var/run/docker.sock:/var/run/docker.sock -e TZ=Asia/Shanghai containrrr/watchtower --cleanup --monitor-only 只检查容器是否需要更新,不应用更新

更多参数设置,可查看watchtower官方文档。