Windows 环境下使用 Docker 部署 Java 开发中间件指南
一、环境准备:在 Windows 上安装 Docker
1.1 系统要求检查
在开始之前,请确保你的系统满足以下要求:
- Windows 10/11 64 位(专业版、企业版或教育版)
在 Windows 平台上使用 Docker Desktop 部署 Java 开发常用中间件的完整流程。内容包括环境准备、镜像加速配置、WSL2 后端启用,以及 MySQL、Redis、PostgreSQL、Nacos、RabbitMQ、MinIO、Prometheus、Grafana、Elasticsearch 等服务的 Docker 部署命令。此外,还涵盖了 Docker Compose 编排多容器应用的方法、Windows 路径与端口冲突处理技巧、资源限制配置及常见问题排查方案。最后提供了生产环境的安全与运维建议,帮助开发者构建高效的本地开发环境。
在开始之前,请确保你的系统满足以下要求:
Docker Desktop 是 Windows 上运行 Docker 的最佳选择,它提供了完整的 Docker 环境和友好的 GUI 管理界面。
安装步骤:
验证安装:
# 打开 PowerShell
docker --version
docker-compose --version
docker run hello-world
如果看到版本信息和 "Hello from Docker!" 的提示,说明安装成功。
由于网络原因,从 Docker Hub 拉取镜像可能较慢,建议配置国内镜像源。
在 Docker Desktop 中:
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
],
"experimental": false,
"builder": {
"gc": {
"enabled": true,
"defaultKeepStorage": "20GB"
}
}
}
点击 "Apply & Restart" 应用配置。
WSL2 提供了更好的性能和 Linux 兼容性:
# 启用 WSL
wsl --install
# 设置 WSL2 为默认版本
wsl --set-default-version 2
# 在 Docker Desktop 中启用 WSL2
# Settings → General → Use WSL 2 based engine
MySQL 8.0 部署:
# PowerShell 中运行(注意反引号续行)
docker run -d --name mysql `
-e MYSQL_ROOT_PASSWORD=123456 `
-p 3306:3306 `
-v mysql_data:/var/lib/mysql `
-e MYSQL_DATABASE=testdb `
mysql:8.0
# 连接到 MySQL
docker exec -it mysql mysql -uroot -p123456
Redis 7.0 部署:
docker run -d --name redis `
-p 6379:6379 `
-v redis_data:/data `
redis:7-alpine `
redis-server --requirepass 123456 --appendonly yes
# Redis 客户端连接测试
docker exec -it redis redis-cli -a 123456 ping
PostgreSQL 15 部署:
docker run -d --name postgres `
-e POSTGRES_PASSWORD=123456 `
-p 5432:5432 `
-v postgres_data:/var/lib/postgresql/data `
postgres:15
# 创建数据库
docker exec -it postgres createdb -U postgres mydb
Nacos 2.x(服务发现 + 配置中心):
docker run -d --name nacos `
-p 8848:8848 -p 9848:9848 -p 9849:9849 `
-e MODE=standalone `
-e PREFER_HOST_MODE=hostname `
-e SPRING_DATASOURCE_PLATFORM=embedded `
nacos/nacos-server:v2.2.3
# 访问地址:http://localhost:8848/nacos
# 默认账号:nacos/nacos
RabbitMQ 3.12(消息队列):
docker run -d --name rabbitmq `
-p 5672:5672 -p 15672:15672 `
-p 25672:25672 -p 61613:61613 `
-e RABBITMQ_DEFAULT_USER=admin `
-e RABBITMQ_DEFAULT_PASS=admin `
rabbitmq:3.12-management
# 访问管理界面:http://localhost:15672
MinIO(对象存储,兼容 S3):
docker run -d --name minio `
-p 9000:9000 -p 9001:9001 `
-e MINIO_ROOT_USER=admin `
-e MINIO_ROOT_PASSWORD=admin123456 `
-v minio_data:/data `
minio/minio server /data --console-address ":9001"
# API 端点:http://localhost:9000
# 控制台:http://localhost:9001
Prometheus + Grafana 监控:
# 创建配置文件 prometheus.yml
@" global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
"@ | Out-File -FilePath prometheus.yml -Encoding UTF8
# 启动 Prometheus
docker run -d --name prometheus `
-p 9090:9090 `
-v ${PWD}/prometheus.yml:/etc/prometheus/prometheus.yml `
prom/prometheus
# 启动 Grafana
docker run -d --name grafana `
-p 3000:3000 `
-e GF_SECURITY_ADMIN_PASSWORD=admin `
grafana/grafana
Elasticsearch + Kibana(ELK 日志系统):
# Elasticsearch
docker run -d --name elasticsearch `
-p 9200:9200 -p 9300:9300 `
-e "discovery.type=single-node" `
-e "xpack.security.enabled=false" `
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" `
elasticsearch:8.10.0
# Kibana
docker run -d --name kibana `
-p 5601:5601 `
-e ELASTICSEARCH_HOSTS=http://localhost:9200 `
kibana:8.10.0
对于复杂的多容器应用,推荐使用 Docker Compose 进行编排。
docker-compose.ymlversion: '3.8'
services:
# MySQL 数据库
mysql:
image: mysql:8.0
container_name: dev-mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: appdb
TZ: Asia/Shanghai
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./mysql/init:/docker-entrypoint-initdb.d
networks:
- dev-network
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
timeout: 20s
retries: 10
# Redis 缓存
redis:
image: redis:7-alpine
container_name: dev-redis
restart: unless-stopped
command: redis-server --requirepass 123456 --appendonly yes
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- dev-network
healthcheck:
test: ["CMD", "redis-cli", "-a", "123456", "ping"]
interval: 10s
timeout: 5s
retries: 5
# Nacos 服务注册中心
nacos:
image: nacos/nacos-server:v2.2.3
container_name: dev-nacos
restart: unless-stopped
environment:
MODE: standalone
PREFER_HOST_MODE: hostname
SPRING_DATASOURCE_PLATFORM: embedded
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
networks:
- dev-network
depends_on:
mysql:
condition: service_healthy
# RabbitMQ 消息队列
rabbitmq:
image: rabbitmq:3.12-management
container_name: dev-rabbitmq
restart: unless-stopped
environment:
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: admin
ports:
- "5672:5672"
- "15672:15672"
volumes:
- rabbitmq_data:/var/lib/rabbitmq
networks:
- dev-network
# RedisInsight 管理界面
redisinsight:
image: redislabs/redisinsight:latest
container_name: dev-redisinsight
restart: unless-stopped
ports:
- "5540:5540"
volumes:
- redisinsight_data:/db
networks:
- dev-network
networks:
dev-network:
driver: bridge
name: java-dev-network
volumes:
mysql_data:
redis_data:
rabbitmq_data:
redisinsight_data:
# 1. 创建项目目录
mkdir C:\java-dev-env
cd C:\java-dev-env
# 2. 创建 docker-compose.yml
# 将上面的内容保存为 docker-compose.yml
# 3. 启动所有服务
docker-compose up -d
# 4. 查看运行状态
docker-compose ps
# 5. 查看日志
docker-compose logs -f mysql
docker-compose logs -f nacos
# 6. 停止服务
docker-compose down
# 7. 停止并清理数据
docker-compose down -v
Windows 和 Linux 的路径格式不同,在挂载卷时需要特别注意:
# ❌ 错误:直接使用 Windows 路径
docker run -v C:\Users\test\data:/data...
# ✅ 正确:使用 Docker Desktop 共享驱动器
# 1. 在 Docker Desktop Settings → Resources → File Sharing
# 2. 添加 C:\Users(或你的工作目录)
# 3. 然后使用以下格式:
# 方式一:使用 /c/ 前缀
docker run -v /c/Users/test/data:/data...
# 方式二:在 WSL2 环境中使用
# 先将项目放在 WSL2 文件系统中
docker run -v /home/username/project/data:/data...
# 查看端口占用
netstat -ano | findstr :3306
# 结束占用进程
taskkill /PID 进程号 /F
# 或者在 docker-compose 中修改端口映射
# mysql:
# ports:
# - "3307:3306" # 将主机端口改为 3307
在 Docker Desktop Settings → Resources 中:
start-dev.ps1)# 开发环境快速启动脚本
param([switch]$Help = $false, [string]$Profile = "basic")
if ($Help) {
Write-Host "用法: .\start-dev.ps1 [-Profile basic|full|monitor]" -ForegroundColor Cyan
Write-Host " -Profile basic: 基础服务 (MySQL+Redis)" -ForegroundColor Yellow
Write-Host " -Profile full: 完整服务 (基础+Nacos+MQ)" -ForegroundColor Yellow
Write-Host " -Profile monitor: 监控服务 (Prometheus+Grafana)" -ForegroundColor Yellow
exit
}
function Start-Services {
param([string]$composeFile)
Write-Host "正在启动服务..." -ForegroundColor Green
docker-compose -f $composeFile up -d
if ($LASTEXITCODE -eq 0) {
Write-Host "服务启动成功!" -ForegroundColor Green
docker-compose -f $composeFile ps
} else {
Write-Host "服务启动失败,请检查配置" -ForegroundColor Red
}
}
Write-Host "Java 开发环境启动器" -ForegroundColor Cyan
Write-Host "======================" -ForegroundColor Cyan
switch ($Profile) {
"basic" {
Write-Host "启动基础服务..." -ForegroundColor Yellow
Start-Services "docker-compose-basic.yml"
}
"full" {
Write-Host "启动完整开发环境..." -ForegroundColor Yellow
Start-Services "docker-compose-full.yml"
}
"monitor" {
Write-Host "启动监控服务..." -ForegroundColor Yellow
Start-Services "docker-compose-monitor.yml"
}
default {
Write-Host "使用默认配置启动基础服务..." -ForegroundColor Yellow
Start-Services "docker-compose.yml"
}
}
Write-Host "`n 服务访问地址:" -ForegroundColor Cyan
Write-Host "MySQL: localhost:3306 (root/123456)" -ForegroundColor Yellow
Write-Host "Redis: localhost:6379 (密码:123456)" -ForegroundColor Yellow
Write-Host "Nacos: http://localhost:8848/nacos (nacos/nacos)" -ForegroundColor Yellow
Write-Host "RabbitMQ: http://localhost:15672 (admin/admin)" -ForegroundColor Yellow
Write-Host "RedisInsight: http://localhost:5540" -ForegroundColor Yellow
解决:
# 以管理员运行 PowerShell
# 重启 Docker 服务
net stop com.docker.service
net start com.docker.service
# 或重置 Docker
& 'C:\Program Files\Docker\Docker\DockerCli.exe' -SwitchDaemon
解决:
docker system prune -a
解决:
# 检查网络
docker network ls
docker network inspect 网络名
# 使用自定义网络
docker network create my-network
docker run --network=my-network ...
虽然本文主要针对开发环境,但了解生产环境的最佳实践也很重要:
Windows 平台上的 Docker 开发环境已经相当成熟,通过 Docker Desktop 配合 WSL2,可以获得接近 Linux 的开发体验。本文介绍的中间件部署方案覆盖了 Java 开发中的常见需求,从数据库到消息队列,从服务注册到监控系统,基本可以满足大部分项目的开发需求。
通过使用 Docker Compose 进行服务编排,我们可以轻松地管理复杂的多容器应用,实现一键启动、统一管理。希望这篇指南能帮助你在 Windows 上搭建高效的 Java 开发环境。
最后的小贴士:
.dockerignore 文件优化构建
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online