很多喜歡折騰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
