天天看點

使用Watchtower自動更新Docker鏡像與容器

作者:不秃頭程式員
使用Watchtower自動更新Docker鏡像與容器

概述

Docker 容器的部署有一種在手機上裝 App 的感覺,但 Docker 容器并不會像手機 App 那樣會自動更新,而如果我們需要更新容器一般需要以下四個步驟:

  • 停止容器:docker stop
  • 删除容器:docker rm
  • 更新鏡像:docker pull
  • 啟動容器:docker run

停止容器這個步驟可以在删除容器時使用 -f 參數來代替,即使這樣還是需要三個步驟。如果部署了大量的容器需要更新使用這種傳統的方式工作量是巨大的。

Watchtower

Watchtower 是一款實作自動化更新 Docker 鏡像與容器的實用工具,它本身也是一個 Docker 鏡像,主要用來監控運作中的 Docker 容器的鏡像是否需要更新。當 Watchtower 檢測到容器的鏡像有更新時,它會發送 SIGTERM 信号優雅地結束正在運作的容器,然後根據設定的參數自動重新啟動容器,包括使用相同的參數和配置。這個過程無需使用者介入,可以自動完成,進而實作 Docker 容器的自動更新。

Watchtower 的工作方式是定期輪詢 Docker 守護程序,檢查容器的鏡像是否有新的版本可用。如果有新版本,Watchtower 将自動拉取新鏡像,并根據需要重新開機容器。這個工具對于希望保持容器始終運作最新鏡像的使用者來說非常有用,特别是在需要持續內建和持續部署的環境中。

官網位址:https://containrrr.dev/watchtower

基本使用

更新主控端的所有容器

使用以下指令,更新主控端的所有容器,也包括 Watch­tower 本身。
docker run -d  \
    --name watchtower \
    --volume /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower           

指定某個容器進行監視

如果指向監視某一個容器進行自定更新,則在上述指令後面加上容器名即可。
docker run -d \
    --name watchtower \
    -v /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower \
    miniboard           

指定容器的更新頻率

Watchtower 預設情況下 24 小時會檢查一次鏡像更新。設定--interval 選項更新時間,預設機關秒。
docker run -d \
    --name watchtower \
    -v /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower \
    --interval 6           

可以使用--schedule選項, 設定定時更新任務,定時任務為6 字段來表示執行時間,第一個字段表示秒。

docker run -d \
    --name watchtower \
    -v /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower \
    --schedule "0 30 20 * * 5"           

自定清理舊鏡像

可以使用--cleanup選項,這樣每次更新都會把舊的鏡像清理掉。
docker run -d \
    --name watchtower \
    -v /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower \
    --cleanup           

用于清理無用的Docker卷。它會删除所有沒有關聯到任何容器的卷,以釋放磁盤空間。

配置自動更新頻率

Watchtower 預設每 5 分鐘輪詢一次,可以使用以下參數配置更新的頻率.

  • --interval,-i配置更新周期,預設300秒.
  • --schedule,-s配置定時更新,使用Cron表達式,例如"0 0 1 * * *".即每天淩晨1點更新.

每2小時更新一次

docker run -d \
    --name watchtower \
    --restart always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower \
    --cleanup \
    -i 7200           

每天淩晨3點更新

docker run -d \
    --name watchtower \
    --restart always \
    -e TZ=Asia/Shanghai \
    -v /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower \
    --cleanup \
    -s "0 0 3 * * *"           

手動更新

使用手動更新的方式,運作一次Watch­tower容器來更新所需的容器,更新後會自動删除本次運作的Watch­tower容器.隻需要加上--rm和--run-once參數即可.同時也可以配合以上指定容器或指定排除容器的參數來使用.

更新所有容器

docker run --rm \
    -v /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower \
    --cleanup \
    --run-once           

更新指定容器

docker run --rm \
    -v /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower \
    --cleanup \
    --run-once \
    nginx redis