实战演练-通过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
​
相关推荐
架构精进之路5 分钟前
Deepseek 这么厉害,普通人怎么用好它?
后端·langchain·ai编程
uhakadotcom43 分钟前
BentoML远程代码执行漏洞(CVE-2025-27520)详解与防护指南
后端·算法·面试
xmyLydia1 小时前
我做了一个代码生成器:Spring Boot + Angular 全自动构建
后端
supermfc1 小时前
Docker方式离线部署OpenWebUI
后端·deepseek
橘猫云计算机设计2 小时前
基于django云平台的求职智能分析系统(源码+lw+部署文档+讲解),源码可白嫖!
数据库·spring boot·后端·python·django·毕业设计
码农小站2 小时前
MyBatis-Plus 表字段策略详解:@TableField(updateStrategy) 的配置与使用指南
java·后端
技术小丁2 小时前
使用PHP将PDF转换为图片(windows + PHP + ImageMagick)
后端
李憨憨2 小时前
深入探究MapStruct:高效Java Bean映射工具的全方位解析
java·后端
仰望星空的打工人2 小时前
若依改用EasyCaptcha验证码
后端
雷渊2 小时前
通俗易懂的来解释倒排索引
java·后端·面试