Docker更新太麻煩?部署Watchtower,實現全自動無感升級

很多喜歡折騰NAS的兄弟,都會在設備上跑上各種各樣的Docker容器。比如咱們之前教程裏分享過的影視服務器、下載軟件、各類輔助工具等等。

但是隨着容器越裝越多,有個讓人頭疼的問題就來了,怎麼給這些Docker容器更新升級?

在部署的Docker容器較少時,咱們可以採用手動更新,只是步驟往往比較繁瑣,得去鏡像站拉取最新鏡像,然後停止當前容器,刪除舊容器後用相同的參數重新部署新容器。

可以想象,如果有十幾個甚至幾十個容器,隔三差五這麼搞一次更新的話,就屬實有點太麻煩了

那麼,有沒有什麼辦法能讓我們一勞永逸,讓NAS自動幫我們在後臺默默升級這些Docker容器呢?

有的兄弟,有的。

今天咱們就來分享一款在Github上斬獲24.7k收藏的免費開源神器Watchtower,只要把它部署起來,NAS就擁有了自動升級Docker容器的超能力。

一、Watchtower是什麼?

Watchtower翻譯成中文就是瞭望塔,它的本質其實是一個極其輕量級的Docker容器,在運行後,會像一個盡職盡責的哨兵一樣,監控着你NAS上運行的其他Docker容器。

它會定時去DockerHub之類的鏡像倉庫拉取比對鏡像的版本信息,一旦發現某個容器有了新版本的鏡像,就會自動拉取新鏡像,關閉舊容器,然後使用你最初部署時的完全相同的參數啓動新容器,全程無需人工干預。

Watchtower在監控的自由度也相當高,咱們可以讓它監控所有容器,也可以通過黑白名單或直接指定名稱的方式,精準控制更新範圍,絕不誤傷核心數據容器。

對於喜歡折騰各種Docker的朋友來說,這絕對是一個能讓你事半功倍的效率神器。今天咱們就手把手教大家,在NAS上把它跑起來。

二、NAS部署Watchtower流程

接下來我們來看看如何在NAS上通過Docker Compose的方式部署Watchtower,這裏用到的設備依然是威聯通最新的8盤位旗艦型號Qu805,N355處理器性能強勁,搭配可替換的16GB內存,跑再多Docker也沒壓力。

這裏使用Docker Compose的方式來部署最爲方便,一鍵複製粘貼代碼即可,參數修改清晰可見,非常輕鬆。

打開威聯通 Container Station,點擊左側的「應用程序」,然後點擊右側黑色「創建」按鈕,輸入以下代碼:

這裏需要注意,必須映射/var/run/docker.sock,它賦予了Watchtower與NAS底層Docker守護進程通信的權限,加入這行Watchtower才能接管和控制其他容器,千萬別刪別改。

點擊「創建」後,耐心等待NAS拉取鏡像並部署完成。在Container Station中看到狀態顯示正在運行即可。

三、Watchtower的使用和配置

Watchtower的部署過程非常簡單,但它沒有提供部署後的設置功能,所以有特殊需求的話,咱們需要通過在部署時添加相應命令才能實現。

爲了讓Watchtower更符合咱們個人的使用習慣,建議大家掌握以下幾個核心的配置技巧,這也是官方文檔中極爲推薦的做法。

1. 修改自動檢查更新的頻率與時區

在上面的Docker Compose代碼中,我們使用了 WATCHTOWER_SCHEDULE=0 0 4 * * *,代表每天凌晨4點整執行檢查。

這裏有兩個細節需要特別注意。

首先,Watchtower使用的是6位的Cron表達式(比 Linux 常見的 5位 多了最前面的秒),第一位必須填代表秒數的數字。

舉例來說,如果我們想改成每週日凌晨3點更新,可以修改爲:0 0 3 * * 0。

另外,時區變量(TZ)極其重要,如果咱們在環境變量中不配置TZ=Asia/Shanghai,Watchtower就會默認使用UTC時間。

因爲北京時間比UTC快8小時,在不手動指定時區的情況下,在原始代碼中設定的凌晨4點,實際觸發時間會變成咱們當地的中午12點。

