Skip to main content

Watchtower

介紹

使用情境如果下:

假設我們有運行一些服務例如個人網站,並且是佈署在別台電腦上的話,我們用CI/CD來幫忙build新的docker image,然後連到遠端電腦去做更新。

流程圖類似如下圖:

現在我們可以透過Watchtower這個工具,替我們自動更新遠端設備(server)裡面的docker image和重啟docker container的服務。

概念比較像是他會啟動一個小的監聽server,他會每過特定時間去像遠端的docker registry確認是否此docker image有被更新過? 如果有的話,就會幫我們更新並且重啟container。

此作法就可以省去我們在CICD文檔內,還要特地做連到遠端然後再去做pull docker image,重啟等的動作。

所以基本上就是把我們的服務全部放到docker image,然後用此docker image去做啟動。

流程圖大概繪像下圖:

使用方法

於想要追蹤的container裡面加入這個參數 label 並設定為 true ,Watchtower就會追蹤這個container。反之,則不會追蹤。畢竟可能我們可能有非常多的容器,而只想特定追蹤某個容器而已。

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

另外,如果在command line的後面加上容器的名稱,Watchtower就會只關注那個container而已。預設是追蹤device內所有的container,建議是可以加入這個參數,watchtower就不會追蹤設備裡docker全部的容器。

可以在 --interval 設定要多久監聽一次。

以下為範例:

docker-compose.yml
version: "3"

services:
app:
build: .
image: chieh/app:latest
ports:
- 80:80
- 35729:35729
container_name: meta
labels:
- "com.centurylinklabs.watchtower.enable=true"
restart: unless-stopped

watchtower:
image: containrrr/watchtower
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- $HOME/.docker/config.json:/config.json
container_name: watchtower
labels:
com.centurylinklabs.watchtower.enable: true
command: --interval 300 meta
environment:
WATCHTOWER_POLL_INTERVAL: 300 # Poll interval in seconds
# WATCHTOWER_INCLUDE_STOPPED: 1 # Include stopped containers
# WATCHTOWER_REVIVE_STOPPED: 1 # Restart stopped containers
# WATCHTOWER_CLEANUP: 1 # Delete unused image
WATCHTOWER_LABEL_ENABLE: 1 # Only include containers with enable label
# WATCHTOWER_LIFECYCLE_HOOKS: 1 # Enable pre/post-update scripts

Reference