基于Docker+Watchtower自動化部署后端服務(wù)
本文提供一套生產(chǎn)級通用后端服務(wù)自動化部署方案,基于 Docker Compose 編排 + Watchtower 自動更新機(jī)制,適用于所有已容器化的后端應(yīng)用(Java/Go/Python/Node.js 等)。實(shí)現(xiàn) "一次配置,終身自動更新",徹底解決手動部署、版本更新、容器重啟等繁瑣運(yùn)維問題。
前置條件
在開始部署前,請確保你的服務(wù)器已滿足以下通用要求:
- 服務(wù)器已安裝 Docker 20.10+ 和 Docker Compose V2+ (推薦使用官方一鍵安裝腳本)
- 你的后端代碼已打包為Docker 鏡像,并推送到任意鏡像倉庫(Docker Hub/GitHub GHCR / 阿里云 ACR / 騰訊云 TCR 等)
- 服務(wù)器可正常訪問你的鏡像倉庫(私有倉庫需提前獲取訪問憑證)
- 服務(wù)器已開放后端服務(wù)所需的端口(如 8080、3000 等)
部署步驟
步驟 1:創(chuàng)建項(xiàng)目目錄結(jié)構(gòu)
在服務(wù)器上創(chuàng)建標(biāo)準(zhǔn)化的項(xiàng)目目錄,用于存放配置文件、日志、靜態(tài)資源等持久化數(shù)據(jù):
# 創(chuàng)建通用項(xiàng)目目錄結(jié)構(gòu)(可根據(jù)實(shí)際需求調(diào)整)
mkdir -p ~/your-project/{logs,data,config,static}logs/:存放后端服務(wù)日志文件data/:存放數(shù)據(jù)庫、文件存儲等持久化數(shù)據(jù)config/:存放后端服務(wù)配置文件static/:存放靜態(tài)資源(圖片、視頻、文檔等)
步驟 2:登錄鏡像倉庫
根據(jù)你使用的鏡像倉庫類型,執(zhí)行對應(yīng)的登錄命令,獲取鏡像拉取權(quán)限:
通用登錄命令
# 替換為你的鏡像倉庫地址、用戶名和密碼/令牌 docker login [鏡像倉庫地址] -u [用戶名] --password-stdin
常見鏡像倉庫登錄示例
# 1. Docker Hub docker login -u your-docker-username --password-stdin # 2. GitHub Container Registry (GHCR) export GITHUB_TOKEN=your-github-personal-access-token export GITHUB_USER=[你github的user] echo $GITHUB_TOKEN | docker login ghcr.io -u $GITHUB_USER --password-stdin # 3. 阿里云容器鏡像服務(wù) (ACR) docker login registry.cn-hangzhou.aliyuncs.com -u your-aliyun-username --password-stdin
登錄成功后,終端會提示 Login Succeeded。
步驟 3:編寫通用 Docker Compose 配置文件
在 ~/your-project 目錄下創(chuàng)建 docker-compose.yml 文件,以下是通用模板,只需替換尖括號 <> 中的內(nèi)容即可適配你的后端服務(wù):
# 通用后端服務(wù)自動化部署配置
# 使用 Watchtower 實(shí)現(xiàn)鏡像自動檢測與更新
version: '3.8'
services:
# 你的后端服務(wù)
backend:
image: <你的后端鏡像地址:標(biāo)簽> # 例如: ghcr.io/username/backend:latest
container_name: <容器名稱> # 例如: my-backend
restart: always # 容器異常自動重啟
ports:
- "<主機(jī)端口>:<容器內(nèi)端口>" # 例如: "8080:8080"
volumes:
# 掛載日志目錄(將容器內(nèi)日志映射到宿主機(jī))
- ./logs:/app/logs
# 掛載數(shù)據(jù)目錄(持久化數(shù)據(jù)庫、文件等數(shù)據(jù))
- ./data:/app/data
# 掛載配置文件(如需外部配置)
# - ./config/application.yml:/app/application.yml:ro
environment:
# 時(shí)區(qū)配置(統(tǒng)一為上海時(shí)區(qū))
- TZ=Asia/Shanghai
# 你的后端服務(wù)環(huán)境變量(根據(jù)實(shí)際需求添加)
- SPRING_PROFILES_ACTIVE=prod
- DATABASE_URL=jdbc:mysql://db:3306/mydb
- REDIS_URL=redis://redis:6379
extra_hosts:
# 允許容器訪問宿主機(jī)服務(wù)(如需連接宿主機(jī)數(shù)據(jù)庫/Redis)
- "host.docker.internal:host-gateway"
healthcheck:
# 健康檢查配置(確保服務(wù)正常啟動后才對外提供服務(wù))
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:<容器內(nèi)端口>/health"]
interval: 30s # 檢查間隔
timeout: 3s # 超時(shí)時(shí)間
start_period: 10s # 啟動等待時(shí)間
retries: 3 # 重試次數(shù)
labels:
# Watchtower 自動更新標(biāo)簽(必須添加)
- "com.centurylinklabs.watchtower.enable=true"
# Watchtower 作用域標(biāo)簽(可選,用于區(qū)分不同服務(wù)組)
- "com.centurylinklabs.watchtower.scope=backend"
depends_on:
# 如需依賴其他服務(wù)(如數(shù)據(jù)庫、Redis),在此處聲明
# - db
# - redis
# Watchtower 自動更新服務(wù)(全局只需部署一個)
watchtower:
image: containrrr/watchtower:1.7.1
container_name: watchtower
restart: always
volumes:
# 掛載Docker套接字,用于管理容器生命周期
- /var/run/docker.sock:/var/run/docker.sock
# 掛載Docker認(rèn)證配置,用于拉取私有鏡像
- /root/.docker/config.json:/config.json:ro
environment:
- TZ=Asia/Shanghai
# 僅監(jiān)控帶有 com.centurylinklabs.watchtower.enable=true 標(biāo)簽的容器
- WATCHTOWER_LABEL_ENABLE=true
# 作用域配置(與后端服務(wù)保持一致)
- WATCHTOWER_SCOPE=backend
# 自動清理更新后的舊鏡像,釋放磁盤空間
- WATCHTOWER_CLEANUP=true
# 定時(shí)檢查更新(Cron表達(dá)式:秒 分 時(shí) 日 月 周)
# 示例:每天凌晨2點(diǎn)檢查更新
- WATCHTOWER_SCHEDULE=0 0 2 * * *
# 包含重啟中的容器
- WATCHTOWER_INCLUDE_RESTARTING=true
# 不包含已停止的容器
- WATCHTOWER_INCLUDE_STOPPED=false
# 更新完成后發(fā)送通知(可選,支持Slack/釘釘/企業(yè)微信等)
# - WATCHTOWER_NOTIFICATIONS=slack
# - WATCHTOWER_NOTIFICATION_URL=slack://webhook-url
# 調(diào)試模式(生產(chǎn)環(huán)境建議關(guān)閉)
- WATCHTOWER_DEBUG=false關(guān)鍵配置說明
| 配置項(xiàng) | 作用 | 通用建議 |
|---|---|---|
restart: always | 容器退出時(shí)自動重啟 | 生產(chǎn)環(huán)境必須開啟 |
volumes | 數(shù)據(jù)持久化 | 所有需要保留的數(shù)據(jù)都應(yīng)掛載到宿主機(jī) |
healthcheck | 服務(wù)健康檢查 | 必須實(shí)現(xiàn) /health 接口,確保服務(wù)可用性 |
WATCHTOWER_SCHEDULE | 更新檢查頻率 | 建議設(shè)置在業(yè)務(wù)低峰期(如凌晨 2-4 點(diǎn)) |
WATCHTOWER_CLEANUP | 自動清理舊鏡像 | 生產(chǎn)環(huán)境必須開啟,避免磁盤爆滿 |
步驟 4:啟動自動化部署服務(wù)
進(jìn)入項(xiàng)目目錄,執(zhí)行以下命令啟動所有服務(wù):
cd ~/your-project docker compose up -d
Docker 會自動完成以下操作:
- 拉取后端服務(wù)和 Watchtower 的最新鏡像
- 按照配置創(chuàng)建并啟動容器
- Watchtower 開始監(jiān)控后端服務(wù)的鏡像更新
通用日常運(yùn)維操作
1. 查看服務(wù)運(yùn)行狀態(tài)
# 查看所有容器狀態(tài) docker compose ps # 查看單個容器狀態(tài) docker ps | grep <容器名稱>
2. 查看服務(wù)日志
# 實(shí)時(shí)查看所有服務(wù)日志 docker compose logs -f # 實(shí)時(shí)查看后端服務(wù)日志 docker compose logs -f backend # 查看最近100行日志 docker compose logs --tail 100 backend
3. 手動更新鏡像
若需跳過 Watchtower 定時(shí)任務(wù),立即更新后端服務(wù):
# 拉取最新鏡像 docker compose pull backend # 重啟后端服務(wù)(Watchtower會自動執(zhí)行此步驟) docker compose restart backend
4. 停止和刪除服務(wù)
# 停止所有服務(wù) docker compose down # 停止服務(wù)并刪除數(shù)據(jù)卷(謹(jǐn)慎使用!會刪除所有持久化數(shù)據(jù)) docker compose down -v
5. 驗(yàn)證自動化更新
當(dāng)你將新版本的后端鏡像推送到鏡像倉庫后,Watchtower 會在配置的時(shí)間自動執(zhí)行以下操作:
- 檢測到鏡像有新版本
- 拉取最新鏡像
- 停止舊容器
- 使用新鏡像啟動新容器
- 清理舊鏡像全程無需人工干預(yù),服務(wù)中斷時(shí)間僅為容器重啟時(shí)間(通常幾秒)。
高級配置與最佳實(shí)踐
1. 使用 .env 文件管理環(huán)境變量
為避免在 docker-compose.yml 中硬編碼敏感信息,推薦使用 .env 文件管理環(huán)境變量:
# 在項(xiàng)目目錄下創(chuàng)建 .env 文件 touch ~/your-project/.env
在 .env 文件中添加環(huán)境變量:
# 數(shù)據(jù)庫配置 DATABASE_URL=jdbc:mysql://db:3306/mydb DATABASE_USERNAME=root DATABASE_PASSWORD=your-password # Redis配置 REDIS_URL=redis://redis:6379 REDIS_PASSWORD=your-redis-password # Watchtower配置 WATCHTOWER_SCHEDULE=0 0 2 * * *
然后在 docker-compose.yml 中引用這些變量:
environment:
- DATABASE_URL=${DATABASE_URL}
- DATABASE_USERNAME=${DATABASE_USERNAME}
- DATABASE_PASSWORD=${DATABASE_PASSWORD}2. 多服務(wù)部署
如果需要在同一臺服務(wù)器上部署多個后端服務(wù),只需:
- 為每個服務(wù)創(chuàng)建獨(dú)立的項(xiàng)目目錄
- 在每個服務(wù)的
docker-compose.yml中添加不同的WATCHTOWER_SCOPE - 全局只需部署一個 Watchtower 服務(wù)(或?yàn)槊總€服務(wù)組部署獨(dú)立的 Watchtower)
3. 配置更新通知
Watchtower 支持多種通知方式,當(dāng)容器更新完成后自動發(fā)送通知:
environment: # 釘釘通知 - WATCHTOWER_NOTIFICATIONS=dingtalk - WATCHTOWER_NOTIFICATION_URL=dingtalk://token@secret # 企業(yè)微信通知 - WATCHTOWER_NOTIFICATIONS=wechatwork - WATCHTOWER_NOTIFICATION_URL=wechatwork://webhook-url # 郵件通知 - WATCHTOWER_NOTIFICATIONS=email - WATCHTOWER_NOTIFICATION_EMAIL_FROM=your-email@example.com - WATCHTOWER_NOTIFICATION_EMAIL_TO=admin@example.com - WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.example.com - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587 - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=your-email@example.com - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=your-email-password
到此這篇關(guān)于基于Docker+Watchtower自動化部署后端服務(wù)的文章就介紹到這了,更多相關(guān)Docker Watchtower自動化部署內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Cloud中使用jib進(jìn)行docker部署的步驟詳解
這篇文章主要介紹了Spring Cloud中使用jib進(jìn)行docker部署的步驟詳解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
docker使用dockercompose編排一個Hadoop集群方式
這篇文章主要介紹了docker使用dockercompose編排一個Hadoop集群方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Docker?部署?OnlyOffice?文檔服務(wù)器的操作方法
本文詳細(xì)介紹了如何使用Docker部署OnlyOffice文檔服務(wù)器,包括準(zhǔn)備工作、設(shè)置變量和目錄結(jié)構(gòu)、創(chuàng)建并運(yùn)行OnlyOffice容器、訪問OnlyOffice文檔服務(wù)器以及配置和管理,通過這些步驟,你可以在本地快速搭建一個強(qiáng)大的文檔編輯平臺,感興趣的朋友一起看看吧2025-02-02
在Dockerfile中copy和add的區(qū)別及說明
COPY和ADD都是Dockerfile中用于文件復(fù)制的命令,但COPY僅用于本地文件或目錄的復(fù)制,不支持自動解壓縮;而ADD除了復(fù)制本地文件或目錄外,還支持解壓縮和從URL下載文件,在一般情況下,建議使用COPY命令2025-03-03
使用Docker部署Tomcat的實(shí)現(xiàn)示例
在本地編寫好了Spring項(xiàng)目,為了實(shí)現(xiàn)能夠隨時(shí)地訪問,所以需要將項(xiàng)目部署到服務(wù)器,本文主要介紹了使用Docker部署Tomcat的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11
docker將鏡像打包為.tar包實(shí)現(xiàn)方法
使用tar包格式進(jìn)行壓縮,方便在不同的docker主機(jī)之間進(jìn)行遷移和備份,下面這篇文章主要給大家介紹了關(guān)于docker將鏡像打包為.tar包的實(shí)現(xiàn)方法,需要的朋友可以參考下2024-07-07
Docker查看正在運(yùn)行的容器目錄的實(shí)現(xiàn)方式
這篇文章主要介紹了Docker查看正在運(yùn)行的容器目錄的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
Spring?Boot?分層打包?Docker?鏡像實(shí)踐及分析(推薦)
這篇文章主要介紹了Spring?Boot?分層打包?Docker?鏡像實(shí)踐及分析,本文通過圖文并茂的形式實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12

