Java 生态一站式 Docker Compose 配置(Windows 专用)
整理Java 开发最常用的全部中间件,全部使用最新稳定具体版本(无 latest),版本号集中定义可一键修改,适配 Windows 系统,包含专业注释、端口映射、数据持久化、环境变量配置,直接复制即可用。

镜像仓库说明

image: mysql:5.7.44
默认指向的是:Docker 官方公共镜像源(Docker Hub)
image: docker.io/library/mysql:5.7.44

docker.io = 默认域名(国外服务器,很慢)
library/mysql = 官方镜像
5.7.44 = 版本号

问题:

国外源在国内下载非常慢,甚至超时失败。你可以换成:

阿里云镜像
网易镜像
华为云镜像
腾讯云镜像

国内常用镜像地址(直接复制用)

① 阿里云(推荐,最快)
image_prefix: "registry.cn-hangzhou.aliyuncs.com/library/"
② 网易镜像
image_prefix: "hub-mirror.c.163.com/library/"
③ 百度云镜像
image_prefix: "mirror.baidubce.com/library/"
④ 腾讯云
image_prefix: "mirror.ccs.tencentyun.com/library/"

一、【Windows 专用】

核心特性

  1. 版本统一管理:顶部定义版本变量,修改一处全局生效
  2. Windows 兼容:使用相对路径持久化数据,自动创建目录无权限问题
  3. 完整生态:覆盖 MySQL5.7/8、Redis、RocketMQ、Kafka、ES、Nacos、MinIO
  4. 生产级配置:包含密码、端口、数据卷、内存限制、依赖配置
  5. 专业注释:每个服务都标注用途、端口、配置说明

docker-compose.yml 完整配置

# ======================================================================================
# Java 开发一站式中间件 Docker Compose 配置
# 适用系统:Linux(CentOS / Ubuntu / Debian)
# 镜像仓库:阿里云国内加速(下载速度拉满,无拉取超时问题)
# 启动命令:docker-compose up -d
# 停止命令:docker-compose down(保留数据)
# 数据持久化目录:当前目录 ./data (所有中间件数据都在这里,重装不丢失)
# ======================================================================================
version: '3.8'

# ======================================================================================
# 全局统一配置(核心:只改这里,全局生效)
# ======================================================================================
x-common:
  # 阿里云镜像仓库前缀(国内加速,解决国外镜像慢/失败问题)
  image_prefix: "registry.cn-hangzhou.aliyuncs.com/"
  # 官方基础库镜像前缀(mysql/redis/elasticsearch等官方镜像)
  lib_prefix: "${x-common.image_prefix}library/"

# ======================================================================================
# 所有中间件版本统一管理(固定稳定版,无 latest,生产环境安全)
# 统一修改,避免版本冲突,维护超级方便
# ======================================================================================
x-versions:
  mysql57:        "5.7.44"          # MySQL 5.7 最终稳定版(兼容老项目)
  mysql80:        "8.0.36"          # MySQL 8.0 主流稳定版(新项目首选)
  redis:          "7.2.4"           # Redis 最新稳定版,高性能缓存
  rocketmq:       "4.9.7"           # RocketMQ 稳定版(Java微服务首选消息队列)
  zookeeper:      "3.8.1"           # ZK 稳定版(Kafka注册中心依赖)
  kafka:          "7.6.1"           # Kafka 高吞吐消息队列稳定版
  elasticsearch:  "7.17.18"         # ES 7.x 最终版(Java生态兼容性最好)
  kibana:         "7.17.18"         # Kibana 必须与 ES 版本完全一致
  nacos:          "2.3.0"           # Nacos 2.x 稳定版(注册中心+配置中心)
  minio:          "RELEASE.2024-03-29T03-47-19Z"  # MinIO 对象存储(替代FastDFS)

