如何使用 Watchtower 自動更新正在運行的 Docker 容器
對開發運維人員來說,保持 Docker 容器為最新版本是重要工作之一。手動更新 Docker 容器是一項耗時的工作。這篇文章解釋了 Watchtower 是什麼,如何安裝它,以及在 Linux 中如何 使用 Watchtower 自動更新正在運行的 Docker 容器 。
Watchtower 是什麼?
Watchtower 是一款自由開源的應用,用來監控運行中的 Docker 容器,並且當它發現基礎鏡像被更改後,可以自動的更新容器。
若 Watchtower 發現一個運行中的容器需要更新,它會以發送 SIGTERM 信號的方式,優雅的結束運行中容器的運行。
它會下載新鏡像,然後以最初部署時使用的方式,重啟容器。所有文件會在後台自動下載,因此不需要用戶的介入。
在這份指南中,我們將會明白如何在類 Unix 系統中使用 Watchtower 自動更新正在運行的 Docker 容器。
我已經在 CentOS 和 Ubuntu 中測試了這份指南,所有的 Linux 發行版中操作過程都一樣。
在 Linux 中安裝 Watchtower
可以通過 Docker 鏡像的方式下載 Watchtower 。因此,部署它是小事一樁。在你的 Linux 中安裝 Docker 鏡像,然後運行 Watchtower 立即開始監控 Docker 容器。
參考下方指導在基於 PRM 和 DEB 包管理系統中安裝 Docker
安裝 Docker 後,你可以使用以下命令以 root
用戶身份部署 Watchtower 容器:
# docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
如果你已經安裝了 Docker 桌面版,以普通用戶運行 Watchtower 容器。
$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
該命令會拉取最新版的 watchtower
鏡像,並運行 watchtower
容器。
輸出樣例:
Unable to find image 'containrrr/watchtower:latest' locally
latest: Pulling from containrrr/watchtower
1045b2f97fda: Pull complete
35a104a262d3: Pull complete
1a0671483169: Pull complete
Digest: sha256:bbf9794a691b59ed2ed3089fec53844f14ada249ee5e372ff0e595b73f4e9ab3
Status: Downloaded newer image for containrrr/watchtower:latest
91c104ef0e9896e8cd5ff30d9f13e728dbfad66443830ec2ac85dde6d7d37564
使用 Watchtower 自動更新 Docker 容器
在你的系統上,Watchtower 正在和其他容器一起運行。你可以使用一下命令查看運行中的 Docker 容器列表:
$ docker ps
輸出樣例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
91c104ef0e98 containrrr/watchtower "/watchtower" 14 minutes ago Up 14 minutes 8080/tcp watchtower
f90b462b0712 bitnami/wordpress-nginx:6 "/opt/bitnami/script…" 19 minutes ago Up 19 minutes 0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp ostechnix-wordpress-1
正如上方輸出所示,watchtower
容器正在和名為 ostechnix-wordpress-1
的容器一起運行。從現在開始,watchtower
會每隔幾分鐘會檢查該容器。
如果 Watchtower 發現該容器的基礎鏡像的任何變化,它會優雅的關閉 ostechnix-wordpress-1
容器,然後使用與最初啟動它時使用的相同方式,啟動新的鏡像。
類似的,它會自動地每隔幾分鐘檢查所有的運行中容器,並自動更新它們。
Watchtower 如何更新多連接的容器?
在監視多連接容器時,Watchtower 十分智能。
假設我們現在運行兩個容器。
$ docker ps
輸出樣例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
91c104ef0e98 containrrr/watchtower "/watchtower" 14 minutes ago Up 14 minutes 8080/tcp watchtower
f90b462b0712 bitnami/wordpress-nginx:6 "/opt/bitnami/script…" 19 minutes ago Up 19 minutes 0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp ostechnix-wordpress-1
a895f082438a bitnami/mariadb:10.6 "/opt/bitnami/script…" 20 minutes ago Up 19 minutes 3306/tcp ostechnix-mariadb-1
正如你看到的,我們正在運行 ostechnix-wordpress-1
和 ostechnix-mariadb-1
這兩個容器。ostechnix-mariadb-1
容器鏈接到 ostechnix-wordpress-1
容器。
如果 Watchtower 發現 ostechnix-wordpress-1
容器有個新版本,它會先關閉與之相連接的 ostechnix-mariadb-1
容器 ,然後才會關閉 ostechnix-wordpress-1
容器。
更新 ostechnix-wordpress-1
容器後,Watchtower 會以正確的順序,且與最初啟動它們時使用的相同方式,重啟這兩個容器,以便應用程序正確恢復。在我們的例子中,首先啟動的是 ostechnix-mariadb-1
容器,然後是 ostechnix-wordpress-1
容器,以確保連接能夠繼續運行。
監控特定容器
默認情況下,Watchtower 將監控在它所指向的 Docker 守護進程中運行的所有 Docker 容器。
不過,你可以像下面這樣,通過指定容器名稱限制 Watchtower 監視特定的 Docker 容器。
$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower ostechnix-wordpress-1
在上方的例子中,watchtower
會忽略其他容器,只監視名為 ostechnix-wordpress-1
的容器更新情況。
如果你不指定任何參數,Watchtower 會照常監視所有運行中的 Docker 容器。
發送提示
或許你想收到容器更新的通知。你可以通過電子郵件、Slack 、MSTeams 以及 Gotify 發送通知。
下面這個例子展示了如何通過電子郵件發送通知。假設你已經設置了 SMTP 伺服器。
docker run -d
--name watchtower
-v /var/run/docker.sock:/var/run/docker.sock
-e WATCHTOWER_NOTIFICATIONS=email
-e WATCHTOWER_NOTIFICATION_EMAIL_FROM=fromaddress@gmail.com
-e WATCHTOWER_NOTIFICATION_EMAIL_TO=toaddress@gmail.com
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.gmail.com
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=fromaddress@gmail.com
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=app_password
-e WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2
containrrr/watchtower
參考下方 Watchtower Github 倉庫和 Watchtower 官方主頁獲取更多信息:
資料
via: https://ostechnix.com/automatically-update-running-docker-containers/
作者:sk 選題:lkxed 譯者:Donkey 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive