MacBook 2025 M4 笔记本 Docker 本地微服务环境完整部署指南
本指南旨在为基于 Apple Silicon M4 架构的 MacBook 提供一套轻量、稳定、易于调试的本地微服务底座(包含 MySQL、Redis、Nacos 与 RocketMQ)。配置已针对 Mac 本地资源占用和 IDEA 宿主机直连调试进行了优化。
第一步:构建最佳目录结构
为了避免 Docker 挂载数据卷时出现路径混乱或无权限(Permission Denied)的问题,我们需要预先在宿主机上创建好标准的工作空间和数据挂载目录。
请打开 Mac 终端,复制并一次性执行以下完整脚本,它将为您建立 ~/mac-dev-env 工作主目录以及所有依赖的子文件夹:
# 1. 创建并进入你的本地微服务环境主工作目录mkdir -p ~/mac-dev-envcd ~/mac-dev-env
# 2. 在当前目录下,创建 MySQL、Redis 的数据挂载目录,以及 RocketMQ 的配置目录mkdir -p ./data/mysqlmkdir -p ./data/redismkdir -p ./rocketmq
# 3. 创建 Nacos 的数据与日志挂载目录(用于持久化,避免 docker compose down 后丢配置)mkdir -p ./data/nacos/datamkdir -p ./data/nacos/logs
# 4. 创建 RocketMQ 特殊的绝对路径数据目录(存放日志和持久化存储)mkdir -p ~/docker-data/rocketmq/{logs,store}执行完毕后,您的核心工作目录已就绪,且 Nacos/RocketMQ 所需的数据挂载目录也已创建完成。
第二步:配置环境变量文件(推荐)
为了让编排文件更易维护,同时避免启动时出现环境变量缺失提示,建议在工作根目录创建 .env 文件统一管理变量。
请在 ~/mac-dev-env 下创建文件 .env,并写入以下内容:
cd ~/mac-dev-env
cat > .env <<'EOF'MYSQL_ROOT_PASSWORD=lsdfsdf!@#TZ=Asia/ShanghaiEOF第三步:配置 RocketMQ(本地直连优化版)
为了让宿主机(您的 Mac)上运行的 IDEA 能够直连 RocketMQ 容器收发消息,我们需要一份定制化的 Broker 配置。
请创建文件 ~/mac-dev-env/rocketmq/broker.conf,并将以下完整配置粘贴进去:
brokerClusterName = DefaultClusterbrokerName = broker-abrokerId = 0
deleteWhen = 04fileReservedTime = 48brokerRole = ASYNC_MASTERflushDiskType = ASYNC_FLUSH
# ---- 开发环境优化 ----autoCreateTopicEnable = trueautoCreateSubscriptionGroup = true
# 容器内 namesrv 地址(容器里不能写 127.0.0.1)namesrvAddr = rocketmq-namesrv:9876
# 减少内存映射文件大小mapedFileSizeCommitLog = 268435456mapedFileSizeConsumeQueue = 2097152
# 数据目录(映射到宿主机 ${HOME}/docker-data/rocketmq/store)storePathRootDir=/home/rocketmq/storestorePathCommitLog=/home/rocketmq/store/commitlogstorePathConsumeQueue=/home/rocketmq/store/consumequeuestorePathIndex=/home/rocketmq/store/indexstoreCheckpoint=/home/rocketmq/store/checkpointabortFile=/home/rocketmq/store/abort
# 宿主机 IDEA 跑客户端:broker 宣告 127.0.0.1 最稳brokerIP1=127.0.0.1第四步:配置 Docker Compose 核心编排文件
请在工作根目录下创建文件 ~/mac-dev-env/docker-compose.yml,并将以下完整内容粘贴进去:
services: mysql: image: mysql:8.4 container_name: dev-mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_ROOT_HOST: '%' MYSQL_DATABASE: micro_platform TZ: ${TZ} command: [ "mysqld", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_general_ci", "--default-time-zone=+08:00", "--innodb-buffer-pool-size=256M", "--max-connections=200" ] ports: - "127.0.0.1:3306:3306" volumes: - ./data/mysql:/var/lib/mysql healthcheck: test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -uroot -p\"${MYSQL_ROOT_PASSWORD}\" --silent"] interval: 10s timeout: 5s retries: 10 networks: - devnet
redis: image: redis:7.4-alpine container_name: dev-redis restart: unless-stopped command: ["redis-server", "--save", "60", "1", "--loglevel", "warning"] ports: - "127.0.0.1:6379:6379" volumes: - ./data/redis:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 10 networks: - devnet
nacos: image: nacos/nacos-server:v2.4.3-slim container_name: dev-nacos restart: unless-stopped environment: MODE: standalone NACOS_AUTH_ENABLE: "false" JVM_XMS: "256m" JVM_XMX: "256m" JVM_XMN: "128m" PREFER_HOST_MODE: hostname ports: - "127.0.0.1:8848:8848" - "127.0.0.1:9848:9848" - "127.0.0.1:9849:9849" volumes: - ./data/nacos/data:/home/nacos/data - ./data/nacos/logs:/home/nacos/logs networks: - devnet
rocketmq-namesrv: image: apache/rocketmq:5.3.4 container_name: dev-rmq-namesrv restart: unless-stopped command: ["sh", "mqnamesrv"] environment: JAVA_OPT_EXT: "-Xms256m -Xmx256m -Xmn128m -XX:MaxDirectMemorySize=128m" ports: - "127.0.0.1:9876:9876" volumes: - ${HOME}/docker-data/rocketmq/logs:/home/rocketmq/logs networks: - devnet
rocketmq-broker: image: apache/rocketmq:5.3.4 container_name: dev-rmq-broker restart: unless-stopped depends_on: - rocketmq-namesrv command: ["sh", "mqbroker", "-c", "/home/rocketmq/rocketmq-5.3.4/conf/broker.conf"] environment: NAMESRV_ADDR: "rocketmq-namesrv:9876" JAVA_OPT_EXT: "-Xms512m -Xmx512m -Xmn256m -XX:MaxDirectMemorySize=256m" ports: - "127.0.0.1:10909:10909" - "127.0.0.1:10911:10911" - "127.0.0.1:10912:10912" volumes: - ./rocketmq/broker.conf:/home/rocketmq/rocketmq-5.3.4/conf/broker.conf - ${HOME}/docker-data/rocketmq/logs:/home/rocketmq/logs - ${HOME}/docker-data/rocketmq/store:/home/rocketmq/store networks: - devnet
networks: devnet: driver: bridge说明: MySQL 限制 buffer pool,Nacos 单机免鉴权并做数据持久化,RocketMQ 使用宿主机绝对路径持久化
store/logs。
第五步:镜像拉取与一键启动
请确保终端路径处于 ~/mac-dev-env,并且 Docker Desktop 已启动。
建议按以下顺序启动(先拉镜像、再启动容器):
cd ~/mac-dev-env
docker compose downdocker compose pulldocker compose up -ddocker compose ps第六步:Docker Desktop 常用设置(拉取镜像失败时必看)
在网络环境不稳定、存在代理/VPN、或镜像拉取频繁中断时,可能出现拉取层文件失败的情况。遇到此类问题时,建议检查 Docker Desktop 的通用设置项,完成后重启 Docker Desktop 再重新执行 docker compose pull。
另外建议在拉取失败时先单独拉取一个轻量镜像用于验证网络链路:
docker pull redis:7.4-alpine第七步:IDEA / 宿主机直连关键地址
| 服务 | 地址 | 备注 |
|---|---|---|
| MySQL | 127.0.0.1:3306 | 用户 root,密码 lsdfsdf!@# |
| Redis | 127.0.0.1:6379 | 无密码 |
| Nacos 控制台 | http://127.0.0.1:8848/nacos | 免鉴权 |
| RocketMQ NameServer | 127.0.0.1:9876 | — |
| RocketMQ Broker | 127.0.0.1:10911 | 由 brokerIP1=127.0.0.1 决定 |
第八步:常用排查命令
当服务启动异常或端口不可用时,可使用以下命令快速定位:
cd ~/mac-dev-env
# ---------------------------# 1) 查看服务状态(推荐)# ---------------------------docker compose ps
# ---------------------------# 2) 查看日志(推荐)# ---------------------------# 看某个服务日志(推荐:定位单点问题最清晰)docker compose logs -f --tail=200 mysqldocker compose logs -f --tail=200 redisdocker compose logs -f --tail=200 nacosdocker compose logs -f --tail=200 rocketmq-namesrvdocker compose logs -f --tail=200 rocketmq-broker
# 看全部服务日志(推荐:不确定是哪个服务时)docker compose logs -f --tail=200
# ---------------------------# 3) 启动 / 停止 / 重启(编排级别)# ---------------------------
# 启动(推荐:日常启动)docker compose up -d
# 停止(推荐:临时停一下,后续还要继续用)docker compose stop
# 重启全部服务(推荐:配置没变,只是服务状态不对/想快速恢复)docker compose restart
# 重启单个服务(推荐:只影响一个组件)# 示例:只重启 mysqldocker compose restart mysql
# 停止并移除容器(推荐:你改了 docker-compose.yml 或挂载配置,需要“重建容器”)# 注意:不带 -v 不会删除你挂载到宿主机的数据目录docker compose downdocker compose up -d
# ---------------------------# 4) Docker Desktop 启动 / 重启(macOS)# ---------------------------
# 启动 Docker Desktop(推荐:Docker 没开时)open -a Docker
# 重启 Docker Desktop(推荐:遇到 pull EOF、网络异常、Docker 引擎卡住等)osascript -e 'quit app "Docker"'open -a Docker
# 关闭 Docker Desktop(不推荐常用;相当于停止 Docker 引擎)osascript -e 'quit app "Docker"'
# ---------------------------# 5) 进入容器排查(推荐:需要看容器内文件/配置/进程时)# ---------------------------docker exec -it dev-mysql bashdocker exec -it dev-redis shdocker exec -it dev-nacos shdocker exec -it dev-rmq-broker sh