services:
  # ====================================================================================
  # MySQL 5.7 数据库
  # 端口:3306
  # 账号密码:root / root123
  # 用途:兼容老项目、传统SpringBoot项目
  # ====================================================================================
  mysql57:
    image: ${x-common.lib_prefix}mysql:${x-versions.mysql57}
    container_name: mysql57               # 容器名(固定,方便访问)
    restart: always                       # 开机自启 + 异常自动重启
    ports:
      - "3306:3306"                       # 主机端口:容器内部端口
    environment:
      MYSQL_ROOT_PASSWORD: root123        # root 超级密码
      MYSQL_CHARACTER_SET_SERVER: utf8mb4  # 默认字符集(支持emoji)
      MYSQL_COLLATION_SERVER: utf8mb4_unicode_ci  # 排序规则
      TZ: Asia/Shanghai                   # 时区(解决时间差8小时问题)
    volumes:
      - ./data/mysql57/data:/var/lib/mysql         # 数据文件持久化
      - ./data/mysql57/conf:/etc/mysql/conf.d      # 自定义配置文件挂载
    # MySQL 5.7 兼容旧版驱动认证方式(必须加)
    command: --default-authentication-plugin=mysql_native_password
    networks:
      - java-network                       # 加入统一局域网,容器间互通
    privileged: true                       # Linux 必须开启,解决目录权限问题

  # ====================================================================================
  # MySQL 8.0 数据库
  # 端口:3307(避免与5.7冲突)
  # 账号密码:root / root123
  # 用途:微服务、新项目、Nacos默认依赖库
  # ====================================================================================
  mysql80:
    image: ${x-common.lib_prefix}mysql:${x-versions.mysql80}
    container_name: mysql80
    restart: always
    ports:
      - "3307:3306"    # 主机3307 → 容器3306
    environment:
      MYSQL_ROOT_PASSWORD: root123
      MYSQL_CHARACTER_SET_SERVER: utf8mb4
      MYSQL_COLLATION_SERVER: utf8mb4_unicode_ci
      TZ: Asia/Shanghai
    volumes:
      - ./data/mysql80/data:/var/lib/mysql
      - ./data/mysql80/conf:/etc/mysql/conf.d
    # MySQL8 默认认证插件(新版驱动支持)
    command: --default-authentication-plugin=caching_sha2_password
    networks:
      - java-network
    privileged: true

  # ====================================================================================
  # Redis 7.2 缓存中间件
  # 端口:6379
  # 密码:redis123
  # 开启AOF持久化,断电不丢数据
  # ====================================================================================
  redis:
    image: ${x-common.lib_prefix}redis:${x-versions.redis}
    container_name: redis
    restart: always
    ports:
      - "6379:6379"
    environment:
      TZ: Asia/Shanghai
    volumes:
      - ./data/redis/data:/data    # 持久化文件存放目录
    # 启动命令:设置密码 + 开启AOF持久化
    command: redis-server --requirepass redis123 --appendonly yes
    networks:
      - java-network
    privileged: true

  # ====================================================================================
  # RocketMQ 命名服务(必须先启动)
  # 端口:9876
  # 作用:服务发现、路由管理
  # ====================================================================================
  rocketmq-nameserver:
    image: ${x-common.image_prefix}apache/rocketmq:${x-versions.rocketmq}
    container_name: rocketmq-nameserver
    restart: always
    ports:
      - "9876:9876"
    environment:
      TZ: Asia/Shanghai
    volumes:
      - ./data/rocketmq/nameserver/logs:/home/rocketmq/logs
    command: sh mqnamesrv    # 启动NameServer
    networks:
      - java-network
    privileged: true

  # ====================================================================================
  # RocketMQ 消息存储节点
  # 端口:10909 10911
  # 作用:消息生产、消费、存储
  # ====================================================================================
  rocketmq-broker:
    image: ${x-common.image_prefix}apache/rocketmq:${x-versions.rocketmq}
    container_name: rocketmq-broker
    restart: always
    ports:
      - "10909:10909"
      - "10911:10911"
    environment:
      TZ: Asia/Shanghai
      NAMESRV_ADDR: rocketmq-nameserver:9876  # 注册到NameServer
    volumes:
      - ./data/rocketmq/broker/logs:/home/rocketmq/logs
      - ./data/rocketmq/broker/store:/home/rocketmq/store
    # 自动创建Topic(开发环境必备)
    command: sh mqbroker -n rocketmq-nameserver:9876 autoCreateTopicEnable=true
    depends_on:
      - rocketmq-nameserver    # 等待NameServer启动后再启动
    networks:
      - java-network
    privileged: true

  # ====================================================================================
  # RocketMQ 控制台(可视化管理界面)
  # 访问:http://IP:8088
  # ====================================================================================
  rocketmq-dashboard:
    image: ${x-common.image_prefix}apacherocketmq/rocketmq-dashboard:latest
    container_name: rocketmq-dashboard
    restart: always
    ports:
      - "8088:8080"
    environment:
      TZ: Asia/Shanghai
      NAMESRV_ADDR: rocketmq-nameserver:9876
    depends_on:
      - rocketmq-nameserver
      - rocketmq-broker
    networks:
      - java-network

  # ====================================================================================
  # Zookeeper 分布式协调服务(Kafka 强制依赖)
  # 端口:2181
  # ====================================================================================
  zookeeper:
    image: ${x-common.image_prefix}bitnami/zookeeper:${x-versions.zookeeper}
    container_name: zookeeper
    restart: always
    ports:
      - "2181:2181"
    environment:
      TZ: Asia/Shanghai
      ALLOW_ANONYMOUS_LOGIN: "yes"    # 允许匿名登录(开发环境)
    volumes:
      - ./data/zookeeper/data:/bitnami/zookeeper
    networks:
      - java-network
    privileged: true

  # ====================================================================================
  # Kafka 高吞吐消息队列
  # 端口:9092
  # 注意:必须把 192.168.3.10 改为 Linux 本机IP,否则外部无法连接
  # ====================================================================================
  kafka:
    image: ${x-common.image_prefix}bitnami/kafka:${x-versions.kafka}
    container_name: kafka
    restart: always
    ports:
      - "9092:9092"
    environment:
      TZ: Asia/Shanghai
      KAFKA_BROKER_ID: 1                        # 节点ID(单节点固定1)
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181    # 连接ZK
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092  # 容器内监听所有IP
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.3.10:9092  # 对外暴露IP
      ALLOW_PLAINTEXT_LISTENER: "yes"            # 允许非加密连接
    volumes:
      - ./data/kafka/data:/bitnami/kafka
    depends_on:
      - zookeeper
    networks:
      - java-network
    privileged: true

  # ====================================================================================
  # Elasticsearch 搜索引擎
  # 端口:9200(通信) 9300(集群)
  # 单节点模式,内存限制512M,适合开发环境
  # ====================================================================================
  elasticsearch:
    image: ${x-common.lib_prefix}elasticsearch:${x-versions.elasticsearch}
    container_name: elasticsearch
    restart: always
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      TZ: Asia/Shanghai
      discovery.type: single-node    # 单节点模式(开发)
      ES_JAVA_OPTS: "-Xms512m -Xmx512m"  # 限制内存,避免占满服务器
      xpack.security.enabled: "false"   # 关闭安全认证(开发)
      bootstrap.memory_lock: "true"      # 锁定物理内存,提升性能
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - ./data/es/data:/usr/share/elasticsearch/data
    networks:
      - java-network
    privileged: true

  # ====================================================================================
  # Kibana ES可视化控制台
  # 访问:http://IP:5601
  # ====================================================================================
  kibana:
    image: ${x-common.lib_prefix}kibana:${x-versions.kibana}
    container_name: kibana
    restart: always
    ports:
      - "5601:5601"
    environment:
      TZ: Asia/Shanghai
      ELASTICSEARCH_HOSTS: http://elasticsearch:9200  # 连接ES
    depends_on:
      - elasticsearch
    networks:
      - java-network

  # ====================================================================================
  # Nacos 2.x 注册中心 + 配置中心
  # 访问:http://IP:8848/nacos
  # 账号密码:nacos / nacos
  # 持久化到 MySQL8
  # ====================================================================================
  nacos:
    image: ${x-common.image_prefix}nacos/nacos-server:${x-versions.nacos}
    container_name: nacos
    restart: always
    ports:
      - "8848:8848"     # HTTP端口
      - "9848:9848"     # gRPC客户端通信端口
      - "9849:9849"     # gRPC同步数据端口
    environment:
      TZ: Asia/Shanghai
      MODE: standalone                          # 单机模式
      SPRING_DATASOURCE_PLATFORM: mysql         # 使用MySQL持久化
      MYSQL_SERVICE_HOST: mysql80               # 连接MySQL8容器
      MYSQL_SERVICE_DB_NAME: nacos             # Nacos数据库名
      MYSQL_SERVICE_PORT: 3306                  # 容器内部端口
      MYSQL_SERVICE_USER: root
      MYSQL_SERVICE_PASSWORD: root123
      NACOS_AUTH_ENABLE: "true"                 # 开启登录认证
    volumes:
      - ./data/nacos/logs:/home/nacos/logs
    depends_on:
      - mysql80    # 等待MySQL启动
    networks:
      - java-network
    privileged: true

  # ====================================================================================
  # MinIO 高性能对象存储服务(图片/文件/视频)
  # API端口:9000
  # 控制台:http://IP:9001
  # 账号密码:minioadmin / minioadmin
  # ====================================================================================
  minio:
    image: ${x-common.image_prefix}minio/minio:${x-versions.minio}
    container_name: minio
    restart: always
    ports:
      - "9000:9000"   # API调用端口
      - "9001:9001"   # Web控制台端口
    environment:
      TZ: Asia/Shanghai
      MINIO_ROOT_USER: minioadmin       # 管理员账号
      MINIO_ROOT_PASSWORD: minioadmin   # 管理员密码
    volumes:
      - ./data/minio/data:/data    # 文件存储目录
    # 启动命令:指定存储目录 + 控制台端口
    command: server /data --console-address ":9001"
    networks:
      - java-network
    privileged: true

