概述
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
基本使用
更新宿主機的所有容器
使用以下命令,更新宿主機的所有容器,也包括 Watchtower 本身。
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 * * *"
手動更新
使用手動更新的方式,執行一次
Watchtower
容器來更新所需的容器,更新後會自動刪除本次執行的
Watchtower
容器.只需要加上
--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