banner
云野阁

云野阁

闲云野鹤,八方逍遥

Watchtower自动更新docker容器

基础环境#

系统:openEuler 22.03 (LTS-SP4) X86

软件:docker-26.1.3、 docker compose-2.27.0

关于 Watchtower#

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

安装 docker#

(1) 配置 yum 源下载 docker。

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。

# 下载依赖及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 镜像源。

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

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

systemctl start docker
systemctl enable docker

安装 Watchtower#

方式一:通过 docker 命令安装#

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 文件安装#

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 访问。

 #修改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 容器

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表示启用对容器的监控和更新,此类情况只适用于创建新容器时。

#禁用对容器的监控和更新
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 的容器。

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-oncedocker 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-onlydocker 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 官方文档。
https://containrrr.dev/watchtower/arguments/

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。