# ======================================================================================
# 自定义网络:所有服务在同一局域网,可使用容器名互相访问(例如 mysql80:3306)
# ======================================================================================
networks:
  java-network:
    driver: bridge


使用说明(Windows 专属)

1. 前置准备

  • 安装 Docker Desktop(Windows 版)
  • 打开 PowerShellCMD,创建一个空文件夹(例如 D:\java-docker
  • 在文件夹内新建文件,命名为 docker-compose.yml,复制上面全部内容保存

2. 启动服务

# 进入目录
cd D:\java-docker
# 后台启动所有服务
docker-compose up -d

3. 查看运行状态

docker-compose ps

4. 停止服务

# 停止不删除数据
docker-compose stop
# 停止并删除容器(数据文件保留)
docker-compose down

核心连接信息(开发直接用)

服务 端口 账号密码 访问说明
MySQL5.7 3306 root/root123 数据库连接
MySQL8.0 3307 root/root123 数据库连接
Redis 6379 redis123 缓存连接
RocketMQ控制台 8088 http://localhost:8088
Kafka 9092 消息队列
Elasticsearch 9200 搜索引擎
Kibana 5601 http://localhost:5601
Nacos 8848 nacos/nacos http://localhost:8848/nacos
MinIO控制台 9001 minioadmin/minioadmin http://localhost:9001

版本修改说明

所有版本在文件顶部 x-versions 集中定义,直接修改数字即可,例如:

x-versions:
  mysql57: '5.7.43'  # 改为你需要的版本
  redis: '7.0.12'

Windows 注意事项

  1. 数据目录:自动在当前文件夹生成 data 目录,所有数据持久化保存,重装容器不丢失
  2. 内存限制:ES 默认配置 512M 内存,Windows 低配置电脑也能运行
  3. 端口冲突:如果端口被占用,修改 ports左侧主机端口即可
  4. 权限问题:使用相对路径挂载,无需手动设置 Windows 文件夹权限

总结

  1. 这是Windows 专属的 Java 全生态中间件 Docker Compose,开箱即用
  2. 版本固定最新稳定版,支持一键修改,无 latest 版本风险
  3. 包含数据持久化、时区配置、服务依赖,适配开发环境
  4. 启动命令:docker-compose up -d,停止命令:docker-compose down
  5. 所有服务在同一网络,Java 项目可直接用容器名互相访问(如 mysql80:3306)

二、【Linux专用】

直接改好 Linux 专用版本,并告诉你必须修改的关键地方,Linux 和 Windows 核心差异只有 3 处,其余完全通用!

一、Linux 必须修改的 3 个核心点

  1. 数据卷权限(最关键):Linux 容器运行有 UID 权限,必须给目录权限,否则无法写入数据
  2. ES 系统配置:Linux 需要修改内核参数,否则 ES 无法启动
  3. Nacos 权限:Linux 下 Nacos 日志目录需要授权

二、Linux docker-compose.yml

和Windows的docker-compose.yml一样

三、Linux 启动前必须执行的命令(必看!)

1. 创建 data 目录并授权(解决 99% 权限问题)

mkdir -p data
chmod -R 777 data

2. 配置 ES 内核参数(否则 ES 启动失败)

echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p

3. 启动服务

docker-compose up -d

你只需要改一个地方
打开 docker-compose.yml文件找到 Kafka 配置:

KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.3.10:9092

把 192.168.3.10 换成你Linux 服务器本机 IP即可。

四、Windows → Linux 关键修改对比

Windows Linux
权限 无需配置 全部服务加 privileged: true
数据目录 自动权限 必须执行 chmod -R 777 data
ES 直接运行 必须配置 vm.max_map_count
Kafka localhost 必须改为Linux 服务器 IP
端口 无需额外操作 防火墙开放端口

五、Linux 防火墙端口开放命令

# 常用端口一次性开放
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --add-port=3307/tcp --permanent
firewall-cmd --add-port=6379/tcp --permanent
firewall-cmd --add-port=8848/tcp --permanent
firewall-cmd --add-port=9000/tcp --permanent
firewall-cmd --add-port=9092/tcp --permanent
firewall-cmd --add-port=9200/tcp --permanent
firewall-cmd --add-port=5601/tcp --permanent
firewall-cmd --reload

六、连接信息(Linux 用服务器 IP 访问)

服务 地址 账号密码
MySQL5.7 LinuxIP:3306 root/root123
MySQL8.0 LinuxIP:3307 root/root123
Redis LinuxIP:6379 redis123
Nacos http://LinuxIP:8848/nacos nacos/nacos
MinIO http://LinuxIP:9001 minioadmin/minioadmin
ES http://LinuxIP:9200
Kibana http://LinuxIP:5601

总结

  1. Linux 版本 = Windows 版本 + 权限配置 + ES 系统参数
  2. 核心命令mkdir data && chmod -R 777 data
  3. Kafka 必须改服务器 IP
  4. 直接复制我给的 Linux 专用配置文件即可一键运行

账号密码一览

MySQL 5.7 / 8.0:root / root123
Redis:redis123
Nacos:nacos / nacos
MinIO:minioadmin / minioadmin

更多推荐