?總一句話是:Docker Compose:集中化管理多個容器及其依賴的資源環境;ApplicationContext:集中化管理 多個Bean 及其運行所需的資源和依賴關系。
1.?整體概念
- Docker Compose:用于定義和運行多容器 Docker 應用程序,通過一個 YAML 文件集中管理多個服務、網絡和卷。
- Spring ApplicationContext:Spring 框架的核心接口之一,負責加載 Bean 定義、管理 Bean 生命周期及提供依賴注入。
2.?配置方式
- Docker Compose:使用?
docker-compose.yml
?文件以聲明式的方式配置服務、網絡和存儲卷。 - Spring ApplicationContext:通過 XML 配置文件或注解(如?
@Configuration
,?@Bean
)聲明式地定義和配置 Bean 及其依賴關系。
3.?依賴管理
- Docker Compose:可以指定服務間的啟動順序和依賴關系,確保某些服務在其他服務之前啟動。
- Spring ApplicationContext:通過依賴注入機制自動處理 Bean 之間的依賴關系,保證每個 Bean 在需要時都能獲得所需的依賴對象。
4.?上下文環境
- Docker Compose:創建一個共享資源(如網絡、卷)的上下文環境,使所有服務能協同工作。
- Spring ApplicationContext:提供一個運行時環境,所有 Bean 共享相同的配置和資源,形成完整的應用程序上下文。
5.?生命周期管理
- Docker Compose:負責啟動、停止和重啟整個應用棧中的所有服務,并同步執行這些操作。
- Spring ApplicationContext:負責初始化、刷新和關閉所有的 Spring Beans,確保它們按正確的順序被創建和銷毀。
docker-compose 集中管理原理
按照以前啟動少量的容器,我們可以一個一個執行docker run?
# 啟動 MySQL 數據庫
docker run -d --name db \-e MYSQL_ROOT_PASSWORD=my-secret-pw \mysql:latest# 啟動 Web 應用
docker run -d --name webapp \--link db:mysql \-p 8080:80 \my-webapp:latest
?現在docker-compose 是將不同的實例啟動運行參數寫在同一個配置文件,解析yml 文件控制應用的啟動順序和網絡和硬件資源所需
version: '3.8'
# 指定 Docker Compose 文件格式版本services:# 應用服務appweb:image: your-app-imagecontainer_name: appwebdepends_on:- pgsql- redisnetworks:- my_network# PostgreSQL 數據庫服務pgsql:image: postgres:14container_name: pgsqlenvironment:POSTGRES_USER: your_userPOSTGRES_PASSWORD: your_passwordPOSTGRES_DB: your_databasevolumes:- pg_data:/var/lib/postgresql/datanetworks:- my_network# Redis 緩存服務redis:image: redis:6container_name: redisvolumes:- redis_data:/datanetworks:- my_network# Nginx 反向代理服務nginx:image: nginx:stablecontainer_name: nginxports:- "80:80"- "443:443"volumes:- ./nginx/conf.d:/etc/nginx/conf.ddepends_on:- appwebnetworks:- my_network# Elasticsearch 搜索引擎服務elasticsearch:image: elasticsearch:7.12.0container_name: elasticsearchenvironment:- "cluster.name=es-cluster"- "discovery.type=single-node"- "ES_JAVA_OPTS=-Xms512m -Xmx1024m"volumes:- es_data:/usr/share/elasticsearch/data- es_plugins:/usr/share/elasticsearch/pluginsports:- "9200:9200"- "9300:9300"networks:- my_networkvolumes:# 定義持久化數據卷pg_data:redis_data:es_data:es_plugins:networks:# 自定義網絡,用于服務間通信my_network:driver: bridge
假設一個場景 我現在要在上面的基礎增加一個sentinel 做流控的,應該怎么做?
第一方式:在上面的compose.yml? 繼續增加配置?
第二種方式:新寫一個compose.yml配置文件,然后在運行時覆蓋合并
創建一個新的文件,比如?docker-compose-sentinel.yml
version: '3.8'services:# 新增的 Sentinel 服務sentinel:image: your-sentinel-imagecontainer_name: sentineldepends_on:- appwebnetworks:- my_networknetworks:my_network:external: true
docker-compose -f docker-compose.yml -f docker-compose-sentinel.yml up
docker compose 常用命令
docker-compose -h # 查看幫助docker-compose --version # 查看版本docker-compose -f <my-docker-compose.yml> build # 指定單個文件構建鏡像# 迭代構建:假設你有兩個文件
docker-compose.base.yml:包含所有服務的基礎配置。
docker-compose.dev.yml:僅在開發環境中需要的配置,比如調試工具和開發依賴docker-compose -f docker-compose.base.yml -f docker-compose.dev.yml build# 忽略緩存,強制重新構建鏡像
docker-compose build --no-cachedocker-compose up -d # 后臺啟動所有服務docker-compose down # 刪除容器、網絡、卷、鏡像docker-compose ps # 查看正在運行的容器docker-compose top # 查看容器進程docker-compose exec <docker-compose.yml中寫的某個服務id> /bin/bashdocker-compose logs <<docker-compose.yml中寫的某個服務id>docker-compose config -q # 檢查配置,有錯誤會輸出docker-compose restart # 重啟服務docker-compose start # 啟動服務docker-compose stop # 停止服務
補充安裝可視化UI,由于dockerhup 用不了 所以使用國內的鏡像提供商,花5塊錢就可以了Docker鏡像極速下載服務 - 毫秒鏡像https://1ms.run/
docker volume create portainer_datadocker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart always \-v /var/run/docker.sock:/var/run/docker.sock \-v portainer_data:/data \docker.1ms.run/portainer/portainer:latestsudo docker restart portainer