一、如何运行这个 docker-compose
运行一个 docker-compose
文件非常简单,前提是你已经安装了 Docker 和 Docker Compose。以下是步骤:
-
确保环境准备就绪:
- 安装 Docker:
sudo apt install docker.io
(Linux 示例) - 安装 Docker Compose:
sudo apt install docker-compose
(Linux 示例) - 验证安装:
docker --version
和docker-compose --version
- 安装 Docker:
-
准备文件和目录:
docker-compose.yml
保存到一个目录中(例如TestProject
)。- 创建必要的挂载目录(如
./mysql/data
、./minio/data
等)。这些目录在volumes
中定义,用于持久化数据。如果不创建,Docker 会自动创建,但可能权限不够。
-
运行
docker-compose
:-
进入文件所在目录:
cd TestProject
-
执行启动命令:
docker-compose up -d
-d
表示后台运行。
-
检查运行状态:
docker-compose ps
-
查看日志:
docker-compose logs
(或针对某个服务,如docker-compose logs TestProject-mysql
)
-
-
停止和清理:
- 停止服务:
docker-compose down
- 删除容器和网络(保留数据卷):
docker-compose down
- 删除数据卷(彻底清理):
docker-compose down -v
- 停止服务:
二、这个 docker-compose
包含了什么?是否包含中间件和微服务?
docker-compose.yml
文件来看:
-
包含的内容:
- 这个文件定义了多个服务,包括 MySQL、Redis、MinIO、Nacos、Seata、Elasticsearch、Kibana、Canal、RocketMQ(NameServer、Broker、Console)等。
- 这些服务都是中间件,用于支持微服务架构(如数据库、消息队列、配置中心、分布式事务等)。
- 没有直接包含微服务。微服务通常是你的业务代码(例如 Spring Boot 应用),需要单独定义并通过镜像或构建方式加入。
-
结论:
- 这个
docker-compose
是为微服务项目提供基础设施支持的中间件集合,但不包含具体的微服务业务逻辑。 - 如果你想部署一个完整的微服务项目,还需要添加你的微服务(例如
TestProject-user-service
、TestProject-order-service
等)。
- 这个
三、部署微服务项目需要写哪些部分?
要部署一个微服务项目,通常需要以下部分:
-
中间件:
- 数据库(如 MySQL、Redis)
- 配置中心(如 Nacos)
- 消息队列(如 RocketMQ)
- 对象存储(如 MinIO)
- 分布式事务管理(如 Seata)
- 日志和搜索(如 Elasticsearch、Kibana)
- 数据同步(如 Canal)
-
微服务:
- 业务代码(例如用 Spring Boot 编写)
- Dockerfile(用于构建微服务镜像)
- 服务之间的依赖关系(通过
depends_on
或网络配置)
-
网络配置:
- 定义 Docker 网络(如
rocketmq
网络)以确保服务间通信。
- 定义 Docker 网络(如
-
持久化存储:
- 数据卷(
volumes
)用于保存数据库、日志等数据。
- 数据卷(
-
环境变量:
- 配置中间件和服务所需的参数(如数据库密码、IP 地址)。
四、在 docker-compose
中配置中间件和服务的内容
4.1 中间件配置
中间件是为微服务提供支持的基础设施,需要配置端口、持久化存储、环境变量等。
配置项 | 说明 | 示例(从你的文件) |
---|---|---|
image |
指定中间件镜像 | mysql:8.0 |
container_name |
容器名称,便于管理 | TestProject-mysql |
restart |
重启策略(always 表示总是重启) |
restart: always |
ports |
映射宿主机和容器的端口 | 3306:3306 |
volumes |
数据持久化挂载路径 | ./mysql/data:/var/lib/mysql |
environment |
环境变量(如密码、配置参数) | MYSQL_ROOT_PASSWORD=root |
depends_on |
依赖关系,确保启动顺序 | depends_on: TestProject-mysql |
command |
覆盖默认启动命令 | server /data (MinIO 示例) |
4.2 微服务配置
微服务是你自己的业务代码,通常需要自定义镜像并依赖中间件。
配置项 | 说明 | 示例(假设添加一个微服务) |
---|---|---|
image |
指定微服务镜像(可通过 Dockerfile 构建) | TestProject-user-service:latest |
build |
本地构建镜像(替代 image ) |
build: ./user-service |
container_name |
容器名称 | TestProject-user-service |
restart |
重启策略 | restart: always |
ports |
暴露微服务端口 | 8080:8080 |
volumes |
挂载配置文件或日志 | ./user-service/logs:/app/logs |
environment |
配置微服务依赖的中间件地址、端口等 | SPRING_DATASOURCE_URL=jdbc:mysql://TestProject-mysql:3306/db |
depends_on |
依赖的中间件 | depends_on: [TestProject-mysql, TestProject-nacos] |
五、Mermaid 思维导图
以下是用 Mermaid 绘制的思维导图,展示 docker-compose
的结构和配置要点:
makefile
Docker-Compose 配置
中间件
微服务
网络配置
镜像: image
端口: ports
数据卷: volumes
环境变量: environment
依赖: depends_on
重启策略: restart
镜像: image 或 build
端口: ports
数据卷: volumes
环境变量: environment
依赖: depends_on
重启策略: restart
网络名称: networks
驱动: driver
别名: aliases
六、如何扩展这个 docker-compose
添加微服务
假设你有一个微服务 TestProject-user-service
,可以用以下方式添加到 docker-compose.yml
:
yaml
version: "3.5"
services:
# 已有中间件配置保持不变...
TestProject-user-service:
image: TestProject-user-service:latest # 假设你已构建镜像
# build: ./user-service # 如果需要本地构建,替换 image
container_name: TestProject-user-service
restart: always
ports:
- 8080:8080
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://TestProject-mysql:3306/TestProject_db
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=root
- NACOS_SERVER_ADDR=TestProject-nacos:8848
depends_on:
- TestProject-mysql
- TestProject-nacos
volumes:
- ./user-service/logs:/app/logs
networks:
- rocketmq # 如果需要与 RocketMQ 通信
networks:
rocketmq:
name: rocketmq
driver: bridge
yaml
version: "3.5"
services:
TestProject-mysql:
image: mysql:8.0
container_name: TestProject-mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=root
ports:
- 3306:3306
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/my.cnf:/etc/mysql/my.cnf
- ./mysql/initdb:/docker-entrypoint-initdb.d
- ./mysql/mysql-files:/var/lib/mysql-files
TestProject-minio:
image: minio/minio:RELEASE.2021-06-17T00-10-46Z
container_name: TestProject-minio
restart: always
command: server /data
ports:
- 9000:9000
volumes:
- ./minio/data:/data
environment:
- MINIO_ROOT_USER=admin
- MINIO_ROOT_PASSWORD=admin123456
TestProject-redis:
image: redis:6.2
container_name: TestProject-redis
restart: always
ports:
- 6379:6379
TestProject-nacos:
image: nacos/nacos-server:2.0.2
container_name: TestProject-nacos
restart: always
depends_on:
- TestProject-mysql
ports:
- 8848:8848
- 9848:9848
- 9849:9849
environment:
- JVM_XMS=256m
- JVM_XMX=256m
- MODE=standalone
- PREFER_HOST_MODE=hostname
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=192.168.1.46
- MYSQL_SERVICE_DB_NAME=TestProject_nacos
- MYSQL_SERVICE_USER=root
- MYSQL_SERVICE_PASSWORD=root
volumes:
- ./nacos/logs:/home/nacos/logs
TestProject-seata:
image: seataio/seata-server:1.4.2
container_name: TestProject-seata
restart: always
depends_on:
- TestProject-mysql
- TestProject-nacos
ports:
- 8091:8091
environment:
- SEATA_IP=192.168.1.46
- SEATA_CONFIG_NAME=file:/root/seata-config/registry
volumes:
- ./seata:/root/seata-config
TestProject-elasticsearch:
image: elasticsearch:7.13.2
container_name: TestProject-elasticsearch
restart: always
ports:
- 9200:9200
- 9300:9300
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms512m -Xmx512m
volumes:
- ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- ./elasticsearch/data:/usr/share/elasticsearch/data
- ./elasticsearch/plugins:/usr/share/elasticsearch/plugins
TestProject-kibana:
image: kibana:7.13.2
container_name: TestProject-kibana
restart: always
ports:
- 5601:5601
links:
- TestProject-elasticsearch:elasticsearch
depends_on:
- TestProject-elasticsearch
TestProject-canal:
image: canal/canal-server:v1.1.5
container_name: TestProject-canal
restart: always
ports:
- 11111:11111
environment:
- SEATA_IP=192.168.1.46
volumes:
- ./canal/conf/example:/home/admin/canal-server/conf/example
- ./canal/conf/canal.properties:/home/admin/canal-server/conf/canal.properties
- ./canal/logs:/home/admin/canal-server/logs
TestProject-rocketmq-namesrv:
image: foxiswho/rocketmq:4.8.0
container_name: TestProject-rocketmq-namesrv
restart: always
ports:
- 9876:9876
volumes:
- ./rocketmq/namesrv/logs:/home/rocketmq/logs
- ./rocketmq/namesrv/store:/home/rocketmq/store
environment:
JAVA_OPT_EXT: "-Duser.home=/home/rocketmq -Xms512M -Xmx512M -Xmn128m"
command: ["sh","mqnamesrv"]
networks:
rocketmq:
aliases:
- TestProject-rocketmq-namesrv
TestProject-rocketmq-broker:
image: foxiswho/rocketmq:4.8.0
container_name: TestProject-rocketmq-broker
restart: always
ports:
- 10909:10909
- 10911:10911
volumes:
- ./rocketmq/broker/logs:/home/rocketmq/logs
- ./rocketmq/broker/store:/home/rocketmq/store
- ./rocketmq/broker/conf/broker.conf:/etc/rocketmq/broker.conf
environment:
JAVA_OPT_EXT: "-Duser.home=/home/rocketmq -Xms512M -Xmx512M -Xmn128m"
command: ["sh","mqbroker","-c","/etc/rocketmq/broker.conf","-n","TestProject-rocketmq-namesrv:9876","autoCreateTopicEnable=true"]
depends_on:
- TestProject-rocketmq-namesrv
networks:
rocketmq:
aliases:
- TestProject-rocketmq-broker
TestProject-rocketmq-console:
image: styletang/rocketmq-console-ng
container_name: TestProject-rocketmq-console
restart: always
ports:
- 8180:8080
environment:
JAVA_OPTS: "-Drocketmq.namesrv.addr=TestProject-rocketmq-namesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false"
depends_on:
- TestProject-rocketmq-namesrv
networks:
rocketmq:
aliases:
- TestProject-rocketmq-console
networks:
rocketmq:
name: rocketmq
driver: bridge