告别"在我机器上好好的",用 Docker 统一你的本地开发环境
前言:为什么需要本地 Docker 环境?
作为 Java 开发者,你是否经历过这样的痛苦场景?
- 新项目需要安装 MySQL、Redis、Kafka、Nacos... 一个个手动安装配置,半天就过去了
- 同事的代码在你机器上跑不起来,因为 Redis 版本不同
- 测试环境的数据和本地不一致,调试困难
- 想尝试新中间件,但怕搞乱本地环境
Docker 可以完美解决这些问题。今天,我将分享一套完整的 Java 微服务开发环境 Docker 配置方案,包含 15 个常用服务,支持一键启动、数据持久化、统一管理。
一、项目结构设计
首先,我们规划好目录结构,让一切井井有条:
D:\java-dev-env\ # 主目录
├── data\ # 所有服务的持久化数据
│ ├── mysql\
│ ├── redis\
│ ├── kafka\
│ └── ...
├── configs\ # 配置文件
│ └── prometheus\
└── scripts\ # 管理脚本
├── start-all.ps1
├── start-order.ps1
├── stop-all.ps1
└── test-services.ps1
二、通用 Docker 命令格式
所有服务都遵循相同的启动模式,只需替换几个关键参数:
powershell
# 通用格式
docker run -d `
--name 容器名 `
-p 主机端口:容器端口 `
-v D:\java-dev-env\data\服务数据目录:容器内数据路径 `
-e 环境变量=值 `
镜像名:标签
参数解释:
-d:后台运行--name:为容器命名,便于管理-p:端口映射,格式为主机端口:容器端口-v:数据卷挂载,实现数据持久化-e:设置环境变量- 反引号 `````:PowerShell 的续行符(Linux/macOS 用
\)
三、15 个必备服务详解
1. 数据库服务
MySQL 8.0
powershell
docker run -d `
--name mysql `
-p 3306:3306 `
-v D:\java-dev-env\data\mysql:/var/lib/mysql `
-e MYSQL_ROOT_PASSWORD=root123 `
mysql:8.0
说明 :MySQL 8.0 是目前最稳定的版本,数据存储在 /var/lib/mysql
Redis 7
powershell
docker run -d `
--name redis `
-p 6379:6379 `
-v D:\java-dev-env\data\redis:/data `
redis:7-alpine redis-server --appendonly yes --requirepass redis123
特性:
- 使用 Alpine 版本,更轻量
--appendonly yes启用 AOF 持久化--requirepass redis123设置访问密码
PostgreSQL 15
powershell
docker run -d `
--name postgres `
-p 5432:5432 `
-v D:\java-dev-env\data\postgres:/var/lib/postgresql/data `
-e POSTGRES_PASSWORD=postgres123 `
postgres:15-alpine
2. 消息队列
Kafka 3.5(需要先启动 Zookeeper)
powershell
# 1. 先启动 Zookeeper
docker run -d `
--name zookeeper `
-p 2181:2181 `
-v D:\java-dev-env\data\zookeeper:/data `
-e ALLOW_ANONYMOUS_LOGIN=yes `
bitnami/zookeeper:3.9
# 2. 再启动 Kafka
docker run -d `
--name kafka `
-p 9092:9092 `
-v D:\java-dev-env\data\kafka:/bitnami/kafka `
-e KAFKA_BROKER_ID=1 `
-e KAFKA_CFG_ZOOKEEPER_CONNECT=localhost:2181 `
-e ALLOW_PLAINTEXT_LISTENER=yes `
bitnami/kafka:3.5
RabbitMQ 3.12
powershell
docker run -d `
--name rabbitmq `
-p 5672:5672 -p 15672:15672 `
-v D:\java-dev-env\data\rabbitmq:/var/lib/rabbitmq `
-e RABBITMQ_DEFAULT_USER=admin `
-e RABBITMQ_DEFAULT_PASS=admin123 `
rabbitmq:3.12-management-alpine
端口:
- 5672:AMQP 协议端口
- 15672:管理界面端口(用户名/密码:admin/admin123)
3. 配置与注册中心
Nacos 2.2.3
powershell
docker run -d `
--name nacos `
-p 8848:8848 -p 9848:9848 -p 9849:9849 `
-v D:\java-dev-env\data\nacos/logs:/home/nacos/logs `
-e MODE=standalone `
-e SPRING_DATASOURCE_PLATFORM=embedded `
nacos/nacos-server:v2.2.3
访问地址:http://localhost:8848/nacos
Consul 1.15
powershell
docker run -d `
--name consul `
-p 8500:8500 `
-v D:\java-dev-env\data\consul:/consul/data `
consul:1.15 agent -server -bootstrap-expect=1 -ui -client=0.0.0.0
4. 监控与日志
Elasticsearch 8.12
powershell
docker run -d `
--name elasticsearch `
-p 9200:9200 -p 9300:9300 `
-v D:\java-dev-env\data\elasticsearch:/usr/share/elasticsearch/data `
-e "discovery.type=single-node" `
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" `
docker.elastic.co/elasticsearch/elasticsearch:8.12.0
重要:限制了 JVM 内存为 512MB-512MB,防止占用过多系统资源
Prometheus + Grafana
powershell
# 先创建配置文件目录
mkdir D:\java-dev-env\configs\prometheus
# 启动 Prometheus
docker run -d `
--name prometheus `
-p 9090:9090 `
-v D:\java-dev-env\data\prometheus:/prometheus `
-v D:\java-dev-env\configs\prometheus:/etc/prometheus `
prom/prometheus:latest
# 启动 Grafana
docker run -d `
--name grafana `
-p 3000:3000 `
-v D:\java-dev-env\data\grafana:/var/lib/grafana `
-e GF_SECURITY_ADMIN_PASSWORD=admin123 `
grafana/grafana:latest
访问地址:
- Prometheus: http://localhost:9090
- Grafana: http://localhost:3000(admin/admin123)
5. 存储与管理工具
MinIO 对象存储
powershell
docker run -d `
--name minio `
-p 9000:9000 -p 9001:9001 `
-v D:\java-dev-env\data\minio:/data `
-e MINIO_ROOT_USER=admin `
-e MINIO_ROOT_PASSWORD=admin123 `
minio/minio server /data --console-address ":9001"
用途:本地 S3 兼容存储,用于测试文件上传功能
Portainer(Docker 可视化管理)
powershell
docker run -d `
--name portainer `
-p 9000:9000 -p 9443:9443 `
-v D:\java-dev-env\data\portainer:/data `
-v /var/run/docker.sock:/var/run/docker.sock `
portainer/portainer-ce:latest
pgAdmin(PostgreSQL 管理界面)
powershell
docker run -d `
--name pgadmin `
-p 8082:80 `
-v D:\java-dev-env\data\pgadmin:/var/lib/pgadmin `
-e PGADMIN_DEFAULT_EMAIL=admin@example.com `
-e PGADMIN_DEFAULT_PASSWORD=admin123 `
dpage/pgadmin4:latest
四、实用管理脚本
手动一个个启动太麻烦?我们提供一键操作脚本。
1. 批量启动脚本(start-all.ps1)
powershell
# 一键启动所有服务
Write-Host "正在启动微服务开发环境..." -ForegroundColor Yellow
Write-Host "数据目录: D:\java-dev-env\data" -ForegroundColor Green
# 分组启动,便于查看进度
# 1. 数据库服务
Write-Host "`n启动数据库服务..." -ForegroundColor Cyan
docker run -d --name mysql -p 3306:3306 -v D:\java-dev-env\data\mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root123 mysql:8.0
docker run -d --name redis -p 6379:6379 -v D:\java-dev-env\data\redis:/data redis:7-alpine redis-server --appendonly yes --requirepass redis123
# ... 其他数据库服务
# 2. 消息队列
Write-Host "`n启动消息队列..." -ForegroundColor Cyan
# ... 消息队列服务
# 3. 配置中心和注册中心
Write-Host "`n启动配置中心..." -ForegroundColor Cyan
# ... 配置中心服务
# 显示状态
Write-Host "`n所有服务启动完成!" -ForegroundColor Green
docker ps
2. 顺序启动脚本(start-order.ps1)
有些服务有依赖关系,需要按顺序启动:
powershell
# 分步骤启动,确保依赖关系
Write-Host "=== 分步骤启动微服务环境 ===" -ForegroundColor Yellow
# 步骤1: 基础服务(Redis)
Write-Host "`n[步骤1] 启动基础服务..." -ForegroundColor Cyan
docker run -d --name redis -p 6379:6379 -v D:\java-dev-env\data\redis:/data redis:7-alpine redis-server --appendonly yes --requirepass redis123
Start-Sleep -Seconds 2
# 步骤2: 数据库
Write-Host "`n[步骤2] 启动数据库..." -ForegroundColor Cyan
# ... MySQL, PostgreSQL
Start-Sleep -Seconds 3
# 步骤3: 消息队列
Write-Host "`n[步骤3] 启动消息队列..." -ForegroundColor Cyan
# ... 后续步骤
3. 批量停止脚本(stop-all.ps1)
powershell
# 停止所有服务
Write-Host "正在停止所有服务..." -ForegroundColor Yellow
# 按依赖顺序停止(依赖的服务先停)
$services = @(
"kafka", "zookeeper", "rabbitmq", "nacos", "consul",
"elasticsearch", "grafana", "prometheus", "portainer",
"nginx", "pgadmin", "minio", "mongodb", "postgres",
"mysql", "redis"
)
foreach ($service in $services) {
Write-Host "停止 $service..." -ForegroundColor Gray
docker stop $service 2>$null
docker rm $service 2>$null
}
Write-Host "`n所有服务已停止" -ForegroundColor Green
docker ps
4. 服务测试脚本(test-services.ps1)
powershell
Write-Host "测试服务连接状态..." -ForegroundColor Yellow
# 测试 MySQL
Write-Host "`n测试 MySQL..." -NoNewline
try {
docker exec mysql mysql -u root -proot123 -e "SELECT 1;" 2>$null
Write-Host " ✓ 正常" -ForegroundColor Green
} catch {
Write-Host " ✗ 异常" -ForegroundColor Red
}
# 测试 Redis
Write-Host "测试 Redis..." -NoNewline
try {
docker exec redis redis-cli -a redis123 ping 2>$null
Write-Host " ✓ 正常" -ForegroundColor Green
} catch {
Write-Host " ✗ 异常" -ForegroundColor Red
}
# 测试 Nacos
Write-Host "测试 Nacos..." -NoNewline
try {
$response = Invoke-WebRequest -Uri "http://localhost:8848/nacos" -TimeoutSec 2
Write-Host " ✓ 正常" -ForegroundColor Green
} catch {
Write-Host " ✗ 异常" -ForegroundColor Red
}
五、使用指南
1. 首次使用步骤
-
创建目录结构:
powershellmkdir D:\java-dev-env mkdir D:\java-dev-env\data mkdir D:\java-dev-env\configs mkdir D:\java-dev-env\scripts -
将脚本保存到
scripts目录:start-all.ps1start-order.ps1stop-all.ps1test-services.ps1
-
根据需要创建服务数据目录(可选,Docker 会自动创建):
powershellmkdir D:\java-dev-env\data\mysql mkdir D:\java-dev-env\data\redis # ... 其他目录 -
修改权限(如果需要):
powershellSet-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser -
运行脚本:
powershellcd D:\java-dev-env\scripts .\start-order.ps1
2. 按需启动策略
不需要一次性启动所有服务,可以按需修改脚本。例如,只启动数据库和 Redis:
powershell
# 最小化启动脚本
Write-Host "启动基础开发环境..." -ForegroundColor Yellow
# 数据库
docker run -d --name mysql -p 3306:3306 -v D:\java-dev-env\data\mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root123 mysql:8.0
docker run -d --name redis -p 6379:6379 -v D:\java-dev-env\data\redis:/data redis:7-alpine redis-server --appendonly yes --requirepass redis123
# 如果需要消息队列
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -v D:\java-dev-env\data\rabbitmq:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin123 rabbitmq:3.12-management-alpine
3. 资源优化建议
如果内存不足(建议至少 8GB),可以:
-
选择性启动:只启动当前需要的服务
-
调整 JVM 参数:特别是 Elasticsearch
-
使用更轻量的镜像:如 Alpine 版本
-
限制容器资源 :
powershelldocker run -d ` --name mysql ` --memory=512m ` # 限制内存 --cpus=0.5 ` # 限制 CPU # ... 其他参数
六、常见问题解决
1. 端口冲突
如果提示端口被占用,可以:
- 修改
-p参数中的主机端口 - 停止占用端口的程序
- 使用
netstat -ano | findstr :端口号查找占用进程
2. 权限问题
- Windows:确保以管理员身份运行 PowerShell
- Linux/macOS :可能需要
sudo或调整用户组
3. 数据目录权限
如果容器启动失败,检查数据目录权限:
powershell
# Windows
icacls D:\java-dev-env\data /grant "Users":(OI)(CI)F
# Linux
sudo chmod -R 777 /path/to/java-dev-env/data
4. 镜像拉取慢
配置 Docker 镜像加速:
json
// 在 Docker Desktop 设置中
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
]
}
七、进阶使用
1. 使用 Docker Compose 管理
创建 docker-compose.yml 统一管理:
yaml
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql
ports:
- "3306:3306"
volumes:
- ./data/mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root123
redis:
image: redis:7-alpine
container_name: redis
ports:
- "6379:6379"
volumes:
- ./data/redis:/data
command: redis-server --appendonly yes --requirepass redis123
启动:docker-compose up -d
2. 自定义配置
为服务添加自定义配置文件:
powershell
# 为 Redis 添加配置文件
docker run -d `
--name redis `
-p 6379:6379 `
-v D:\java-dev-env\data\redis:/data `
-v D:\java-dev-env\configs\redis.conf:/usr/local/etc/redis/redis.conf `
redis:7-alpine redis-server /usr/local/etc/redis/redis.conf
3. 网络配置
创建自定义网络,让服务可以通过服务名通信:
powershell
# 创建网络
docker network create dev-network
# 启动时指定网络
docker run -d `
--name mysql `
--network dev-network `
# ... 其他参数
八、总结
通过这套 Docker 化的本地开发环境,你可以:
✅ 环境标准化 :团队所有人使用完全相同的中间件版本和配置
✅ 快速启动 :从零到全套环境只需几分钟
✅ 数据持久化 :容器删除重建,数据不丢失
✅ 资源隔离 :不影响本地已安装的其他软件
✅ 易于维护 :通过脚本统一管理,新人上手快
✅ 可移植:配置可以轻松分享给团队成员
这套方案已经在多个项目中得到验证,显著提高了开发效率,减少了环境问题导致的调试时间。建议根据团队实际情况进行调整,比如替换为团队实际使用的中间件版本,或添加更多服务如 RocketMQ、Seata 等。
立即开始:复制文章中的脚本,创建你的第一个标准化开发环境吧!
温馨提示:在生产环境中,请使用更严格的安全配置,如更强的密码、网络隔离、资源限制等。本地开发环境可以适当放宽安全限制以便于开发和测试。