背景

记录如何在本机 macOS(M1芯片)上安装 Docker,并通过 Docker 快速搭建 Redis + RabbitMQ + Nacos 开发环境

1. 安装 Docker Desktop for Mac(Apple Silicon)

步骤

  1. 访问 Docker 官网
  2. 点击「Download for Mac (Apple Chip)」下载适配 M1/M2 的版本。
  3. 安装并启动 Docker Desktop,首次启动会要求授权网络与文件访问,允许即可。
  4. 打开终端验证 Docker 是否可用:
1
2
docker -v
docker compose version

如果正常输出版本号,说明 Docker 安装成功。

2. 使用 docker-compose 搭建 Redis + RabbitMQ + Nacos

创建一个项目目录并添加 docker-compose.yml 文件:

1
2
mkdir dev-env && cd dev-env
touch docker-compose.yml

推荐配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
version: '3.9'
services:
  redis:
    image: redis:7.2
    container_name: dev-redis
    ports:
      - "6379:6379"
    restart: always

  rabbitmq:
    image: rabbitmq:3.12-management
    container_name: dev-rabbitmq
    ports:
      - "5672:5672"     # 消息端口
      - "15672:15672"   # 管理界面端口
    restart: always
    environment:
      RABBITMQ_DEFAULT_USER: guest
      RABBITMQ_DEFAULT_PASS: guest

  nacos:
    image: nacos/nacos-server:v2.3.0
    container_name: dev-nacos
    ports:
      - "8848:8848"
      - "9848:9848" # gRPC端口,必选
    restart: always
    environment:
      MODE: standalone
      SPRING_DATASOURCE_PLATFORM: embedded

启动服务:

1
docker compose up -d

3. 服务验证

Redis

1
2
3
docker exec -it redis redis-cli
ping
# 输出 PONG 表示正常

RabbitMQ

Nacos

4. 容器管理常用命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
docker ps            # 查看容器状态
docker images        # 查看镜像
docker stop containerName # 停止 nacos 容器
docker start containerName # 启动 nacos 容器
docker logs -f containerName # 查看日志
docker compose down  # 停止并移除容器
docker cp file containerName:/path # 拷贝文件到容器
docker exec -it containerName bash # 进入容器
docker rm containerName # 删除容器
docker restart containerName # 重启容器
docker exec -it containerNameA ping serviceName # 测试容器A是否能ping通容器B的serviceName
docker logs -f containerName  #实时日志追踪
docker exec -it -u root jenkins bash # 以root用户进入容器

5. Docker 网络隔离概念

两个 docker-compose.yml 文件(A 和 B)默认是相互隔离的

如果分别运行了:

1
2
3
4
5
# 启动 A 项目
docker-compose -f docker-compose-a.yml up -d

# 启动 B 项目
docker-compose -f docker-compose-b.yml up -d

那么:

  • A 项目和 B 项目会各自创建独立的 Docker 网络(比如 a_default, b_default)。
  • 所以: A 中的容器不能通过服务名访问 B 中的容器(除非你显式地让它们加入同一个网络)

解决方法:让两个 compose 项目加入同一个自定义网络

步骤 1:创建一个共享网络(只需要执行一次)

1
docker network create shared-network

步骤 2:在 A 和 B 的 docker-compose.yml 中都添加网络配置

docker-compose-a.yml 示例:

1
2
3
4
5
6
7
8
9
services:
  a-service:
    image: your-a-image
    networks:
      - shared-net

networks:
  shared-net:
    external: true  # 表示使用外部已存在的 network(不是本 compose 创建的)

docker-compose-b.yml 示例:

1
2
3
4
5
6
7
8
9
services:
  b-service:
    image: your-b-image
    networks:
      - shared-net

networks:
  shared-net:
    external: true

这样就实现了:

  • A 和 B 项目虽然是不同的 compose 文件
  • 但它们的容器都加入了同一个网络(shared-network
  • 所以:

A 中的服务可以通过服务名(如 b-service)访问 B 中的服务,反之亦然

访问方式举例

假设:

  • A 中的服务叫 a-service
  • B 中的服务叫 b-service

那么在任意一个容器中:

1
2
ping b-service
curl http://b-service:端口号/...

就可以成功访问了

6. 容器名称与服务名称

Compose 服务名 ≠ 容器名称,但默认情况服务名和容器名称是一致的前缀

  1. 服务名来自于 Compose 文件中 services 下的键名

下面的 Compose 文件中:

1
2
3
4
services:
  mysql:
    image: mysql:8.0
    ...

这里的 mysql,就是 服务名,也是 Docker Compose 在内部网络中注册的 DNS 主机名。也就是说,其他容器访问这个服务时用的就是 mysql 这个名字

  1. 容器名称(Container Name)是 Docker 为每个服务生成的容器实际名字,一般是:
1
<项目名>_<服务名>_<序号>

比如容器名是:

1
docker-mysql-1

这个名字是由 Compose 自动生成的,表示:

  • 项目名(一般来源于目录名)是 docker
  • 服务名是 mysql
  • 第一个实例是 1

但这只是容器的实际名称,不是网络通信的主机名

结语

至此,Redis + RabbitMQ + Nacos 的本地开发环境就搭建完成了!可以直接在 Spring Boot 项目中连接这些服务,进行异步处理、缓存与配置中心的实战开发。