欢迎光临
我们一直在努力

windows本地开发环境搭建指南:Docker + 常用中间件一键部署

本文介绍如何在本地使用 Docker Desktop 快速搭建包含 MySQL、Redis、PostgreSQL、Nacos、Kafka 等常用中间件的开发环境。所有服务的数据与配置文件均持久化到本地,删除容器后数据不丢失,配置随时可改。


目录

  • 一、安装 Docker Desktop
  • 二、可选:汉化 Docker Desktop
  • 三、修改镜像存储目录
  • 四、配置镜像加速
  • 五、准备目录与配置文件
  • 六、拉取所需镜像
  • 七、编写 docker-compose.yml
  • 八、Nacos 数据库初始化(可选)
  • 九、初始化 PostgreSQL 配置文件
  • 十、启动服务
  • 十一、访问各服务

一、安装 Docker Desktop

前往官网下载并安装:

👉 https://www.docker.com/products/docker-desktop/


二、可选:汉化 Docker Desktop

如需中文界面,可参考以下步骤,否则跳过此节。

汉化包地址:https://github.com/asxez/DockerDesktop-CN

操作步骤:

  • 关闭 Docker Desktop

  • 找到 app.asar 文件并先备份(防止意外)

    系统默认路径
    Windows C:\\Program Files\\Docker\\Docker\\frontend\\resources
    macOS /Applications/Docker.app/Contents/MacOS/Docker Desktop.app/Contents/Resources
    Ubuntu/Debian /opt/docker-desktop/resources
  • 将下载的汉化 .asar 文件重命名为 app.asar,替换原文件

  • 重启 Docker Desktop


  • 三、修改镜像存储目录

    Docker 默认将镜像存放在系统盘,建议改到空间更大的磁盘。

    操作路径: Docker Desktop → ⚙️ 设置 → Resources → Advanced → Disk image location

    将路径修改为目标目录,例如:

    D:\\Docker\\wsl\\data


    四、配置镜像加速

    由于网络原因,拉取镜像时可能较慢,可配置国内镜像源。

    操作路径: Docker Desktop → ⚙️ 设置 → Docker Engine

    在编辑器中粘贴以下配置:

    {
    "max-concurrent-downloads": 5,
    "max-concurrent-uploads": 5,
    "registry-mirrors": [
    "https://docker.1ms.run",
    "https://docker.xuanyuan.me",
    "https://docker.m.daocloud.io",
    "https://dockerpull.com"
    ]
    }

    点击 Apply & Restart 使配置生效。


    五、准备目录与配置文件

    选择一个工作目录(如 D:\\Docker),后续所有操作均在此目录下进行。

    5.1 创建目录结构

    mkdir mysql\\data mysql\\conf.d redis\\data redis\\conf postgres\\data postgres\\conf kafka\\data nacos\\logs cloudbeaver\\workspace

    5.2 创建 MySQL 配置文件

    在 mysql/conf.d/ 下新建 my.cnf:

    [mysqld]
    # ── 字符集 ──────────────────────────────
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci

    # ── 连接 ────────────────────────────────
    max_connections=200 # 最大连接数
    max_connect_errors=10 # 同一客户端连续失败超过此次数则拒绝连接
    wait_timeout=28800 # 非交互连接空闲超时时间(秒),8小时
    interactive_timeout=28800 # 交互连接空闲超时时间(秒),8小时

    # ── 时区 ────────────────────────────────
    default-time-zone=+08:00

    # ── InnoDB 存储引擎 ──────────────────────
    innodb_buffer_pool_size=512M # 缓冲池大小,建议设为可用内存的 50-70%
    innodb_log_file_size=128M # redo log 文件大小,影响写入性能
    innodb_flush_log_at_trx_commit=1 # 1=每次提交刷盘最安全,2=性能好但断电可能丢1秒数据
    innodb_file_per_table=1 # 每张表独立 ibd 文件,便于管理和回收空间

    # ── 临时表 ──────────────────────────────
    tmp_table_size=64M # 内存临时表最大大小
    max_heap_table_size=64M # 用户创建的内存表最大大小,需与上面保持一致

    # ── 慢查询日志 ───────────────────────────
    slow_query_log=1 # 开启慢查询日志
    slow_query_log_file=/var/log/mysql/slow.log
    long_query_time=2 # 超过 2 秒的查询记录到慢日志
    log_queries_not_using_indexes=1 # 未走索引的查询也记录到慢日志
    general_log=0 # 记录所有 SQL,调试时可设为 1,生产禁用

    # ── 二进制日志(用于数据恢复 / 主从复制)──
    log_bin=mysql-bin # 开启 binlog,文件名前缀
    binlog_format=ROW # ROW 模式记录行变更,最安全
    expire_logs_days=7 # binlog 保留 7 天后自动清理

    [client]
    default-character-set=utf8mb4

    [mysql]
    default-character-set=utf8mb4

    5.3 创建 Redis 配置文件

    在 redis/conf/ 下新建 redis.conf:

    # ── 网络 ────────────────────────────────
    bind 0.0.0.0 # 绑定所有网卡(容器内必须)
    port 6379 # 监听端口
    timeout 0 # 客户端空闲多少秒后断开,0 表示不断开
    tcp-keepalive 300 # TCP keepalive 心跳间隔(秒)

    # ── 认证 ────────────────────────────────
    requirepass 123456 # 访问密码

    # ── 内存 ────────────────────────────────
    maxmemory 512mb # 最大内存,按实际机器情况调整
    maxmemory-policy allkeys-lru # 内存满时淘汰策略:优先删除最久未使用的 key
    # 常用策略说明:
    # noeviction 不淘汰,内存满时写入直接报错(默认值)
    # allkeys-lru 所有 key 中淘汰最久未使用的(推荐缓存场景)
    # volatile-lru 只淘汰设置了过期时间的 key 中最久未使用的
    # allkeys-random 随机淘汰任意 key
    # volatile-ttl 优先淘汰剩余过期时间最短的 key

    # ── 持久化:RDB 快照 ─────────────────────
    save 900 1 # 900 秒内有 1 次写操作则触发快照
    save 300 10 # 300 秒内有 10 次写操作则触发快照
    save 60 10000 # 60 秒内有 10000 次写操作则触发快照
    dbfilename dump.rdb # RDB 文件名
    dir /data # 数据文件存储目录(对应容器内挂载路径)

    # ── 持久化:AOF 日志 ─────────────────────
    appendonly yes # 开启 AOF,比 RDB 更安全,推荐开启
    appendfilename "appendonly.aof" # AOF 文件名
    appendfsync everysec # 每秒刷盘一次,兼顾性能和安全
    no-appendfsync-on-rewrite no # AOF 重写期间是否暂停刷盘,no 表示不暂停
    auto-aof-rewrite-percentage 100 # AOF 文件比上次重写后增长 100% 时触发重写
    auto-aof-rewrite-min-size 64mb # AOF 文件至少达到 64MB 才触发重写

    # ── 慢查询日志 ───────────────────────────
    slowlog-log-slower-than 10000 # 记录执行超过 10ms(10000 微秒)的命令
    slowlog-max-len 128 # 慢日志最多保留 128 条

    # ── 日志 ────────────────────────────────
    loglevel notice # 日志级别:debug / verbose / notice / warning
    logfile "" # 空字符串表示输出到标准输出(容器内推荐)

    # ── 其他 ────────────────────────────────
    databases 16 # 数据库数量,默认 16 个(db0 ~ db15)
    hz 10 # 后台任务执行频率,影响过期 key 清理速度

    5.4 PostgreSQL 配置文件说明

    PostgreSQL 的配置文件在数据库首次初始化时自动生成,无法提前手动创建。需要先启动容器,再将配置文件复制到本地,详见 第九节。


    完成后目录结构如下(PostgreSQL 配置文件在第九步补充):

    dev-docker/
    ├── mysql/
    │ ├── data/ # MySQL 数据持久化
    │ └── conf.d/
    │ └── my.cnf # ✅ MySQL 自定义配置
    ├── redis/
    │ ├── data/ # Redis 持久化数据
    │ └── conf/
    │ └── redis.conf # ✅ Redis 自定义配置
    ├── postgres/
    │ ├── data/ # PostgreSQL 数据持久化
    │ └── conf/ # ⏳ 第九步从容器复制配置文件到此处
    ├── kafka/
    │ └── data/ # Kafka 日志数据
    ├── nacos/
    │ └── logs/ # Nacos 运行日志
    ├── cloudbeaver/
    │ └── workspace/ # CloudBeaver 工作区
    ├── mysql-schema.sql # Nacos 初始化 SQL(可选,见第八节)
    └── docker-compose.yml


    六、拉取所需镜像

    可以在 https://hub.docker.com/ 查询最新版本。执行以下命令拉取本文所用镜像:

    docker pull mysql:8.0
    docker pull redis:7-alpine
    docker pull postgres:16
    docker pull nacos/nacos-server:v2.4.0
    docker pull confluentinc/cp-kafka:8.1.2
    docker pull dbeaver/cloudbeaver:latest
    docker pull prom/node-exporter:latest


    七、编写 docker-compose.yml

    在工作目录下创建 docker-compose.yml,内容如下:

    services:

    # ==================== MySQL 数据库 (8.0 版本) ====================
    mysql:
    image: mysql:8.0 # 使用官方 MySQL 8.0 镜像
    container_name: mysqldev # 容器名称设置为 mysql-dev
    restart: unlessstopped # 除非手动停止,否则容器崩溃或 Docker 重启后自动拉起
    environment: # 设置环境变量
    MYSQL_ROOT_PASSWORD: 123456 # 设置 root 用户的初始密码
    MYSQL_DATABASE: nacos_config # 容器启动时自动创建名为 nacos_config 的数据库
    ports: # 端口映射
    "3306:3306" # 将宿主机 3306 映射到容器 3306 端口
    volumes: # 挂载卷配置
    ./mysql/data:/var/lib/mysql # 将数据库数据持久化到本地目录,防止容器删除后数据丢失
    ./mysql/conf.d:/etc/mysql/conf.d # 挂载本地配置目录,用于存放自定义的 .cnf 配置文件
    ./mysqlschema.sql:/dockerentrypointinitdb.d/nacosmysql.sql # 自动初始化脚本:容器首次启动时会执行此 SQL
    command: defaultauthenticationplugin=mysql_native_password # 启动参数:使用传统密码认证插件以兼容旧版客户端
    healthcheck: # 健康检查(供其他服务依赖判断)
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p123456"] # 检查命令:尝试 ping 数据库
    interval: 10s # 每隔 10 秒检查一次
    timeout: 5s # 检查超时时间为 5 秒
    retries: 5 # 连续失败 5 次后认为容器不健康

    # ==================== Nacos 注册中心/配置中心 ====================
    nacos:
    image: nacos/nacosserver:v2.4.0 # 使用 Nacos 2.4.0 官方镜像
    container_name: nacosdev # 容器名称
    restart: unlessstopped # 自动重启策略
    depends_on: # 服务依赖
    mysql: # 依赖 mysql 服务
    condition: service_healthy # 必须等 mysql 健康检查通过后再启动 nacos
    environment: # Nacos 运行时配置项
    MODE: standalone # 运行模式:单机模式
    SPRING_DATASOURCE_PLATFORM: mysql # 指定外部数据源类型为 mysql
    MYSQL_SERVICE_HOST: mysqldev # MySQL 的主机名(对应上面的容器名)
    MYSQL_SERVICE_PORT: 3306 # MySQL 端口
    MYSQL_SERVICE_DB_NAME: nacos_config # Nacos 使用的数据库名
    MYSQL_SERVICE_USER: root # 数据库用户名
    MYSQL_SERVICE_PASSWORD: 123456 # 数据库密码
    NACOS_AUTH_IDENTITY_KEY: nacos # 开启鉴权后的身份标识 key
    NACOS_AUTH_IDENTITY_VALUE: nacos # 开启鉴权后的身份标识 value
    NACOS_AUTH_TOKEN: SecretKey012345678901234567890123456789012345678901234567890123456789 # 鉴权使用的 Token 密钥
    ports: # 端口映射
    "8848:8848" # Nacos 控制台 Web 访问端口
    "9848:9848" # Nacos 2.x 版本的客户端 gRPC 通信端口
    "9849:9849" # Nacos 2.x 版本的服务端 gRPC 通信端口
    volumes: # 挂载卷
    ./nacos/logs:/home/nacos/logs # 将容器内的日志挂载到本地,方便排查问题

    # ==================== Redis 缓存 ====================
    redis:
    image: redis:7alpine # 使用轻量级的 Redis 7 (Alpine Linux) 镜像
    container_name: redisdev # 容器名称
    restart: unlessstopped # 自动重启策略
    ports: # 端口映射
    "6379:6379" # 映射默认 6379 端口
    volumes: # 挂载卷
    ./redis/data:/data # 持久化 Redis 数据库文件
    ./redis/conf/redis.conf:/etc/redis/redis.conf # 挂载本地配置文件到容器内
    command: redisserver /etc/redis/redis.conf # 指定使用挂载的配置文件启动 Redis
    healthcheck: # 健康检查
    test: ["CMD", "redis-cli", "-a", "123456", "ping"] # 检查命令:使用密码 123456 执行 ping
    interval: 10s # 每 10 秒检查一次
    timeout: 3s # 超时时间 3 秒
    retries: 3 # 失败 3 次标记为不健康

    # ==================== PostgreSQL 数据库 ====================
    postgres:
    image: postgres:16 # 使用官方 PostgreSQL 16 镜像
    container_name: postgresdev # 容器名称
    restart: unlessstopped # 自动重启策略
    environment: # 环境变量
    POSTGRES_PASSWORD: 123456 # 设置超级用户 postgres 的密码
    ports: # 端口映射
    "5432:5432" # 映射默认 5432 端口
    volumes: # 挂载卷
    ./postgres/data:/var/lib/postgresql/data # 持久化 PG 数据库数据
    ./postgres/conf/postgresql.conf:/etc/postgresql/postgresql.conf # 挂载主配置文件
    ./postgres/conf/pg_hba.conf:/etc/postgresql/pg_hba.conf # 挂载访问控制配置文件
    command: postgres c config_file=/etc/postgresql/postgresql.conf # 启动参数:指定配置文件路径
    healthcheck: # 健康检查
    test: ["CMD-SHELL", "pg_isready -U postgres"] # 使用内置命令 pg_isready 检查连通性
    interval: 10s # 每 10 秒检查
    timeout: 5s # 超时时间 5 秒
    retries: 5 # 失败重试次数

    # ==================== CloudBeaver (Web 版数据库管理工具) ====================
    cloudbeaver:
    image: dbeaver/cloudbeaver:latest # 使用 DBeaver 官方出品的 Web 版镜像
    container_name: cloudbeaver # 容器名称
    restart: unlessstopped # 自动重启策略
    ports: # 端口映射
    "8978:8978" # Web 访问地址为 http://localhost:8978
    volumes: # 挂载卷
    ./cloudbeaver/workspace:/opt/cloudbeaver/workspace # 持久化保存用户的数据库连接配置和 SQL 脚本

    # ==================== Kafka 消息队列 (KRaft 模式) ====================
    kafka:
    image: confluentinc/cpkafka:8.1.2 # 使用 Confluent 提供的 Kafka 镜像
    container_name: kafkadev # 容器名称
    restart: unlessstopped # 自动重启策略
    ports: # 端口映射
    "9092:9092" # 映射外部客户端访问端口
    volumes: # 挂载卷
    ./kafka/data:/var/lib/kafka/data # 持久化 Kafka 消息数据
    environment: # Kafka 环境变量(KRaft 模式配置)
    KAFKA_NODE_ID: 1 # 节点 ID
    KAFKA_PROCESS_ROLES: broker,controller # 本节点同时担任消息代理(broker)和控制器(controller)
    KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafkadev:9093 # 集群控制器投票者配置
    KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 # 定义内部和外部监听器
    KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092 # 暴露给宿主机的地址,Windows 本地代码连接用 localhost
    KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT # 定义监听器的协议映射
    KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER # 指定控制器监听器名称
    KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 # 偏移量主题副本数(单机设为 1)
    KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 # 事务日志最小同步副本数
    KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 # 事务日志副本数
    KAFKA_LOG_DIRS: /var/lib/kafka/data # 消息日志存储目录
    healthcheck: # 健康检查
    test: ["CMD-SHELL", "kafka-topics –bootstrap-server localhost:9092 –list"] # 检查命令:尝试列出 topic
    interval: 15s # 每 15 秒检查一次
    timeout: 10s # 超时时间 10 秒
    retries: 5 # 失败重试次数
    start_period: 30s # 容器启动后等待 30 秒再开始检查(Kafka 启动慢)

    # ==================== Node Exporter (指标采集) ====================
    node-exporter:
    image: prom/nodeexporter:latest # 使用 Prometheus 官方节点采集镜像
    container_name: nodeexporter # 容器名称
    restart: unlessstopped # 自动重启策略
    ports: # 端口映射
    "9100:9100" # 暴露指标采集端口,Prometheus 可通过该端口抓取数据

    # ==================== 网络配置 ====================
    networks:
    default: # 默认网络配置
    name: devnetwork # 自定义网络名称为 dev-network,所有服务均在此网络下


    八、Nacos 数据库初始化(可选)

    如果只是简单体验 Nacos,可跳过此步,Nacos 将使用内置的 Derby 数据库,但重启后配置不会持久化。 若需要配置持久化到 MySQL,则必须执行此步骤。

    步骤:

  • 前往 https://github.com/alibaba/nacos/releases 下载与镜像版本一致的 Nacos Server 安装包(本文为 v2.4.0)
  • 解压后在 conf/ 目录中找到 mysql-schema.sql
  • 将该文件复制到工作目录(与 docker-compose.yml 同级),命名为 mysql-schema.sql
  • MySQL 容器首次启动时会自动执行该 SQL 脚本完成初始化。

    如果不使用 MySQL 持久化,记得删除或注释掉 docker-compose.yml 中 MySQL 的 SQL 挂载行,以及 Nacos 的数据源相关环境变量:

    # MySQL volumes 中注释掉:
    # – ./mysql-schema.sql:/docker-entrypoint-initdb.d/nacos-mysql.sql

    # Nacos environment 中注释掉:
    # SPRING_DATASOURCE_PLATFORM: mysql
    # MYSQL_SERVICE_HOST: mysql-dev
    # …


    九、初始化 PostgreSQL 配置文件

    由于 PostgreSQL 的配置文件在数据库首次初始化时自动生成,需要先临时启动 PostgreSQL,将配置文件复制到本地,再完整启动所有服务。

    第一步:临时注释配置文件挂载

    将 docker-compose.yml 中 PostgreSQL 的配置文件挂载和 command 行临时注释掉:

    postgres:

    volumes:
    ./postgres/data:/var/lib/postgresql/data
    # – ./postgres/conf/postgresql.conf:/etc/postgresql/postgresql.conf # 暂时注释
    # – ./postgres/conf/pg_hba.conf:/etc/postgresql/pg_hba.conf # 暂时注释
    # command: postgres -c config_file=/etc/postgresql/postgresql.conf # 暂时注释

    单独启动 PostgreSQL:

    docker-compose up -d postgres

    第二步:复制配置文件到本地

    等待容器启动后执行:

    docker cp postgres-dev:/var/lib/postgresql/data/postgresql.conf ./postgres/conf/postgresql.conf
    docker cp postgres-dev:/var/lib/postgresql/data/pg_hba.conf ./postgres/conf/pg_hba.conf

    第三步:恢复配置并重启

    将 docker-compose.yml 中刚才注释掉的三行取消注释,恢复为完整配置,然后重建 PostgreSQL 容器:

    docker-compose up -d postgres

    此后 PostgreSQL 将读取本地的配置文件启动。如需调整配置,直接编辑 postgres/conf/postgresql.conf 并重启容器即可。


    十、启动服务

    完成以上所有准备工作后,在工作目录下执行:

    # 后台启动所有服务
    docker-compose up -d

    # 查看各服务运行状态
    docker-compose ps

    # 查看某个服务的日志(以 nacos 为例)
    docker-compose logs -f nacos

    停止服务:

    # 停止并保留数据
    docker-compose down

    # 停止并清除所有数据卷(慎用!数据将丢失)
    docker-compose down -v


    十一、访问各服务

    服务访问地址账号 / 密码
    CloudBeaver(Web 数据库管理) http://localhost:8978 首次启动自行设置
    Nacos(配置 & 注册中心) http://localhost:8848/nacos nacos / nacos
    MySQL localhost:3306 root / 123456
    Redis localhost:6379 密码:123456
    PostgreSQL localhost:5432 postgres / 123456
    Kafka localhost:9092 无认证
    Node Exporter(监控指标) http://localhost:9100/metrics

    附:持久化总览

    服务本地数据目录本地配置文件
    MySQL mysql/data/ mysql/conf.d/my.cnf
    Redis redis/data/ redis/conf/redis.conf
    PostgreSQL postgres/data/ postgres/conf/postgresql.conf / pg_hba.conf
    Kafka kafka/data/ 通过环境变量配置,无独立文件
    Nacos 通过环境变量配置,日志在 nacos/logs/
    CloudBeaver cloudbeaver/workspace/

    附:常用 Docker 命令速查

    # 查看所有运行中的容器
    docker ps

    # 进入容器内部(以 mysql-dev 为例)
    docker exec -it mysql-dev bash

    # 查看容器日志
    docker logs -f <容器名>

    # 修改配置后重启某个服务
    docker-compose restart <服务名>

    # compose 文件有改动时,重新创建并启动某个服务
    docker-compose up -d <服务名>


    提示: 所有数据与配置文件均已挂载到本地目录,删除容器不会导致数据丢失。如需彻底重置某个服务,停止容器后手动清空对应的 data/ 目录,再重新启动即可。

    附:更换电脑数据完整迁移

    由于数据和配置全部在本地工作目录中,迁移的核心就是复制这个目录。

    旧电脑:打包迁移

    先停止所有服务,确保数据完整写入磁盘:

    docker-compose down

    然后将整个工作目录打包,通过移动硬盘或网盘传输到新电脑。

    如果新电脑网络不好,可以顺带导出镜像一并带走:

    docker save \\
    mysql:8.0 redis:7-alpine postgres:16 \\
    nacos/nacos-server:v2.4.0 confluentinc/cp-kafka:8.1.2 \\
    dbeaver/cloudbeaver:latest prom/node-exporter:latest \\
    -o all-images.tar

    新电脑:恢复启动

  • 安装 Docker Desktop,参考本文第一至四节完成基础配置
  • 将工作目录解压到目标路径(建议与旧电脑路径一致,无需改任何配置)
  • 导入镜像(如果导出了的话),或直接重新 docker pull:
  • # 离线导入
    docker load -i all-images.tar

    # 或重新拉取
    docker pull mysql:8.0 && docker pull redis:7-alpine # …

  • 进入工作目录,直接启动:
  • docker-compose up -d

    各服务会直接读取原来的数据目录和配置文件,启动后数据与迁移前完全一致。

    注意: Nacos 如果使用的是内置 Derby 数据库(非 MySQL 持久化模式),配置数据存储在容器内部,迁移前需在 Nacos 控制台手动导出配置,到新环境后再导入。使用 MySQL 持久化模式则无此问题,数据随 MySQL 一起迁移。

    赞(0)
    未经允许不得转载:171主机测评 » windows本地开发环境搭建指南:Docker + 常用中间件一键部署
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址