【Docker】----一套 Docker Compose 搞定 Java 全生态中间件!Windows/Linux 通用
·
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 专用】
核心特性
- 版本统一管理:顶部定义版本变量,修改一处全局生效
- Windows 兼容:使用相对路径持久化数据,自动创建目录无权限问题
- 完整生态:覆盖 MySQL5.7/8、Redis、RocketMQ、Kafka、ES、Nacos、MinIO
- 生产级配置:包含密码、端口、数据卷、内存限制、依赖配置
- 专业注释:每个服务都标注用途、端口、配置说明
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 版)
- 打开
PowerShell或CMD,创建一个空文件夹(例如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 注意事项
- 数据目录:自动在当前文件夹生成
data目录,所有数据持久化保存,重装容器不丢失 - 内存限制:ES 默认配置 512M 内存,Windows 低配置电脑也能运行
- 端口冲突:如果端口被占用,修改
ports中左侧主机端口即可 - 权限问题:使用相对路径挂载,无需手动设置 Windows 文件夹权限
总结
- 这是Windows 专属的 Java 全生态中间件 Docker Compose,开箱即用
- 版本固定最新稳定版,支持一键修改,无 latest 版本风险
- 包含数据持久化、时区配置、服务依赖,适配开发环境
- 启动命令:
docker-compose up -d,停止命令:docker-compose down - 所有服务在同一网络,Java 项目可直接用容器名互相访问(如 mysql80:3306)
二、【Linux专用】
直接改好 Linux 专用版本,并告诉你必须修改的关键地方,Linux 和 Windows 核心差异只有 3 处,其余完全通用!
一、Linux 必须修改的 3 个核心点
- 数据卷权限(最关键):Linux 容器运行有 UID 权限,必须给目录权限,否则无法写入数据
- ES 系统配置:Linux 需要修改内核参数,否则 ES 无法启动
- 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 | 无 |
总结
- Linux 版本 = Windows 版本 + 权限配置 + ES 系统参数
- 核心命令:
mkdir data && chmod -R 777 data - Kafka 必须改服务器 IP
- 直接复制我给的 Linux 专用配置文件即可一键运行
账号密码一览
MySQL 5.7 / 8.0:root / root123
Redis:redis123
Nacos:nacos / nacos
MinIO:minioadmin / minioadmin
更多推荐



所有评论(0)