Windows 环境下使用 Docker 部署 Java 开发中间件完全指南

本文旨在为 Windows 平台上的 Java 开发者提供一份详细的 Docker 中间件部署指南,涵盖从环境搭建到常用中间件部署的完整流程。

一、环境准备:在 Windows 上安装 Docker

1.1 系统要求检查

在开始之前,请确保你的系统满足以下要求:

  • Windows 10/11 64位(专业版、企业版或教育版)
  • 至少 4GB 内存(建议 8GB 或以上)
  • 开启 BIOS 中的虚拟化支持(VT-x/AMD-V)

1.2 安装 Docker Desktop

Docker Desktop 是 Windows 上运行 Docker 的最佳选择,它提供了完整的 Docker 环境和友好的 GUI 管理界面。

安装步骤:

  1. 访问 Docker 官网下载安装包:https://www.docker.com/products/docker-desktop/
  2. 运行安装程序,按照向导完成安装
  3. 安装过程中会提示启用 WSL2 和 Hyper-V,请务必同意
  4. 安装完成后重启计算机

验证安装:

powershell 复制代码
# 打开 PowerShell
docker --version
docker-compose --version
docker run hello-world

如果看到版本信息和 "Hello from Docker!" 的提示,说明安装成功。

二、配置优化:提升 Windows Docker 使用体验

2.1 配置镜像加速

由于网络原因,从 Docker Hub 拉取镜像可能较慢,建议配置国内镜像源。

在 Docker Desktop 中:

  1. 点击系统托盘中的 Docker 图标
  2. 选择 Settings → Docker Engine
  3. 修改配置文件:
json 复制代码
{
  "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" 应用配置。

2.2 启用 WSL2 后端(推荐)

WSL2 提供了更好的性能和 Linux 兼容性:

powershell 复制代码
# 启用 WSL
wsl --install

# 设置 WSL2 为默认版本
wsl --set-default-version 2

# 在 Docker Desktop 中启用 WSL2
# Settings → General → Use WSL 2 based engine

三、Java 开发常用中间件部署

3.1 数据库服务

MySQL 8.0 部署:

powershell 复制代码
# 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 部署:

powershell 复制代码
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

PostgreSQL 15 部署:

powershell 复制代码
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

3.2 微服务生态组件

Nacos 2.x(服务发现 + 配置中心):

powershell 复制代码
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(消息队列):

powershell 复制代码
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):

powershell 复制代码
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

3.3 监控与日志

Prometheus + Grafana 监控:

powershell 复制代码
# 创建配置文件 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 日志系统):

powershell 复制代码
# 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 进行编排。

4.1 创建 docker-compose.yml

yaml 复制代码
version: '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:

4.2 启动和管理服务

powershell 复制代码
# 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 特有技巧和注意事项

5.1 路径问题处理

Windows 和 Linux 的路径格式不同,在挂载卷时需要特别注意:

powershell 复制代码
# ❌ 错误:直接使用 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 ...

5.2 端口冲突解决

powershell 复制代码
# 查看端口占用
netstat -ano | findstr :3306

# 结束占用进程
taskkill /PID 进程号 /F

# 或者在 docker-compose 中修改端口映射
# mysql:
#   ports:
#     - "3307:3306"  # 将主机端口改为 3307

5.3 资源限制配置

在 Docker Desktop Settings → Resources 中:

  • 分配适当的 CPU 和内存
  • 配置磁盘镜像大小
  • 设置 WSL 集成

六、快速启动脚本

6.1 PowerShell 启动脚本(start-dev.ps1

powershell 复制代码
# 开发环境快速启动脚本
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

七、常见问题排查

7.1 Docker Desktop 无法启动

  • 问题:Docker Desktop 启动失败

  • 解决

    powershell 复制代码
    # 以管理员运行 PowerShell
    # 重启 Docker 服务
    net stop com.docker.service
    net start com.docker.service
    
    # 或重置 Docker
    & 'C:\Program Files\Docker\Docker\DockerCli.exe' -SwitchDaemon

7.2 容器启动缓慢

  • 问题:容器启动特别慢

  • 解决

    1. 检查是否开启了杀毒软件实时防护
    2. 在 Docker Desktop 中增加资源分配
    3. 确保使用 WSL2 后端
    4. 清理 Docker 缓存:
    powershell 复制代码
    docker system prune -a

7.3 网络连接问题

  • 问题:容器间无法通信

  • 解决

    powershell 复制代码
    # 检查网络
    docker network ls
    docker network inspect 网络名
    
    # 使用自定义网络
    docker network create my-network
    docker run --network=my-network ...

八、生产环境注意事项

虽然本文主要针对开发环境,但了解生产环境的最佳实践也很重要:

  1. 安全配置:不要使用默认密码,启用 TLS/SSL
  2. 数据备份:定期备份 Volume 数据
  3. 监控告警:配置容器监控和告警
  4. 资源限制:设置 CPU 和内存限制
  5. 日志管理:配置日志轮转和集中收集
  6. 镜像管理:使用私有镜像仓库,扫描安全漏洞

总结

Windows 平台上的 Docker 开发环境已经相当成熟,通过 Docker Desktop 配合 WSL2,可以获得接近 Linux 的开发体验。本文介绍的中间件部署方案覆盖了 Java 开发中的常见需求,从数据库到消息队列,从服务注册到监控系统,基本可以满足大部分项目的开发需求。

通过使用 Docker Compose 进行服务编排,我们可以轻松地管理复杂的多容器应用,实现一键启动、统一管理。希望这篇指南能帮助你在 Windows 上搭建高效的 Java 开发环境。

最后的小贴士

  • 定期更新 Docker 和基础镜像
  • 使用 .dockerignore 文件优化构建
  • 为不同项目创建独立的网络
  • 使用 Docker 的日志驱动功能
  • 考虑使用 Portainer 进行可视化管理

Happy Coding! 🚀

相关推荐
代码or搬砖2 小时前
== 和 equals() 的区别
java·开发语言·jvm
koping_wu2 小时前
【leetcode】排序数组:快速排序、堆排序、归并排序
java·算法·leetcode
!停2 小时前
自定义类型:结构体
windows
咘噜biu2 小时前
Java SpringBoot后端Filter包装请求(新增/覆盖请求头)
java·spring boot·filter·requestwrapper
历程里程碑2 小时前
LeetCode 283:原地移动零的优雅解法
java·c语言·开发语言·数据结构·c++·算法·leetcode
程序猿零零漆2 小时前
Spring之旅 - 记录学习 Spring 框架的过程和经验(五)Spring的后处理器BeanFactoryPostProcessor
java·学习·spring
虾说羊2 小时前
java中的反射详解
java·开发语言
love530love2 小时前
【笔记】把已有的 ComfyUI 插件发布到 Comfy Registry(官方节点商店)全流程实录
人工智能·windows·笔记·python·aigc·comfyui·torchmonitor
星火飞码iFlyCode2 小时前
iFlyCode实践规范驱动开发(SDD):招考平台报名相片质量抽检功能开发实战
java·前端·python·算法·ai编程·科大讯飞