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

