Docker的docker-compose类比Spring的ApplicationContext

总一句话是: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

javascript 复制代码
# 启动 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 文件控制应用的启动顺序和网络和硬件资源所需

javascript 复制代码
version: '3.8'
# 指定 Docker Compose 文件格式版本

services:
  # 应用服务
  appweb:
    image: your-app-image
    container_name: appweb
    depends_on:
      - pgsql
      - redis
    networks:
      - my_network

  # PostgreSQL 数据库服务
  pgsql:
    image: postgres:14
    container_name: pgsql
    environment:
      POSTGRES_USER: your_user
      POSTGRES_PASSWORD: your_password
      POSTGRES_DB: your_database
    volumes:
      - pg_data:/var/lib/postgresql/data
    networks:
      - my_network

  # Redis 缓存服务
  redis:
    image: redis:6
    container_name: redis
    volumes:
      - redis_data:/data
    networks:
      - my_network

  # Nginx 反向代理服务
  nginx:
    image: nginx:stable
    container_name: nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
    depends_on:
      - appweb
    networks:
      - my_network

  # Elasticsearch 搜索引擎服务
  elasticsearch:
    image: elasticsearch:7.12.0
    container_name: elasticsearch
    environment:
      - "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/plugins
    ports:
      - "9200:9200"
      - "9300:9300"
    networks:
      - my_network

volumes:
  # 定义持久化数据卷
  pg_data:
  redis_data:
  es_data:
  es_plugins:

networks:
  # 自定义网络,用于服务间通信
  my_network:
    driver: bridge

假设一个场景 我现在要在上面的基础增加一个sentinel 做流控的,应该怎么做?

**第一方式:**在上面的compose.yml 继续增加配置

第二种方式:新写一个compose.yml配置文件,然后在运行时覆盖合并

创建一个新的文件,比如 docker-compose-sentinel.yml

javascript 复制代码
version: '3.8'

services:
  # 新增的 Sentinel 服务
  sentinel:
    image: your-sentinel-image
    container_name: sentinel
    depends_on:
      - appweb
    networks:
      - my_network

networks:
  my_network:
    external: true
javascript 复制代码
docker-compose -f docker-compose.yml -f docker-compose-sentinel.yml up

docker compose 常用命令

javascript 复制代码
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-cache




docker-compose up -d # 后台启动所有服务

docker-compose down # 删除容器、网络、卷、镜像

docker-compose ps  # 查看正在运行的容器

docker-compose top  # 查看容器进程

docker-compose exec <docker-compose.yml中写的某个服务id> /bin/bash


docker-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/

javascript 复制代码
docker volume create portainer_data

docker 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:latest


sudo docker restart portainer
相关推荐
愿你天黑有灯下雨有伞4 小时前
Spring Boot SSE实战:SseEmitter实现多客户端事件广播与心跳保活
java·spring boot·spring
KNeeg_6 小时前
Spring循环依赖以及三个级别缓存
java·spring·缓存
AI_Gump7 小时前
【AI阅读】20250717阅读输入
java·spring boot·spring
ldj20207 小时前
docker 自定义网桥作用
docker·容器
土豆丶杨9 小时前
centos 配置docker
docker·eureka·centos
懂得节能嘛.9 小时前
【SpringAI实战】ChatPDF实现RAG知识库
java·后端·spring
探索java9 小时前
Spring 解析 XML 配置文件的过程(从读取 XML 到生成 BeanDefinition)
xml·java·spring·xmlbeanfactory
杰哥的狗9 小时前
nacos连接失败,启动失败常见问题
linux·docker
DarkAthena10 小时前
【GaussDB】构建一个GaussDB的Docker镜像
数据库·docker·gaussdb