所以一定要加上時區環境變量,才能保證它按咱們設定的本地時間準確幹活。

不放心的話,可以在部署完成後去Container Station看一眼容器日誌,如果出現了預期的時間和+0800 CST,就代表時區和定時任務都完美生效了。

2. 靈活選擇監控Docker容器的範圍

默認情況下,Watchtower會監控並更新NAS上所有的容器,但在實際使用時大家都知道,並非所有的Docker都適合無腦自動更新。

比如Nextcloud、MySQL等數據庫類容器,跨版本大更新如果不提前備份,有可能會導致數據崩潰。

爲了安全,Watchtower官方給出了三種精準控制的方法:

(1)直接指定容器名稱

如果我們只想更新極個別的幾個容器,可以直接在DockerCompose裏通過command參數來指定容器名字,只需要在咱們剛纔的代碼最下面加上一行即可,多個容器名中間用空格隔開。

比如,如果我們只想更新名爲nginx和redis的容器:

volumes:

- /var/run/docker.sock:/var/run/docker.sock

# 在這裏直接寫上你要監控的容器名,空格隔開

command: nginx redis

加上這一行後,Watchtower就會完全無視其他的應用,變成nginx和redis的專屬升級保姆。

(2)黑名單模式(排除法)

如果我們大部分Docker容器都想自動更新,只有少數幾個不想動。只需要在部署那個不想被更新的Docker容器時,給它加上這行 labels 標籤:

labels:

- "com.centurylinklabs.watchtower.enable=false"

Watchtower監控時看到這個標籤,就會直接忽略它。

(3)白名單模式(指定法)

如果我們希望統一通過標籤來管理更新權限,可以在Watchtower的環境變量中加入一行:

- WATCHTOWER_LABEL_ENABLE=true

此時Watchtower默認不會更新任何容器。

然後,只需要在想被更新的容器上加上下面的白名單標籤,Watchtower就會只針對有這條標籤的容器進行更新:

labels:

- "com.centurylinklabs.watchtower.enable=true"

這種機制容錯率更高,也更適合NAS老手來使用。

3. 更新後自動移除舊鏡像

Docker的運行機制是這樣的,拉取新版本鏡像後,舊版本鏡像並不會自動刪除,而是會變成名爲 <none> 的懸空鏡像(Dangling images)。

隨着咱們容器不斷更新,如果不加干預,這些廢棄的舊鏡像可能會大量擠佔NAS的硬盤空間。

爲了解決這個痛點,我們只需要在Watchtower中加入環境變量:

- WATCHTOWER_CLEANUP=true

開啓這個選項後,一旦Watchtower成功拉取新鏡像並重啓了容器,它就會順手把遺留下來的舊版本鏡像徹底刪除,釋放NAS上的硬盤空間。

4. 一次性手動運行模式

如果有兄弟不想讓它常駐後臺,只想在需要的時候更新一下,我們可以在代碼的環境變量部分把WATCHTOWER_SCHEDULE 刪掉,加上變量:

- WATCHTOWER_RUN_ONCE=true

同時刪除自動重啓命令:

restart: always

此時Watchtower在部署後會運行一次,完成檢查與更新任務後會自動退出,絲毫不佔用NAS的日常內存,非常乾淨利落。

下一次想要手動更新時,只需要在Container Station選中它,再次啓動即可。

總結

總體來說,Watchtower這個項目完美地解決了NAS玩家後期維護Docker容器的痛點,它就像一個默默無聞的後臺大管家,替咱們完成最耗時、最繁瑣的版本追蹤和重啓工作,並且憑藉靈活的配置項,咱們也可以把它調教得極其順手。

如果你也被繁瑣的手動更新折磨過,強烈建議花個3分鐘把它部署在NAS裏試試。

以上就是本期的全部內容了,如果大家在部署過程中遇到什麼問題,歡迎在評論區留言交流。也歡迎給飄雷來個點贊、收藏加關注三連擊,我們下期再見!

更多遊戲資訊請關註:電玩幫遊戲資訊專區

電玩幫圖文攻略 www.vgover.com