背景
记录如何在本机 macOS(M1芯片)上安装 Docker,并通过 Docker 快速搭建 Redis + RabbitMQ + Nacos 开发环境。
1. 安装 Docker Desktop for Mac(Apple Silicon)
步骤
- 访问 Docker 官网。
- 点击「Download for Mac (Apple Chip)」下载适配 M1/M2 的版本。
- 安装并启动 Docker Desktop,首次启动会要求授权网络与文件访问,允许即可。
- 打开终端验证 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
|
启动服务:
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
14
|
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用户进入容器
docker cp my-container:/app/logs/app.log /home/user/backup/ # 拷贝容器中的文件到本地
|
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 服务名 ≠ 容器名称,但默认情况服务名和容器名称是一致的前缀
- 服务名来自于 Compose 文件中
services
下的键名
下面的 Compose 文件中:
1
2
3
4
|
services:
mysql:
image: mysql:8.0
...
|
这里的 mysql
,就是 服务名,也是 Docker Compose 在内部网络中注册的 DNS 主机名。也就是说,其他容器访问这个服务时用的就是 mysql
这个名字。
- 容器名称(Container Name)是 Docker 为每个服务生成的容器实际名字,一般是:
比如容器名是:
这个名字是由 Compose 自动生成的,表示:
- 项目名(一般来源于目录名)是
docker
- 服务名是
mysql
- 第一个实例是
1
但这只是容器的实际名称,不是网络通信的主机名。
结语
至此,Redis + RabbitMQ + Nacos 的本地开发环境就搭建完成了!可以直接在 Spring Boot 项目中连接这些服务,进行异步处理、缓存与配置中心的实战开发。