Docker中配置容器啟動優(yōu)先級與依賴關(guān)系
Docker 中配置容器啟動優(yōu)先級與依賴關(guān)系主要通過 depends_on 和 healthcheck 實現(xiàn)。
1. 基礎(chǔ)依賴:depends_on
僅控制啟動順序,不等待服務(wù)就緒。
version: "3.9"
services:
web:
build: .
depends_on:
- db # web 在 db 之后啟動
- redis # 支持多個依賴
db:
image: postgres:15
redis:
image: redis:7?? 關(guān)鍵限制:depends_on 只保證容器啟動順序,不等待服務(wù)真正可用(如數(shù)據(jù)庫完成初始化)。如果 web 啟動時 db 還在初始化,連接會失敗。
2. 等待服務(wù)就緒:條件依賴(Compose v2.20+ / v3.4+)
通過 condition 實現(xiàn)真正的啟動順序控制。
方案 A:健康檢查依賴(推薦)
services:
web:
build: .
depends_on:
db:
condition: service_healthy # 等待 db 健康
redis:
condition: service_healthy
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: secret
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s # 檢查間隔
timeout: 3s # 超時時間
retries: 5 # 重試次數(shù)
start_period: 10s # 啟動寬限期
redis:
image: redis:7
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 5方案 B:等待容器退出(用于初始化任務(wù))
services:
web:
build: .
depends_on:
migration:
condition: service_completed_successfully # 等待 migration 正常退出
migration:
image: myapp
command: ["python", "manage.py", "migrate"]3. 健康檢查詳解
常用服務(wù)的健康檢查配置
| 服務(wù) | 健康檢查命令 |
|---|---|
| PostgreSQL | pg_isready -U <user> 或 pg_isready -d <dbname> |
| MySQL | mysqladmin ping -h localhost |
| Redis | redis-cli ping(返回 PONG) |
| MongoDB | mongosh --eval 'db.adminCommand("ping")' |
| Elasticsearch | curl -f http://localhost:9200/_cluster/health |
| 自定義 HTTP | curl -f http://localhost:8080/health |
健康檢查參數(shù)
healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s # 檢查間隔(默認(rèn) 30s) timeout: 10s # 單次檢查超時(默認(rèn) 30s) retries: 3 # 失敗重試次數(shù)(默認(rèn) 3) start_period: 40s # 容器啟動后多久開始檢查(默認(rèn) 0s) disable: false # 禁用健康檢查
4. 啟動優(yōu)先級控制(Swarm Mode)
Docker Swarm 提供額外的優(yōu)先級機(jī)制:
version: "3.9"
services:
web:
image: nginx
deploy:
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
update_config:
parallelism: 1
delay: 10s
order: start-first # 先啟動新容器再停止舊容器
rollback_config:
order: stop-first # 先停止舊容器再啟動新容器5. 實戰(zhàn):完整的多層依賴架構(gòu)
version: "3.9"
services:
# 最底層:數(shù)據(jù)庫
postgres:
image: postgres:15-alpine
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: secret
POSTGRES_DB: myapp
volumes:
- pg_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app -d myapp"]
interval: 5s
timeout: 3s
retries: 5
start_period: 10s
# 第二層:緩存
redis:
image: redis:7-alpine
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 5
# 第三層:消息隊列
rabbitmq:
image: rabbitmq:3-management-alpine
healthcheck:
test: rabbitmq-diagnostics -q ping
interval: 10s
timeout: 5s
retries: 5
# 第四層:數(shù)據(jù)庫遷移(一次性任務(wù))
migration:
build: .
command: ["python", "manage.py", "migrate"]
depends_on:
postgres:
condition: service_healthy
profiles: ["setup"] # 默認(rèn)不啟動,需 docker compose --profile setup up
# 第五層:后臺工作者
worker:
build: .
command: ["celery", "-A", "tasks", "worker", "-l", "info"]
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
rabbitmq:
condition: service_healthy
environment:
DATABASE_URL: postgresql://app:secret@postgres/myapp
REDIS_URL: redis://redis:6379
BROKER_URL: amqp://guest:guest@rabbitmq:5672
# 最上層:Web 應(yīng)用
web:
build: .
ports:
- "8000:8000"
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
rabbitmq:
condition: service_healthy
worker:
condition: service_started # 只需 worker 啟動即可
environment:
DATABASE_URL: postgresql://app:secret@postgres/myapp
REDIS_URL: redis://redis:6379
volumes:
pg_data:6. 驗證與調(diào)試
# 查看容器健康狀態(tài)
docker compose ps
# 查看健康檢查日志
docker inspect --format='{{.State.Health}}' <container_id>
# 手動測試健康檢查命令
docker compose exec postgres pg_isready -U app
# 強(qiáng)制按依賴順序重建
docker compose up --build --force-recreate關(guān)鍵要點總結(jié)
| 需求 | 解決方案 |
|---|---|
| 僅控制啟動順序 | depends_on(無條件) |
| 等待服務(wù)真正可用 | depends_on + condition: service_healthy + healthcheck |
| 等待初始化任務(wù)完成 | condition: service_completed_successfully |
| 多層復(fù)雜依賴鏈 | 逐層配置 healthcheck + depends_on |
| 生產(chǎn)環(huán)境高可用 | 結(jié)合 Docker Swarm 的 deploy 配置 |
到此這篇關(guān)于Docker中配置容器啟動優(yōu)先級與依賴關(guān)系的文章就介紹到這了,更多相關(guān)Docker 容器啟動優(yōu)先級與依賴關(guān)系內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker-compose配置并部署redis服務(wù)的實現(xiàn)
本文主要介紹了docker-compose配置并部署redis服務(wù)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
docker部署springBoot項目實操(docker是什么)
Docker可以讓開發(fā)者打包他們的應(yīng)用以及依賴包到一個輕量級、可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實現(xiàn)虛擬化,這篇文章主要介紹了docker部署springBoot項目實操,需要的朋友可以參考下2025-03-03
docke-cli的調(diào)試環(huán)境搭建過程
在搭建docker-cli的調(diào)試環(huán)境時,遇到很多坑,通過本文講解下搭建docke-cli的調(diào)試環(huán)境的詳細(xì)方法,需要的朋友可以參考下2022-11-11
如何在Docker中設(shè)置容器間通信的權(quán)限和訪問控制策略
文章介紹了使用Docker網(wǎng)絡(luò)進(jìn)行訪問控制的方法,包括自定義Bridge網(wǎng)絡(luò)、基于容器名稱的訪問控制和使用網(wǎng)絡(luò)策略(如Calico)進(jìn)行更精細(xì)的控制2024-11-11
Docker部署HertzBeat實時監(jiān)控告警系統(tǒng)
HertzBeat是一款開源的實時監(jiān)控告警系統(tǒng),本文就來介紹一下Docker部署HertzBeat實時監(jiān)控告警系統(tǒng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11
docker?Get?https://registry-1.docker.io/v2/:?net/http:?r
本文主要介紹了docker?Get?https://registry-1.docker.io/v2/:?net/http:?request?canceled?報錯,具有一定的參考價值,感興趣的可以了解一下2025-03-03

