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
相关推荐
fire-flyer1 小时前
响应式客户端 WebClient详解
java·spring·reactor
北执南念1 小时前
基于 Spring 的策略模式框架,用于根据不同的类的标识获取对应的处理器实例
java·spring·策略模式
Java水解2 小时前
Spring Security6.3.x使用指南
后端·spring
Yeats_Liao4 小时前
Spring缓存(二):解决缓存雪崩、击穿、穿透问题
java·spring·缓存
饱饱要坚持可持续发展观6 小时前
docker 重命名镜像
docker
麦兜*7 小时前
MongoDB 与 GraphQL 结合:现代 API 开发新范式
java·数据库·spring boot·mongodb·spring·maven·graphql
知其然亦知其所以然8 小时前
SpringAI 玩转 OCI GenAI:这次我们聊聊 Cohere 聊天模型
java·后端·spring
羑悻的小杀马特8 小时前
Docker 容器化部署核心实战:从镜像仓库管理、容器多参数运行到 Nginx 服务配置与正反向代理原理解析
nginx·docker·容器·镜像仓库
记得开心一点嘛16 小时前
手搓Springboot
java·spring boot·spring
异常驯兽师18 小时前
Spring 中处理 HTTP 请求参数注解全解析
java·spring·http