实战演练-通过docker-compose部署项目中间件


一、如何运行这个 docker-compose

运行一个 docker-compose 文件非常简单,前提是你已经安装了 Docker 和 Docker Compose。以下是步骤:

  1. 确保环境准备就绪

    • 安装 Docker:sudo apt install docker.io(Linux 示例)
    • 安装 Docker Compose:sudo apt install docker-compose(Linux 示例)
    • 验证安装:docker --versiondocker-compose --version
  2. 准备文件和目录

    • docker-compose.yml 保存到一个目录中(例如 TestProject)。
    • 创建必要的挂载目录(如 ./mysql/data./minio/data 等)。这些目录在 volumes 中定义,用于持久化数据。如果不创建,Docker 会自动创建,但可能权限不够。
  3. 运行 docker-compose

    • 进入文件所在目录:cd TestProject

    • 执行启动命令:docker-compose up -d

      • -d 表示后台运行。
    • 检查运行状态:docker-compose ps

    • 查看日志:docker-compose logs(或针对某个服务,如 docker-compose logs TestProject-mysql

  4. 停止和清理

    • 停止服务:docker-compose down
    • 删除容器和网络(保留数据卷):docker-compose down
    • 删除数据卷(彻底清理):docker-compose down -v

二、这个 docker-compose 包含了什么?是否包含中间件和微服务?

docker-compose.yml 文件来看:

  • 包含的内容

    • 这个文件定义了多个服务,包括 MySQL、Redis、MinIO、Nacos、Seata、Elasticsearch、Kibana、Canal、RocketMQ(NameServer、Broker、Console)等。
    • 这些服务都是中间件,用于支持微服务架构(如数据库、消息队列、配置中心、分布式事务等)。
    • 没有直接包含微服务。微服务通常是你的业务代码(例如 Spring Boot 应用),需要单独定义并通过镜像或构建方式加入。
  • 结论

    • 这个 docker-compose 是为微服务项目提供基础设施支持的中间件集合,但不包含具体的微服务业务逻辑。
    • 如果你想部署一个完整的微服务项目,还需要添加你的微服务(例如 TestProject-user-serviceTestProject-order-service 等)。

三、部署微服务项目需要写哪些部分?

要部署一个微服务项目,通常需要以下部分:

  1. 中间件

    • 数据库(如 MySQL、Redis)
    • 配置中心(如 Nacos)
    • 消息队列(如 RocketMQ)
    • 对象存储(如 MinIO)
    • 分布式事务管理(如 Seata)
    • 日志和搜索(如 Elasticsearch、Kibana)
    • 数据同步(如 Canal)
  2. 微服务

    • 业务代码(例如用 Spring Boot 编写)
    • Dockerfile(用于构建微服务镜像)
    • 服务之间的依赖关系(通过 depends_on 或网络配置)
  3. 网络配置

    • 定义 Docker 网络(如 rocketmq 网络)以确保服务间通信。
  4. 持久化存储

    • 数据卷(volumes)用于保存数据库、日志等数据。
  5. 环境变量

    • 配置中间件和服务所需的参数(如数据库密码、IP 地址)。

四、在 docker-compose 中配置中间件和服务的内容

4.1 中间件配置

中间件是为微服务提供支持的基础设施,需要配置端口、持久化存储、环境变量等。

配置项 说明 示例(从你的文件)
image 指定中间件镜像 mysql:8.0
container_name 容器名称,便于管理 TestProject-mysql
restart 重启策略(always 表示总是重启) restart: always
ports 映射宿主机和容器的端口 3306:3306
volumes 数据持久化挂载路径 ./mysql/data:/var/lib/mysql
environment 环境变量(如密码、配置参数) MYSQL_ROOT_PASSWORD=root
depends_on 依赖关系,确保启动顺序 depends_on: TestProject-mysql
command 覆盖默认启动命令 server /data(MinIO 示例)

4.2 微服务配置

微服务是你自己的业务代码,通常需要自定义镜像并依赖中间件。

配置项 说明 示例(假设添加一个微服务)
image 指定微服务镜像(可通过 Dockerfile 构建) TestProject-user-service:latest
build 本地构建镜像(替代 image build: ./user-service
container_name 容器名称 TestProject-user-service
restart 重启策略 restart: always
ports 暴露微服务端口 8080:8080
volumes 挂载配置文件或日志 ./user-service/logs:/app/logs
environment 配置微服务依赖的中间件地址、端口等 SPRING_DATASOURCE_URL=jdbc:mysql://TestProject-mysql:3306/db
depends_on 依赖的中间件 depends_on: [TestProject-mysql, TestProject-nacos]

五、Mermaid 思维导图

以下是用 Mermaid 绘制的思维导图,展示 docker-compose 的结构和配置要点:

makefile 复制代码
Docker-Compose 配置
中间件
微服务
网络配置
镜像: image
端口: ports
数据卷: volumes
环境变量: environment
依赖: depends_on
重启策略: restart
镜像: image 或 build
端口: ports
数据卷: volumes
环境变量: environment
依赖: depends_on
重启策略: restart
网络名称: networks
驱动: driver
别名: aliases

六、如何扩展这个 docker-compose 添加微服务

假设你有一个微服务 TestProject-user-service,可以用以下方式添加到 docker-compose.yml

yaml 复制代码
version: "3.5"
​
services:
  # 已有中间件配置保持不变...
​
  TestProject-user-service:
    image: TestProject-user-service:latest  # 假设你已构建镜像
    # build: ./user-service  # 如果需要本地构建,替换 image
    container_name: TestProject-user-service
    restart: always
    ports:
      - 8080:8080
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://TestProject-mysql:3306/TestProject_db
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=root
      - NACOS_SERVER_ADDR=TestProject-nacos:8848
    depends_on:
      - TestProject-mysql
      - TestProject-nacos
    volumes:
      - ./user-service/logs:/app/logs
    networks:
      - rocketmq  # 如果需要与 RocketMQ 通信
​
networks:
  rocketmq:
    name: rocketmq
    driver: bridge

yaml 复制代码
version: "3.5"
​
services:
  TestProject-mysql:
    image: mysql:8.0
    container_name: TestProject-mysql
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=root
    ports:
      - 3306:3306
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/my.cnf:/etc/mysql/my.cnf
      - ./mysql/initdb:/docker-entrypoint-initdb.d
      - ./mysql/mysql-files:/var/lib/mysql-files
​
  TestProject-minio:
    image: minio/minio:RELEASE.2021-06-17T00-10-46Z
    container_name: TestProject-minio
    restart: always
    command: server /data
    ports:
      - 9000:9000
    volumes:
      - ./minio/data:/data
    environment:
      - MINIO_ROOT_USER=admin
      - MINIO_ROOT_PASSWORD=admin123456
​
  TestProject-redis:
    image: redis:6.2
    container_name: TestProject-redis
    restart: always
    ports:
      - 6379:6379
​
  TestProject-nacos:
    image: nacos/nacos-server:2.0.2
    container_name: TestProject-nacos
    restart: always
    depends_on:
      - TestProject-mysql
    ports:
      - 8848:8848
      - 9848:9848
      - 9849:9849
    environment:
      - JVM_XMS=256m
      - JVM_XMX=256m
      - MODE=standalone
      - PREFER_HOST_MODE=hostname
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=192.168.1.46
      - MYSQL_SERVICE_DB_NAME=TestProject_nacos
      - MYSQL_SERVICE_USER=root
      - MYSQL_SERVICE_PASSWORD=root
    volumes:
      - ./nacos/logs:/home/nacos/logs
​
​
  TestProject-seata:
    image: seataio/seata-server:1.4.2
    container_name: TestProject-seata
    restart: always
    depends_on:
      - TestProject-mysql
      - TestProject-nacos
    ports:
      - 8091:8091
    environment:
      - SEATA_IP=192.168.1.46
      - SEATA_CONFIG_NAME=file:/root/seata-config/registry
    volumes:
      - ./seata:/root/seata-config
​
  TestProject-elasticsearch:
    image: elasticsearch:7.13.2
    container_name: TestProject-elasticsearch
    restart: always
    ports:
      - 9200:9200
      - 9300:9300
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
    volumes:
      - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - ./elasticsearch/data:/usr/share/elasticsearch/data
      - ./elasticsearch/plugins:/usr/share/elasticsearch/plugins
​
  TestProject-kibana:
    image: kibana:7.13.2
    container_name: TestProject-kibana
    restart: always
    ports:
      - 5601:5601
    links:
      - TestProject-elasticsearch:elasticsearch
    depends_on:
      - TestProject-elasticsearch
​
  TestProject-canal:
    image: canal/canal-server:v1.1.5
    container_name: TestProject-canal
    restart: always
    ports:
      - 11111:11111
    environment:
      - SEATA_IP=192.168.1.46
    volumes:
      - ./canal/conf/example:/home/admin/canal-server/conf/example
      - ./canal/conf/canal.properties:/home/admin/canal-server/conf/canal.properties
      - ./canal/logs:/home/admin/canal-server/logs
​
​
​
​
  TestProject-rocketmq-namesrv:
    image: foxiswho/rocketmq:4.8.0
    container_name: TestProject-rocketmq-namesrv
    restart: always
    ports:
      - 9876:9876
    volumes:
      - ./rocketmq/namesrv/logs:/home/rocketmq/logs
      - ./rocketmq/namesrv/store:/home/rocketmq/store
    environment:
      JAVA_OPT_EXT: "-Duser.home=/home/rocketmq -Xms512M -Xmx512M -Xmn128m"
    command: ["sh","mqnamesrv"]
    networks:
      rocketmq:
        aliases:
          - TestProject-rocketmq-namesrv
​
​
  TestProject-rocketmq-broker:
    image: foxiswho/rocketmq:4.8.0
    container_name: TestProject-rocketmq-broker
    restart: always
    ports:
      - 10909:10909
      - 10911:10911
    volumes:
      - ./rocketmq/broker/logs:/home/rocketmq/logs
      - ./rocketmq/broker/store:/home/rocketmq/store
      - ./rocketmq/broker/conf/broker.conf:/etc/rocketmq/broker.conf
    environment:
      JAVA_OPT_EXT: "-Duser.home=/home/rocketmq -Xms512M -Xmx512M -Xmn128m"
    command: ["sh","mqbroker","-c","/etc/rocketmq/broker.conf","-n","TestProject-rocketmq-namesrv:9876","autoCreateTopicEnable=true"]
    depends_on:
      - TestProject-rocketmq-namesrv
    networks:
      rocketmq:
        aliases:
          - TestProject-rocketmq-broker
​
​
  TestProject-rocketmq-console:
    image: styletang/rocketmq-console-ng
    container_name: TestProject-rocketmq-console
    restart: always
    ports:
      - 8180:8080
    environment:
      JAVA_OPTS: "-Drocketmq.namesrv.addr=TestProject-rocketmq-namesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false"
    depends_on:
      - TestProject-rocketmq-namesrv
    networks:
      rocketmq:
        aliases:
          - TestProject-rocketmq-console
​
​
networks:
  rocketmq:
    name: rocketmq
    driver: bridge
​
相关推荐
㳺三才人子6 小时前
初探 Flask
后端·python·flask·html
星栈独行6 小时前
我在 Rust 全栈项目里用 JWT 做无状态认证
开发语言·后端·rust·前端框架·开源·github·web
Java爱好狂.7 小时前
Java程序员体系化学习路线(2026最新版)
java·后端·java面试·java架构师·java程序员·java八股文·java学习路线
陈随易7 小时前
Redis 8.8发布,一定要更新
前端·后端·程序员
装不满的克莱因瓶7 小时前
SpringBoot 如何将 lib 目录中jar包打包进最终的jar包里面
spring boot·后端·maven·jar·mvn
ltl8 小时前
Transformer 原论文实验结果:为什么 28.4 BLEU 足以改写路线图
后端
excel8 小时前
为什么我推荐使用 Termius:现代 SSH 工具的完整体验
前端·后端
卷毛的技术笔记9 小时前
Java后端硬核实战:用Spring AI Alibaba+Redis给LLM装上“超强记忆中枢”
java·人工智能·redis·后端·spring·ai·系统架构
IT_陈寒10 小时前
Java的Optional差点让我掉坑里,这几个坑你别踩
前端·人工智能·后端
子兮曰10 小时前
Harness 驾驭工程深度教程:从 AGENTS.md 到全链路 AI 编码基础设施
前端·后端·ai编程